2015-07-08 2 views
2

Я пытаюсь запустить некоторые контролируемые эксперименты с помощью простого текстового классификатора, но у меня возникают проблемы с памятью при использовании генератора K Fold в Sklearn. Ошибка, которую я получаю, гласит: «В вашей системе закончилась память приложения», но мой набор данных составляет всего ~ 245 тыс. Строк х ~ 81 тыс. Столбцов. Большой, правда, но не огромный. Программа никогда не заканчивается, а скорее «зависает», пока я вручную не закрою приложение терминала. Я позволил ему работать примерно так 30 минут, без каких-либо успехов.Sklearn K-Fold Cross Validation Memory Issues

Я также написал в print утверждениях, чтобы увидеть, где в перекрестной проверке for-loop код застревает. Похоже, что генерируются индексы для тренировочных и тестовых наборов, но код никогда не доходит до того, чтобы нарезать фактические обучающие и тестовые наборы для функций и меток, используя эти индексы. Я запускаю это на Macbook Pro, работающем 10.9.5. Я запустил это закрытие всех других приложений, кроме приложения Terminal, без каких-либо успехов. У кого-нибудь еще были проблемы с этим или это, вероятно, что-то специфическое для моей машины?

EDIT: Я выполнил это с 10-кратной и 5-кратной проверкой креста и каждый раз сталкивался с теми же проблемами.

+0

Простой вопрос: вы используете 64-битную версию и сколько памяти у вас на вашем ноутбуке? – EdChum

+0

Спасибо, что посмотрели @EdChum. Я запускаю 64-битную версию и имею 8 ГБ памяти. – kylerthecreator

+0

Еще один простой вопрос - можете ли вы запустить его на тренировочном наборе с CV? То есть, CV является причиной проблемы? –

ответ

3

Я думаю, что первый вопрос приходит из этой части:

мой набор данных только ~ 245K строк х ~ 81K колонок. Большой, правда, но не огромный.

245K х 80K не звучат огромными, но давайте просто делать математику и считать 8 байт на элемент stored.If вашей матрица не является разреженной (очевидно, в вашем случае это разреженная матрица), которая была бы 245 * 80 * 8 МБ, поэтому примерно 160 ГБ, которые необходимо хранить в вашей ОЗУ. Это действительно огромно!

Вы упомянули классификацию текста, поэтому я предполагаю, что ваши функции - это tf-idf или количество слов и что это очень редкий. Теперь вам нужно быть осторожным, чтобы сохранить разреженность на каждом шаге и использовать только алгоритмы, которые работают с разреженными данными и не будут выделять плотную матрицу размером n_samples * n_features.

Наивные классификаторы заливов (например, sklearn.naive_bayes.MultinomialNB) имели достойный успех в классификации текста, я бы начал там.

Такой классификатор может легко обрабатывать матрицу 250K x 80K, если она является разреженной матрицей (и на самом деле она достаточно разрежена).

Если вы все еще хотите, чтобы уменьшить количество функций, которые Вы получаете от Tf-IDF у вас есть несколько вариантов:

  1. Извлеките стоп-слова, либо со списком стоп-слов или путем установки параметра max_df до значения около 0,7 или ниже (это отменит любой термин, который составляет более 70% документов).
  2. Применить функцию выбора перед обучением вашего классификатора. This scikit-learn example показывает, как использовать статистику хи-квадратов для выбора функций на основе разреженных данных.
  3. Примените методы уменьшения размерности, такие как SVD (я бы посмотрел на Latent semantic indexing, но я не владею этим).

Варианты 1. и 2. объединенные должны уже позволить вам значительно сократить количество функций.

Дайте мне знать, если это поможет.

+0

много согласен. Строки 245K выглядят отлично, но 81K столбцов сумасшедшие. Возможно, сначала уменьшите размерность. –