Opciones de análisis de datos fuera del núcleo


18

He estado usando SAS profesionalmente durante casi 5 años. Lo tengo instalado en mi computadora portátil y con frecuencia tengo que analizar conjuntos de datos con 1,000-2,000 variables y cientos de miles de observaciones.

He estado buscando alternativas a SAS que me permitan realizar análisis en conjuntos de datos de tamaño similar. Tengo curiosidad por saber qué usan otras personas para situaciones como esta. Esto ciertamente no es "Big Data" en la forma en que se usa hoy. Mis conjuntos de datos tampoco son lo suficientemente pequeños como para guardarlos en la memoria. Necesito una solución que pueda aplicar algoritmos a los datos almacenados en un disco duro. Estas son las cosas que he investigado en vano:

  1. R - BigMemory puede crear matrices almacenadas fuera de la memoria, pero los elementos tienen que ser del mismo modo. Trabajo con datos que se dividen casi en un 50/50 entre caracteres y numéricos. El paquete FF se acerca a lo que necesito, pero no entiendo qué procedimientos son compatibles con él. Creo que el soporte es algo limitado.
  2. Pandas: estaba muy entusiasmado con una alternativa Pythonic a R. Sin embargo, también tiene que guardar todos los datos en la memoria.
  3. Revolución R: esta muestra bastante prometedora. Tengo una copia en la computadora de mi casa (gratis si te registras en Kaggle) y todavía tengo que probarla como una alternativa viable a SAS. Los comentarios sobre Revolution R como alternativa SAS son muy apreciados.

Gracias

ACTUALIZACIÓN 1

Edición para agregar que estoy buscando soluciones prácticas y de la vida real que las personas hayan utilizado con éxito. En su mayor parte, SAS me permite buscar archivos grandes sin preocuparme un poco por las limitaciones de memoria. Independientemente de cómo se implemente SAS, descubrieron cómo hacer que la administración de memoria sea transparente para el usuario. Pero, con gran pesar, utilicé SAS para mi trabajo (tengo que hacerlo) y ME ENCANTARÍA una alternativa de software libre que me permita trabajar en datos "grandes" sin tener que pensar demasiado sobre dónde se encuentran los datos en un tiempo específico (en memoria o en disco).

Las cosas más cercanas que he encontrado son el paquete FF de R y algo en el horizonte para Python llamado Blaze . Y sin embargo, estos problemas han existido durante muchos años, entonces, ¿qué han estado haciendo los analistas mientras tanto? ¿Cómo manejan estos mismos problemas con los límites de memoria? La mayoría de las soluciones en oferta parecen ser:

  • Obtenga más RAM: esta no es una buena solución, en mi opinión. Es fácil encontrar un conjunto de datos que puede exceder la RAM y aún así caber en un disco duro. Además, el flujo de trabajo tiene que acomodar todas las estructuras que se crean durante el análisis exploratorio de datos.
  • Subconjunto de los datos: esto está bien para la exploración, pero no para finalizar resultados e informes. Eventualmente, cualquier proceso que se desarrolle en un subconjunto tendrá que aplicarse a todo el conjunto de datos (en mi caso, de todos modos).
  • Agrupe los datos: esto es de lo que me gustaría saber más acerca de las personas que realmente implementan este flujo de trabajo. Como se hace ¿Con que herramientas? ¿Se puede hacer de manera transparente para el usuario? (es decir, crea una estructura de datos en el disco y el marco se encarga de la fragmentación bajo el capó).

1
Las versiones más nuevas de Stata en máquinas de 64 bits no tienen problemas con los conjuntos de datos de este tamaño (ya que 5GB se ajustan fácilmente en la RAM en estos días), pero ¿tiene algún interés en las alternativas comerciales a SAS o solo busca FOSS?
whuber

1
Sí, las soluciones FOSS son lo que estoy buscando. Estoy de acuerdo en que un conjunto de datos podría caber en 5 gigas de RAM, pero también tiene que manejar las operaciones y las estructuras de datos adicionales que se crean durante el análisis exploratorio de datos. Combine esto con las computadoras portátiles comerciales equipadas con unos escasos 4 GB de RAM y la sobrecarga consumida por el sistema operativo y los errores de memoria aparecen con bastante rapidez.
Zelazny7

