Я хочу сделать классификацию на мои текстовые данные. У меня есть 300 classes
200 учебных документов на класс (так 60000 documents in total
), и это, вероятно, приведет к очень большим размерам данных (возможно, мы просматриваем более 1 миллиона измерений ).
Я хотел бы выполнить следующие шаги в конвейере (просто чтобы дать вам представление о моих требованиях):
- Преобразование каждого документа в векторный вектор (
tf-idf
илиvector space model
) Feature selection
(Mutual Information
желательно на основе или любых других стандартных)- Обучение классификатора (
SVM
,Naive Bayes
,Logistic Regression
илиRandom Forest
) - Прогнозирование невидимых данных на основе обученной модели классификатора.
Итак, вопрос в том, какие инструменты / рамки я использую для обработки таких многомерных данных? Мне известны обычные подозреваемые (R, WEKA ...), но, насколько мне известно (возможно, я ошибаюсь), возможно, никто из них не сможет обработать такие большие данные. Есть ли какой-нибудь другой готовый инструмент, на который я мог бы взглянуть?
Если я должен распараллелить это, я должен смотреть на Apache Mahout ? Похоже, он еще не совсем обеспечивает необходимую мне функциональность.
Спасибо всем заранее.
Обновление: я просмотрел этот сайт , список рассылки R и Интернет в целом. Мне кажется, что в моей ситуации могут возникнуть следующие проблемы:
(1) Предварительная обработка моих данных с использованием R ( в частности, пакета tm ) может быть непрактичной , поскольку tm
будет слишком медленной.
(2) Поскольку мне нужно будет использовать ансамбль пакетов R (предварительная обработка, разреженные матрицы, классификаторы и т. Д.), Взаимодействие между пакетами может стать проблемой, и я могу подвергнуться дополнительным расходам при преобразовании данных из одного формата в другой. , Например, если я выполняю предварительную обработку с использованием tm
(или внешнего инструмента, такого как WEKA), мне нужно будет найти способ преобразовать эти данные в форму, которую могут прочитать библиотеки HPC в R. И опять же, мне неясно, будут ли пакеты классификатора напрямую принимать данные, предоставленные библиотеками HPC.
Я на правильном пути? И что более важно, я понимаю?
источник
foreach
библиотеку для записи параллельного кода на R. Это особенно хорошо работает в сочетании со случайными лесами, которые по своей природе легко распараллелить.Ответы:
Это должно быть возможно, чтобы заставить его работать, пока данные представлены в виде разреженной структуры данных, такой как
scipy.sparse.csr_matrix
экземпляр в Python. Я написал учебник для работы с текстовыми данными . Кроме того, можно еще больше сократить использование памяти, используя хитрость хеширования: адаптируйте ее для использованияHashingVectorizer
вместоCountingVectorizer
или илиTfidfVectorizer
. Это объясняется в разделе документации по извлечению текстовых возможностей .Случайные леса, как правило, намного дороже, чем линейные модели (такие как линейные опорные векторные машины и логистическая регрессия) и полиномиальные или наивные байесовские алгоритмы Бернулли, и для большинства задач классификации текста, которые не обеспечивают значительно большей точности прогнозирования, чем более простые модели.
Если scikit-learn в конечном итоге не сможет масштабироваться до вашей проблемы, Vowpal Wabbit сделает (и, вероятно, быстрее, чем sklearn), хотя и не реализует все модели, о которых вы говорите.
Отредактировано в апреле 2015 года, чтобы отразить текущее состояние библиотеки scikit-learn и исправить неработающие ссылки.
источник
Gensim для Python - это магия. А так как он на Python, вы можете использовать его в сочетании с предложением @ ogrisel.
источник
Не говоря уже о моем собственном гудке, но я сделал довольно популярную серию видео по анализу текста с Rapidminer. Вы можете видеть это здесь:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Вы, вероятно, можете избежать выбора функций, просто используйте классификатор, который не создает матрицу миллионов * миллионов в памяти :)
Логистическая регрессия захлебнется во многих измерениях. Наивный Байес предполагает самостоятельные размеры, поэтому с вами все будет в порядке. SVM не зависит от количества измерений (но от количества опорных векторов), поэтому все будет хорошо.
300 много классов, хотя. Я бы начал с нескольких и продолжил ваш путь.
источник
Во-первых, основываясь на ваших комментариях, я бы отнесся к этому как к 300 двоичным (да / нет) проблемам классификации. Существует много простых в использовании учеников с открытым исходным кодом, и это позволяет вам тратить время на память.
SVM и логистическая регрессия, вероятно, являются наиболее популярными подходами для классификации текста. Оба могут легко обрабатывать 1000000 измерений, поскольку современные реализации используют разреженные структуры данных и включают в себя параметры регуляризации, позволяющие избежать переобучения.
Несколько пакетов машинного обучения с открытым исходным кодом, включая WEKA и KNIME , включают в себя как SVM, так и логистическую регрессию. Автономные реализации SVM включают libSVM и SVMlight . Для логистической регрессии я добавлю BXRtrain и BXRclassify , которые я разработал вместе с Madigan, Genkin и другими. BXRclassify может построить в памяти индекс из тысяч моделей логистической регрессии и применять их одновременно.
Что касается преобразования текста в векторную форму атрибута, я как-то всегда заканчиваю тем, что пишу небольшой Perl, чтобы сделать это с нуля. :-) Но я думаю, что комплекты машинного обучения, о которых я упоминал, включают код токенизации и векторизации. Другим способом было бы использовать больше инструментария на естественном языке, такого как LingPipe , хотя это может быть излишним для вас.
источник
Начиная с Sklearn 0.13 действительно есть реализация HashingVectorizer .
РЕДАКТИРОВАТЬ: Вот полноценный пример такого приложения из склеарн документов
В основном, этот пример демонстрирует, что вы можете классифицировать текст по данным, которые не помещаются в основную память компьютера (но скорее по диску / сети / ...).
источник