with tutorial the para framework español djangoproject applications python database machine-learning data-analysis kaggle

python - tutorial - Técnicas generales para trabajar con grandes cantidades de datos en una computadora no súper



the django project (5)

200 megabytes no es un archivo particularmente grande para cargar en una base de datos. Es posible que desee intentar dividir el archivo de entrada en archivos más pequeños.

split -l 50000 your-input-filename

La herramienta de división dividirá su archivo de entrada en varios archivos de cualquier tamaño que desee. Usé 50000 líneas por archivo arriba. Es una utilidad común de línea de comandos de Unix y Linux; no sé si se envía con Macs, sin embargo.

Las instalaciones locales de PostgreSQL o incluso MySQL pueden ser una mejor opción que SQLite para lo que estás haciendo.

Si no desea cargar los datos en una base de datos, puede tomar subconjuntos utilizando utilidades de línea de comandos como grep, awk y sed. (O lenguajes de scripting como python, ruby ​​y perl). Instale los subconjuntos en su programa.

Estoy tomando algunas clases de IA y he aprendido algunos algoritmos básicos con los que quiero experimentar. He obtenido acceso a varios conjuntos de datos que contienen gran cantidad de datos reales del mundo real a través de Kaggle , que organiza concursos de análisis de datos.

He intentado participar en varios concursos para mejorar mis habilidades de aprendizaje automático, pero no he podido encontrar una buena manera de acceder a los datos de mi código. Kaggle proporciona un archivo de datos grande, 50-200 mb, por competencia en formato csv.

¿Cuál es la mejor manera de cargar y usar estas tablas en mi código? Mi primer instinto fue utilizar bases de datos, así que traté de cargar el csv en sqlite en una única base de datos, pero esto colocó una enorme carga en mi computadora y durante las confirmaciones, era común que mi computadora fallara. A continuación, traté de usar un servidor mysql en un host compartido, pero hacer consultas en él llevó una eternidad, y mi código de análisis fue realmente lento. Además, me temo que excederé mi ancho de banda.

En mis clases hasta ahora, mis instructores generalmente limpian los datos y nos dan conjuntos de datos manejables que pueden cargarse completamente en la memoria RAM. Obviamente esto no es posible para mis intereses actuales. Por favor sugiere cómo debo proceder. Actualmente estoy usando un macbook de 4 años con 4 GB de ram y una CPU dualcore de 2,1 Ghz.

Por cierto, espero hacer la mayor parte de mi análisis en Python, ya que conozco este idioma de la mejor manera. Me gustaría una solución que me permita hacer toda o casi toda la codificación en este idioma.


Prototipo: eso es lo más importante cuando se trabaja con big data. Arregle con cuidado para que pueda cargarlo en la memoria y acceder a él con un intérprete, por ejemplo, python, R. Esa es la mejor manera de crear y refinar el flujo de su proceso analítico a escala.

En otras palabras, recorte sus archivos de datos de varios GB de modo que sean lo suficientemente pequeños como para realizar análisis de línea de comandos .

Este es el flujo de trabajo que uso para hacer eso, seguramente no es la mejor manera de hacerlo, pero es de una sola manera, y funciona:

I. Use métodos de carga diferida (con suerte) disponibles en el idioma de su elección para leer en archivos de datos de gran tamaño, particularmente aquellos que superen aproximadamente 1 GB. Entonces recomendaría procesar esta secuencia de datos de acuerdo con las técnicas que analizo a continuación, y finalmente almacenar estos datos totalmente preprocesados ​​en un Data Mart, o contenedor de etapas intermedias.

Un ejemplo usando Python para cargar un archivo grande de datos :

# ''filename'' is the full path name for a data file whose size # exceeds the memory on the box it resides. # import tokenize data_reader = open(some_filename, ''r'') tokens = tokenize.generate_tokens(reader) tokens.next() # returns a single line from the large data file.


II. Blanquear y refundir :

  • Reformule las columnas que almacenan variables categóricas (por ejemplo, Hombre / Mujer) como enteros (por ejemplo, -1, 1). Mantenga una tabla de búsqueda (el mismo hash que usó para esta conversión, excepto que las claves y los valores se intercambian) para convertir estos enteros en etiquetas de cadena legibles para el ser humano como el último paso en su flujo de trabajo analítico;

  • blanquee sus datos, es decir, "normalice" las columnas que contienen datos continuos. Ambos pasos reducirán sustancialmente el tamaño de su conjunto de datos, sin introducir ningún ruido. Un beneficio concomitante del blanqueamiento es la prevención del error analítico causado por la sobreponderación.