2
@ Zelazny7: Agregar otros 4Gigs a una computadora portátil debería ser bastante barato en estos días. :)
curious_cat

3
Otra opción es almacenar los datos en una base de datos (SQL o no). A menudo, un análisis solo requerirá un subconjunto de datos (variables 1:10, pero no 1: 1000) que se ajustarán en la memoria. Si el subconjunto aún es más grande que la memoria, el análisis puede hacerse en trozos (cargar en los datos de la base de datos 1000 observaciones a la vez, cotejar adecuadamente los resultados al final).
jthetzel

1
Asegúrese de revisar las preguntas de big data sobre SO, así como la vista de tareas de computación de alto rendimiento en CRAN para discusiones adicionales, si aún no lo ha hecho.
jthetzel

Respuestas:


3

si está alcanzando un máximo de 500,000 registros x 2,000 variables, gastaría un poco más de dinero en RAM para su computadora portátil y terminaré con ella. si tiene 16 GB, probablemente pueda leer el conjunto de datos que está describiendo en R directamente. y en ese punto, podrás hacer mucho más, y muy rápido, pero dices que no es una opción, así que:

mire los paquetes basados ​​en SQL para R. Estos le permiten conectarse a bases de datos externas y acceder a esas tablas a través de SQL. dado que SQL es bastante universal (y dado que R es de código abierto), su código no se perderá si cambia de trabajo o pierde acceso a SAS. la base de datos externa más fácil de configurar es, RSQLitepero la más rápida es MonetDB.R( pruebas de velocidad )

Probablemente haya algunas buenas soluciones para su problema declarado, supongo que casi todas ellas involucran a R;)


2

Tal vez no se trata tanto de las aplicaciones / problemas a los que apunta y sus características, sino más bien de los algoritmos y variantes que está utilizando. Más concretamente, para manejar grandes datos, han aparecido muchas variantes basadas en el descenso de gradiente estocástico de algoritmos populares, como SVM, que son capaces de manejar eso.

Scikit ofrece soporte para algunos de estos algoritmos (SVM, kNN, kmeans, ...). Supongo que este bonito gráfico puede ayudarte a descubrir rápidamente, si scikit tiene sentido para ti.

Espero que ayude

NOTA: lo que sigue es una respuesta al comentario de zelazny7

Ahora te entendí. Lo que estás buscando son pandas . Echa un vistazo a la sección de charlas. Hay una presentación que compara brevemente el flujo de trabajo de Panda y el de panda. Panda le permite importar datos en diferentes formatos y manejar archivos bgu a través de la integración de tablas HDF5 . Además, puedes interactuar con Scikit.


¡Gracias! Los algoritmos definitivamente tendrían que funcionar on-lineo en fragmentos de los datos leídos en la memoria y escritos de nuevo en el disco. Scikit es genial y eso es lo que ME ENCANTARÍA usar, pero ¿qué herramientas / flujos de trabajo / enfoques existen para los pasos muy necesarios de exploración, munging y preparación de datos antes de aplicar estos algos? Estos lenguajes pueden manejar estos pasos, pero realmente estoy buscando un ejemplo real de alguien que tenga que lidiar con estos problemas sin memoria.
Zelazny7

Edité mi respuesta con lo que estás buscando (¡o eso creo!)
jpmuc

2

Ya parece cómodo con SAS, y sus conjuntos de datos son lo suficientemente pequeños como para caber en la RAM, pero tal vez no pueda caber suficiente RAM en su computadora portátil. Si no te importa quedarte con SAS, ¿qué tal si solo te conectas a SAS corriendo remotamente en una computadora con mucha RAM? No tengo idea de cómo funciona, pero estos enlaces pueden ayudarlo a comenzar.

Hay otras buenas razones para usar Pandas o R, pero no creo que deba preocuparse por los límites de memoria. Si no puede colocar suficiente memoria en su computadora portátil, ejecute la instancia de Python o R en otro lugar y conéctese con SSH, iPython Notebook o RStudio.


1

Graphchi es excelente y puede manejar grandes conjuntos de datos. Es un poco difícil trabajar con él, pero puede manejar datos gráficos y no gráficos.


1

