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

Scikit и Pandas: установка больших данных

Как использовать scikit-learn для обучения модели на больших данных csv (~ 75 МБ) без проблем с памятью?

Я использую IPython-ноутбук в качестве среды программирования и pandas + sklearn пакеты для анализа данных из обучающего кода распознавателя цифр.

Данные доступны на веб-странице ссылка на my код, и вот сообщение об ошибке:

KNeighborsClassifier используется для прогнозирования.

Проблема:

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

Когда функция read_csv загружает файл успешно, после внесения изменений в dataframe, я могу передать функции и метки функции KNeighborsClassifier fit(). На этом этапе происходит аналогичная ошибка памяти.

Я пробовал следующее:

Итерации через CSV файл в кусках и соответствующие данным соответствуют, но проблема в том, что предсказательная модель каждый раз перезаписывается для фрагмента данных.

Как вы думаете, что я могу сделать, чтобы успешно обучать мою модель, не сталкиваясь с проблемами памяти?

4b9b3361

Ответ 1

Примечание: при загрузке данных с помощью pandas создается объект DataFrame, где каждый столбец имеет однородный тип данных для всех строк, но 2 столбца могут иметь разные типы данных (например, целое число, даты, строки).

Когда вы передаете экземпляр DataFrame в модель scikit-learn, он сначала выделит однородный 2D-массив numpy с dtype np.float32 или np.float64 (в зависимости от реализации моделей). На этом этапе у вас будет 2 копии вашего набора данных в памяти.

Чтобы этого избежать, вы можете написать/повторно использовать парсер CSV, который напрямую распределяет данные во внутреннем формате /dtype, ожидаемом моделью scikit-learn. Вы можете попробовать numpy.loadtxt например (посмотрите на docstring для параметров).

Кроме того, если данные очень разреженные (много нулевых значений), лучше будет использовать datastructure scipy.sparse и модель scikit-learn, которая может иметь дело с таким входным форматом (проверьте, что docstrings знать). Однако сам формат CSV не очень хорошо подходит для разреженных данных, и я не уверен, что существует прямой синтаксический анализатор CSV-to-t23.

Изменить: для справки. KNearestNeighborsClassifer выделяет массив временных расстояний с формой (n_samples_predict, n_samples_train), которая очень расточительна, когда требуется только (n_samples_predict, n_neighbors). Эта проблема может быть отслежена здесь:

https://github.com/scikit-learn/scikit-learn/issues/325