Общие приемы работы с огромными объемами данных на несверхкомпьютерном компьютере. - PullRequest
13 голосов
/ 19 августа 2011

Я беру несколько классов ИИ и узнал о некоторых основных алгоритмах, с которыми я хочу поэкспериментировать.Я получил доступ к нескольким наборам данных, содержащим множество отличных реальных данных, через Kaggle , где проводятся соревнования по анализу данных.

Я пытался участвовать в нескольких соревнованиях, чтобы улучшить свои навыки машинного обучения,но не смогли найти хороший способ доступа к данным в моем коде.Kaggle предоставляет один большой файл данных, 50-200 МБ, на соревнование в формате CSV.

Каков наилучший способ загрузки и использования этих таблиц в моем коде?Моим первым инстинктом было использование баз данных, поэтому я попытался загрузить CSV-файл в sqlite для одной базы данных, но это оказало огромную нагрузку на мой компьютер, и во время коммитов мой компьютер часто падал.Затем я попытался использовать сервер mysql на общем хосте, но выполнение запросов на нем занимало вечность, и это сильно замедляло мой код анализа.Кроме того, я боюсь, что я превысь свою пропускную способность.

Пока на моих уроках мои преподаватели обычно очищают данные и дают нам управляемые наборы данных, которые можно полностью загрузить в оперативную память.Очевидно, что это невозможно для моих текущих интересов.Пожалуйста, предложите, как мне поступить.В настоящее время я использую 4-летний MacBook с 4-Гб оперативной памятью и двухъядерным процессором 2,1 ГГц.

Кстати, я надеюсь выполнить большую часть своего анализа на Python, так как я знаю этот язык лучше всего.Я хотел бы решение, которое позволяет мне делать все или почти все кодирование на этом языке.

Ответы [ 5 ]

18 голосов
/ 23 августа 2011

Прототип - это самое важное при работе с большими данными.Разумно разбейте его на части, чтобы вы могли загрузить его в память для доступа к нему с помощью интерпретатора - например, Python, R. Это лучший способ создания и уточнения потока аналитического процесса в масштабе.

Другими словамиОбрежьте ваши файлы данных размером в несколько ГБ, чтобы они были достаточно малы для выполнения аналитики командной строки .

Вот рабочий процесс, который я использую для этого - конечно, не лучший способсделать это, но это один из способов, и он работает:

I. Использование отложенная загрузка методы (надеюсь) доступны в вашемЯзык, выбранный для чтения в больших файлах данных, особенно тех, которые превышают около 1 ГБ.Затем я бы порекомендовал обработать этот поток данных в соответствии с методами, которые я расскажу ниже, а затем, наконец, сохранить эти полностью предварительно обработанные данные в Data Mart или промежуточном промежуточном контейнере.

Один пример использования Python для lazyзагрузить большой файл данных :

# '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. Отбеливание и перерисовка :

  • Пересчет ваших столбцов с категориальными переменными (например, мужчина / женщина) какцелые числа (например, -1, 1).Сохраните справочную таблицу (тот же хеш, который вы использовали для этого преобразования, за исключением того, что ключи и значения поменялись местами), чтобы преобразовать эти целые числа обратно в удобочитаемые строковые метки в качестве последнего шага в вашем аналитическом рабочем процессе;

  • отбелите ваши данные, т. Е. «Нормализуйте» столбцы, которые содержат непрерывные данные.Оба эти шага существенно уменьшат размер вашего набора данных - без какого-либо шума.Побочным эффектом отбеливания является предотвращение ошибки аналитики, вызванной чрезмерным взвешиванием.

III. Выборка: обрежьте данные по длине .

IV * * тысяча пятьдесят-одна. Уменьшение размеров : ортогональный аналог для выборки.Определите переменные (столбцы / поля / функции), которые не оказывают или не оказывают минимального влияния на зависимую переменную (иначе говоря, «результаты» или переменная ответа), и удалите их из своего куба рабочих данных.