Recientemente me encontré con SFrames y GraphLab Create. Estas son bibliotecas para Python que ofrecen el tipo de funcionalidad que parece estar buscando Desde el sitio de Pypi: "SFrame es un marco de datos escalable y fuera del núcleo, que le permite trabajar con conjuntos de datos que son más grandes que la cantidad de RAM en su sistema ". Piense en ello como la funcionalidad de manipulación de datos y API en Pandas, pero sin poner primero todos los datos en la memoria. SFrame es gratis y de código abierto hasta donde yo sé. Por otro lado, GraphLab se basa en la funcionalidad SFrame para proporcionar algoritmos para realizar análisis descriptivos y predictivos (aprendizaje automático) sobre los datos almacenados en SFrames. GraphLab Create create no es gratuito / de código abierto, pero tiene una licencia de demostración gratuita. En cualquier caso, dependiendo de cuán sofisticados sean sus algoritmos, SFrame podría ser suficiente para usted.


-1

¿Has considerado un lenguaje "real", no interpretado como Fortran?

Parece que las sugerencias hasta ahora son muy dependientes del proveedor o son interpretadas. Los métodos interpretados son notoriamente malos en aplicaciones de memoria intensa. MatLab puede tener un nivel de lenguaje mucho más alto que "C", pero las optimizaciones de manejo de memoria en C pueden hacer que maneje conjuntos de datos 100 veces más rápidos que son millones de veces más grandes.

Tanto "R" como "Python" son lenguajes maravillosos, de alto nivel, técnicamente ricos y muy utilizados. También son interpretados.

Puede considerar una de las instancias de R-on-Hadoop. (Rhipe, otros) Esto tiene la ventaja de poder traducir R (alto nivel, fácil de programar) en instrucciones de MapReduce / Hadoop. Hadoop puede ser un grupo de multiprocesamiento interesante para hombres pobres.

http://www.datadr.org/ <- (enlace Rhipe)

Fortran se ha desarrollado durante décadas. Tiene manejo y compilación de memoria muy eficiente. También tiene algunas bibliotecas de nivel superior, por lo que puede realizar operaciones muy sofisticadas técnicamente de manera bastante simple. Podría hacer un CFD de juguete en MatLab, pero para algo realista y autocodificado, usaría Fortran para el procesamiento de "gran hierro" y algo como MatLab o R para presentar / resumir datos. Nadie fabrica software CFD comercial cuyo "motor" se interprete en lugar de compilarse. Varios vendedores tienen su CFD de Moneymaker codificado en C o Fortran. SAS fue originalmente escrito en C ( enlace ).

Fortran y Rhipe son accesibles. MatLab cuesta dinero y si mi trabajo no lo pagara, estaría usando R o Python ahora mismo.

ACTUALIZACIÓN:
Mi punto fue "compilado". Python tiene cython que literalmente puede ejecutar el mismo código (fundamental) ~ 1000 veces más rápido. Eso significa que puede tener datos que son ~ 1000x más grandes y procesarlos casi al mismo tiempo. Hacer que Cython funcione de manera limpia puede ser un desafío, pero herramientas como " Sage " lo envuelven bien. Rcpp supuestamente tiene similar, pero personalmente no sé si está tan bien desarrollado.

Si lo piensa, los fundamentos de casi todo lo que ejecuta en informática científica, incluso en lenguajes interpretados, se compilan Fortran o C. C. BLAS es BLAS; no estás reinventando el código cada vez que haces EDA . Su lenguaje interpretado está llamando a esas bibliotecas, aunque de manera muy ineficiente, cuando se ejecuta.

Como comentario aparte, puede mirar JMP . Tiene una interfaz muy fácil de usar y es excelente para análisis de datos exploratorios ( EDA ) muy visuales .


2
¿Cómo exploras los datos con un lenguaje compilado como fortran? El atractivo de los lenguajes interpretados, para mí, es el REPL que proporciona una rica introspección y me permite aprender rápidamente con lo que estoy tratando, así como jugar con nuevas funciones de biblioteca con las que quizás no esté familiarizado.
Zelazny7

1
Rcpp está muy bien desarrollado (solo echa un vistazo al uso inverso en CRAN), pero no es realmente comparable con cython. Si tiene alguna función definida, sí, puede tomar la entrada R, procesarla en Cpp y devolver los datos a R. Pero pronto no compilará un script R completo en Cpp.
russellpierce
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.