III. Muestreo: recorta tus datos a lo largo de la longitud .


IV . Reducción de dimensión : el análogo ortogonal al muestreo. Identifique las variables (columnas / campos / características) que no tienen influencia o influencia de minimis en la variable dependiente (es decir, los ''resultados'' o la variable de respuesta) y elimínelos de su cubo de datos de trabajo.

El Análisis de Componentes Principales (PCA) es una técnica simple y confiable para hacer esto:

import numpy as NP from scipy import linalg as LA D = NP.random.randn(8, 5) # a simulated data set # calculate the covariance matrix: # R = NP.corrcoef(D, rowvar=1) # calculate the eigenvalues of the covariance matrix: # eigval, eigvec = NP.eig(R) # sort them in descending order: # egval = NP.sort(egval)[::-1] # make a value-proportion table # cs = NP.cumsum(egval)/NP.sum(egval) print("{0}/t{1}".format(''eigenvalue'', ''var proportion'')) for i in range(len(egval)) : print("{0:.2f}/t/t{1:.2f}".format(egval[i], cs[i])) eigenvalue var proportion 2.22 0.44 1.81 0.81 0.67 0.94 0.23 0.99 0.06 1.00

Como puede ver, los primeros tres valores propios representan el 94% de la varianza observada en los datos originales. Dependiendo de su propósito, a menudo puede recortar la matriz de datos original, D, eliminando las dos últimas columnas:

D = D[:,:-2]


V. Data Mart Storage : inserte una capa entre su almacenamiento permanente (Data Warehouse) y su flujo de proceso analítico . En otras palabras, confíe mucho en los mercados de datos / cubos de datos, un "área de preparación" que se encuentra entre su Data Warehouse y la capa de su aplicación analítica. Este data mart es una capa IO mucho mejor para sus aplicaciones de análisis. El ''marco de datos'' de R o ''tabla de datos'' (del paquete CRAN del mismo nombre) son buenos candidatos. También recomiendo encarecidamente el redis: lecturas rápidas, tergiversadas y configuración cero, lo convierten en una excelente opción para este caso de uso. redis manejará fácilmente conjuntos de datos del tamaño que mencionaste en tu Pregunta. Usando la estructura de datos hash en redis, por ejemplo, puede tener la misma estructura y la misma flexibilidad relacional que MySQL o SQLite sin la tediosa configuración. Otra ventaja: a diferencia de SQLite, redis es en realidad un servidor de base de datos. De hecho, soy un gran admirador de SQLite, pero creo que Redis solo funciona mejor aquí por las razones que acabo de dar.

from redis import Redis r0 = Redis(db=0) r0.hmset(user_id : "100143321, {sex : ''M'', status : ''registered_user'', traffic_source : ''affiliate'', page_views_per_session : 17, total_purchases : 28.15})


La técnica general es "dividir y conquistar". Si puede dividir los datos en partes y procesarlos por separado, puede ser manejado por una máquina. Algunas tareas se pueden resolver de esa manera (PageRank, NaiveBayes, HMM, etc.) y otras no (una optimización global necesaria) como LogisticeRegression, CRF, muchas técnicas de reducción de dimensiones


Necesitas ''Pandas'' para eso. Creo que debes haberlo conseguido a estas alturas. Pero aun así, si alguien más enfrenta el problema, puede beneficiarse con la respuesta. Por lo tanto, no tiene que cargar los datos en ningún RDBMS. Guárdelo en un archivo y úselo por simple Pandas load, dataframes. Aquí está el enlace para pandas lib -> http://pandas.pydata.org/

Si los datos son demasiado grandes, necesita un clúster para eso. Apache Spark o Mahout que pueden ejecutarse en la nube de Amazon EC2. Compre algo de espacio allí y será fácil de usar. Spark también tiene una API para Python.


Cargué un conjunto de datos Kaggle de 2 GB en R usando H2O. H2O está basado en Java y crea un entorno virtual, los datos estarán disponibles en la memoria y usted tendrá un acceso mucho más rápido ya que H2O es Java. Simplemente tendrá que acostumbrarse a la sintaxis de H2O. Tiene muchos algoritmos ml bellamente construidos y proporciona un buen soporte para computación distribuida. También puede usar todos sus núcleos de CPU fácilmente. Consulte h2o.ai para saber cómo usarlo. Puede manejar 200 MB fácilmente, dado que solo tiene 4 GB de RAM. Debe actualizar a 8 G o 16 G