Анализ главных компонентов (PCA) - это простой и надежный метод для этого:

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

Итак, как вы видите, первые три собственных значения составляют 94% дисперсии наблюдается в исходных данных.В зависимости от вашей цели вы часто можете обрезать исходную матрицу данных D, удалив последние два столбца:

D = D[:,:-2]

V. Data Mart Storage : вставьте слой между вашим постоянным хранилищем (Data Warehouse) и вашим процессом аналитики .Другими словами, в значительной степени полагайтесь на витрины данных / кубы данных - «промежуточную область», которая находится между вашим хранилищем данных и уровнем аналитических приложений.Эта витрина данных - намного лучший уровень ввода-вывода для ваших аналитических приложений.«Фрейм данных» R или «таблица данных» (из одноименного пакета CRAN) являются хорошими кандидатами.Я также настоятельно рекомендую redis - быстрое чтение, краткая семантика и нулевая конфигурация, что делает его отличным выбором для этого варианта использования.Redis легко справится с наборами данных того размера, который вы указали в своем вопросе.Например, используя структуру хэш-данных в Redis, вы можете иметь ту же структуру и ту же гибкость в отношении отношений, что и MySQL или SQLite, без утомительной настройки.Еще одно преимущество: в отличие от SQLite, redis фактически является базой данных server .На самом деле я большой поклонник SQLite, но я считаю, что redis здесь работает лучше по причинам, которые я только что привел.

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})
2 голосов
/ 19 августа 2011

200 мегабайт не очень большой файл для загрузки в базу данных.Возможно, вы захотите попытаться разбить входной файл на более мелкие файлы.

split -l 50000 your-input-filename

Утилита split разделит ваш входной файл на несколько файлов любого размера.Я использовал 50000 строк на файл выше.Это обычная утилита командной строки Unix и Linux;Не знаю, поставляется ли он с Mac.

Локальные установки PostgreSQL или даже MySQL могут быть лучшим выбором, чем SQLite, для того, что вы делаете.

Если вы не хотите загружать данные в базу данных, вы можете взять их подмножества, используя утилиты командной строки, такие как grep, awk и sed.(Или языки сценариев, такие как python, ruby ​​и perl.) Передайте подмножества в вашу программу.

1 голос
/ 04 марта 2017

Я загрузил набор данных Kaggle размером 2 ГБ в R, используя H2O.H2O построен на Java и создает виртуальную среду, данные будут доступны в памяти, и у вас будет гораздо более быстрый доступ, так как H2O - Java.Вам просто нужно привыкнуть к синтаксису H2O.Он имеет множество прекрасно построенных ml-алгоритмов и обеспечивает хорошую поддержку распределенных вычислений.Вы также можете легко использовать все свои ядра процессора.Проверьте h2o.ai о том, как его использовать.Он может легко обрабатывать 200 МБ, учитывая, что у вас есть только 4 ГБ оперативной памяти.Вы должны обновить до 8 G или 16 G

1 голос
/ 14 сентября 2014

Вам нужны «Панды» для этого. Я думаю, ты уже понял это. Но все же, если кто-то еще сталкивается с проблемой, может быть выигрыш от ответа. Таким образом, вам не нужно загружать данные в любую СУБД. сохранить его в файл и использовать его с помощью простых панд загрузка, датафреймы. Вот ссылка на панды lib -> http://pandas.pydata.org/

Если данные слишком велики, вам нужен какой-либо кластер для этого. Apache Spark или Mahout, которые могут работать в облаке Amazon EC2. Купите там немного места, и им будет легко пользоваться. Spark также имеет API для Python.

0 голосов
/ 25 августа 2011

Общая техника - «разделяй и властвуй». Если вы можете разделить ваши данные на части и обработать их по отдельности, то это может быть обработано одной машиной. Некоторые задачи могут быть решены таким образом (PageRank, NaiveBayes, HMM и т. Д.), А некоторые - нет (одна требовала глобальной оптимизации), такие как LogisticeRegression, CRF, многие методы сокращения измерений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...