Масштабная классификация текста

18

Я хочу сделать классификацию на мои текстовые данные. У меня есть 300 classes200 учебных документов на класс (так 60000 documents in total), и это, вероятно, приведет к очень большим размерам данных (возможно, мы просматриваем более 1 миллиона измерений ).

Я хотел бы выполнить следующие шаги в конвейере (просто чтобы дать вам представление о моих требованиях):

  1. Преобразование каждого документа в векторный вектор ( tf-idfили vector space model)
  2. Feature selection( Mutual Informationжелательно на основе или любых других стандартных)
  3. Обучение классификатора ( SVM, Naive Bayes, Logistic Regressionили Random Forest)
  4. Прогнозирование невидимых данных на основе обученной модели классификатора.

Итак, вопрос в том, какие инструменты / рамки я использую для обработки таких многомерных данных? Мне известны обычные подозреваемые (R, WEKA ...), но, насколько мне известно (возможно, я ошибаюсь), возможно, никто из них не сможет обработать такие большие данные. Есть ли какой-нибудь другой готовый инструмент, на который я мог бы взглянуть?

Если я должен распараллелить это, я должен смотреть на Apache Mahout ? Похоже, он еще не совсем обеспечивает необходимую мне функциональность.

Спасибо всем заранее.


Обновление: я просмотрел этот сайт , список рассылки R и Интернет в целом. Мне кажется, что в моей ситуации могут возникнуть следующие проблемы:

(1) Предварительная обработка моих данных с использованием R ( в частности, пакета tm ) может быть непрактичной , поскольку tmбудет слишком медленной.

(2) Поскольку мне нужно будет использовать ансамбль пакетов R (предварительная обработка, разреженные матрицы, классификаторы и т. Д.), Взаимодействие между пакетами может стать проблемой, и я могу подвергнуться дополнительным расходам при преобразовании данных из одного формата в другой. , Например, если я выполняю предварительную обработку с использованием tm(или внешнего инструмента, такого как WEKA), мне нужно будет найти способ преобразовать эти данные в форму, которую могут прочитать библиотеки HPC в R. И опять же, мне неясно, будут ли пакеты классификатора напрямую принимать данные, предоставленные библиотеками HPC.

Я на правильном пути? И что более важно, я понимаю?

user721975
источник
R может обрабатывать наборы данных намного больше этого, вам просто нужно хорошо использовать доступные инструменты. Нет разницы между тем, что может быть достигнуто на любом основном языке или в любой среде, хотя Weka и Mahout отстают в том, что доступно. Кстати, это довольно маленький размер выборки, и размер 1М не так уж важен, но статистически он также является избыточным. Мои рекомендации - R или Python, так как они бесплатны и просты для начинающих. Матлаб не бесплатный, но и хороший. Это также влечет за собой большие налоги, когда вы используете много компьютеров.
Итератор
1
Гораздо важнее то, что у вас больше классов, чем примеров на класс, и вы встраиваете его в очень многомерное пространство. Я не уверен, что вы получите очень хорошее разделение классов здесь. У вас есть структурные отношения для ваших классов? Если это так, то некоторые из этих методов могут плохо работать без этого понимания.
Итератор
1
Вы можете использовать foreachбиблиотеку для записи параллельного кода на R. Это особенно хорошо работает в сочетании со случайными лесами, которые по своей природе легко распараллелить.
Зак
2
Несколько вопросов: 1) Вы заинтересованы в сравнении всех различных типов подходов к обучению, которые вы упомянули, или вам нужен только один, чтобы выполнить работу? 2) Каждый документ принадлежит 1, 1 или более, или 0 или более классов? 3) Вы специально хотите использовать выбор функций по какой-то причине, или вы просто решили, что это необходимо? Я согласен с другими комментариями, что это проблема небольшого размера по сегодняшним стандартам, и уменьшение размерности не является необходимым.
DavidDLewis
1
Я работаю над классификацией текста, включающей около 10 000 тем (например, классы или категории или любой другой термин, который вы предпочитаете). В настоящее время я работаю над настройкой этой системы классификации текста в этом масштабе. Я не могу поделиться своими собственными методами, поскольку они являются собственностью, но у меня есть один совет: будьте очень осторожны, предполагая, что некоторые предлагаемые методы масштабируются, если это уже не было доказано. По моему опыту, очень немногие делают.

Ответы:

13

Это должно быть возможно, чтобы заставить его работать, пока данные представлены в виде разреженной структуры данных, такой как scipy.sparse.csr_matrixэкземпляр в Python. Я написал учебник для работы с текстовыми данными . Кроме того, можно еще больше сократить использование памяти, используя хитрость хеширования: адаптируйте ее для использования HashingVectorizerвместо CountingVectorizerили или TfidfVectorizer. Это объясняется в разделе документации по извлечению текстовых возможностей .

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

Если scikit-learn в конечном итоге не сможет масштабироваться до вашей проблемы, Vowpal Wabbit сделает (и, вероятно, быстрее, чем sklearn), хотя и не реализует все модели, о которых вы говорите.

Отредактировано в апреле 2015 года, чтобы отразить текущее состояние библиотеки scikit-learn и исправить неработающие ссылки.

