Подтвердить что ты не робот

Общие методы работы с огромными объемами данных на не суперкомпьютере

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

# '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. Whiten and Recast:

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

  • отбелить ваши данные - то есть, "нормализовать" столбцы, которые  сохраняйте непрерывные данные. Оба эти этапа будут уменьшить  размер вашего набора данных - без каких-либо помех.  сопутствующей выгодой отбеливания является предотвращение аналитики ошибка  вызванных чрезмерным весом.

III. Сэмплирование: обрезайте свои данные по длине.


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

Анализ основных компонентов (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[:,:-2]


V. Хранилище данных > : вставьте слой между вашим постоянным хранилищем (хранилищем данных) и потоком аналитических процессов. Другими словами, в значительной степени полагайтесь на кубы данных/кубы данных - "промежуточную область", которая находится между вашим хранилищем данных и вашим слоем приложений для аналитики. Этот файл данных намного лучше IO-уровня для ваших приложений для аналитики. R 'data frame' или 'data table' (из пакета CRAN с таким же именем) являются хорошими кандидатами. Я также настоятельно рекомендую redis - яркие быстрые чтения, краткую семантику и нулевую конфигурацию, сделайте ее отличным выбором для этого варианта использования. redis будет легко обрабатывать наборы данных размера, указанного в вашем Вопросе. Например, используя структуру хеш-данных в redis, вы можете иметь ту же структуру и ту же реляционную гибкость, что и MySQL или SQLite, без утомительной конфигурации. Еще одно преимущество: в отличие от SQLite, redis фактически является сервером базы данных. Я на самом деле большой поклонник 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

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

split -l 50000 your-input-filename

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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