ogrisel
источник
Проблема использования любого «нестандартного» метода уменьшения размеров состоит в том, что вы можете столкнуться с проблемами при попытке опубликовать свою работу. По крайней мере, в поле классификации текста я знаю, что рецензентам нравится видеть часто используемые методы (что также облегчает сравнение с существующими методами классификации).
user721975
Не волнуйтесь - @ogrisel не упомянул ничего нестандартного, по крайней мере, потому что это относится к современной классификации текста, хотя я еще не читал его учебников.
итератор
+1 Я думаю, что Python - приятный путь. В R есть несколько совсем новых пакетов для интеллектуального анализа текста, но если у кого-то больше вычислительных, чем статистических знаний и интересов, Python был бы моей рекомендацией.
Итератор
@ogrisel: Престижность за вклад, который вы и другие внесли в sklearn. Я рекомендовал это многим, кто работает в Python - весь дизайн является образцовым.
Итератор
Что касается «нестандартного» уменьшения размеров (с использованием случайных проекций) и хеширования объектов, проверьте трюк хеширования Джона Лэнгфорда и это обсуждение метаоптимизации .
Огрисель
10

Gensim для Python - это магия. А так как он на Python, вы можете использовать его в сочетании с предложением @ ogrisel.

Джефф
источник
1

Не говоря уже о моем собственном гудке, но я сделал довольно популярную серию видео по анализу текста с Rapidminer. Вы можете видеть это здесь:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Вы, вероятно, можете избежать выбора функций, просто используйте классификатор, который не создает матрицу миллионов * миллионов в памяти :)

Логистическая регрессия захлебнется во многих измерениях. Наивный Байес предполагает самостоятельные размеры, поэтому с вами все будет в порядке. SVM не зависит от количества измерений (но от количества опорных векторов), поэтому все будет хорошо.

300 много классов, хотя. Я бы начал с нескольких и продолжил ваш путь.

Нил Макгиган
источник
Отличный указатель и совет. Благодарю. Не могли бы вы уточнить, что вы подразумеваете под «начать с нескольких и продолжить свой путь»?
user721975
ну, вместо 300 классов (таких как «скрипка, альт, виолончель, труба ...»), вы могли бы реклассифицировать их в меньшее число, например «строка, медь».
Нил Макгиган
Хорошо, теперь я понял.
user721975
1

Во-первых, основываясь на ваших комментариях, я бы отнесся к этому как к 300 двоичным (да / нет) проблемам классификации. Существует много простых в использовании учеников с открытым исходным кодом, и это позволяет вам тратить время на память.

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

Несколько пакетов машинного обучения с открытым исходным кодом, включая WEKA и KNIME , включают в себя как SVM, так и логистическую регрессию. Автономные реализации SVM включают libSVM и SVMlight . Для логистической регрессии я добавлю BXRtrain и BXRclassify , которые я разработал вместе с Madigan, Genkin и другими. BXRclassify может построить в памяти индекс из тысяч моделей логистической регрессии и применять их одновременно.

Что касается преобразования текста в векторную форму атрибута, я как-то всегда заканчиваю тем, что пишу небольшой Perl, чтобы сделать это с нуля. :-) Но я думаю, что комплекты машинного обучения, о которых я упоминал, включают код токенизации и векторизации. Другим способом было бы использовать больше инструментария на естественном языке, такого как LingPipe , хотя это может быть излишним для вас.

DavidDLewis
источник
+1 Хорошие комментарии. Если бы мне пришлось выполнить 300 классификаций «да / нет», как бы я выбрал отрицательные данные обучения для класса? Позитивные данные, очевидно, это документы, которые принадлежат к классу.
user721975
Еще один комментарий. SVM / Logistic reg может наверняка обработать миллион измерений, но как я могу провести эксперименты, чтобы выбрать параметры для этих классификаторов? Например, для небольшого набора данных вы можете выполнить 10-кратную перекрестную проверку, чтобы выбрать параметры, но какой подход следует использовать для таких больших данных, чтобы алгоритм завершил работу в разумные сроки?
user721975
@ user721975: Для конкретной дискриминации положительными являются те, на которых стоит ярлык X, а отрицательными являются все остальные документы.
DavidDLewis
@ user721975: Трудно дать общий совет о времени выполнения, так как детали сильно различаются между алгоритмами и реализациями. 10-кратная перекрестная проверка может быть непрактичной для вашего набора данных: 60000 примеров не имеют значения.
DavidDLewis
1
Несбалансированные тренировочные наборы не обязательно являются проблемой. Но на самом деле я понимаю, что меня смущает то, что документы могут принадлежать к 0, 1 или нескольким классам, что вы имеете в виду, имея 200 учебных документов на класс? Вы делали что-то, чтобы удалить документы с 0 классами или 2+ классами? В общем, как вы сгенерировали этот набор из 60000 документов?
DavidDLewis
1

Начиная с Sklearn 0.13 действительно есть реализация HashingVectorizer .

РЕДАКТИРОВАТЬ: Вот полноценный пример такого приложения из склеарн документов

В основном, этот пример демонстрирует, что вы можете классифицировать текст по данным, которые не помещаются в основную память компьютера (но скорее по диску / сети / ...).

oDDsKooL
источник