Текстовая категоризация: объединение различных видов функций

19

Проблема, с которой я сталкиваюсь, состоит в классификации коротких текстов на несколько классов. Мой текущий подход заключается в использовании частотных терминов tf-idf и изучении простого линейного классификатора (логистическая регрессия). Это работает достаточно хорошо (около 90% макроса F-1 в тестовом наборе, почти 100% в тренировочном наборе). Большой проблемой являются невидимые слова / н-граммы.

Я пытаюсь улучшить классификатор, добавляя другие функции, например, вектор фиксированного размера, вычисленный с использованием распределительных сходств (как вычислено word2vec) или другие категориальные особенности примеров. Моя идея состояла в том, чтобы просто добавить функции в разреженные функции ввода из пакета слов. Тем не менее, это приводит к ухудшению производительности на тестовом и тренировочном наборе. Дополнительные функции сами по себе дают около 80% F-1 в тестовом наборе, поэтому они не являются мусором. Масштабирование функций также не помогло. В настоящее время я думаю, что такого рода функции не очень хорошо сочетаются с (редким) набором слов.

Таким образом, вопрос заключается в следующем: если дополнительные функции предоставляют дополнительную информацию, каков наилучший способ их включения? Может ли обучение отдельных классификаторов и объединение их в какую-то ансамблевую работу (это, вероятно, будет иметь недостаток, заключающийся в том, что никакое взаимодействие между функциями различных классификаторов не может быть зафиксировано)? Есть ли другие, более сложные модели, которые я должен рассмотреть?

elmille
источник
3
Некоторое обновление: мне удалось достичь приемлемых результатов путем l2-нормализации дополнительных плотных векторов. Я ошибочно предполагал, что это сделает Sklearn StandardScaler. Тем не менее, я все еще ищу более сложные методы, которые позволили бы мне моделировать зависимости меток или включать доверие к подклассификаторам.
Элмилл
В прошлом году я проводил такой же эксперимент и столкнулся с той же проблемой, что и у вас. Может ли ваш вектор word2vec после процесса нормализации l2 превзойти BOW? Я не сделал l2-нормализацию, но даже после тестирования многих методов постобработки семантический вектор все еще на 2-4 абсолютных процента отстает от характеристик BOW tf / idf. Интересно, является ли это направление второстепенным. Моя первоначальная попытка - объединить плотно-семантический вектор с традиционным BOW и посмотреть, может ли он улучшить характеристики классификации / моделирования тем. Кстати, с каким набором данных вы работали, у меня 20newsgroup.
Я работал с набором данных для конкурса CIKM 2014. Для меня, векторные представления никогда не были в состоянии превзойти BOW с весами tf-idf. Я планировал использовать их в дополнение к улучшению качества. По моему опыту (для классификации текста) некоторая форма tf-idf + линейная модель с n-граммами является чрезвычайно сильным подходом. В настоящее время я экспериментирую с сверточными нейронными сетями и даже с этими (более или менее) сложными моделями, которые трудно победить.
Эльмиль
To Mod: Извините, что у меня нет 50 репутации, поэтому я не могу писать в области комментариев. Привет, Элмилл: Да, это то, что я испытываю во всех тестах. Тем не менее, вы находите, что слово vec + BOW поможет? По моему опыту, когда я объединяю слово vec с BOW tf-idf (в моем случае этот vec на самом деле является общим вектором всей статьи, он не word-vec, но очень похож), производительность становится еще ниже. Я изначально думаю, что это должно быть BOW + VEC> BOW> VEC. Так как они содержат взаимно вспомогательную информацию. Фактический результат - BOW> vec> BOW + vec. Затем я делаю стандартное масштабирование и нормализацию, чтобы поклониться и

Ответы:

13

Если я правильно понимаю, у вас есть две формы функций для ваших моделей. (1) Текстовые данные, которые вы представили в виде разреженного пакета слов и (2) более традиционные плотные элементы. Если это так, то есть 3 общих подхода:

  1. Выполните уменьшение размерности (например, через LSA TruncatedSVD) для своих разреженных данных, чтобы сделать их плотными и объединить их в единую плотную матрицу для обучения ваших моделей.
  2. Добавьте свои несколько плотных функций в вашу разреженную матрицу, используя что-то вроде scipy's, hstackв одну разреженную матрицу для обучения ваших моделей.
  3. Создайте модель, используя только свои разреженные текстовые данные, а затем объедините ее прогнозы (вероятности, если это классификация) в качестве плотного объекта с другими плотными объектами для создания модели (т. Е. Ансамблирования с помощью стекирования). Если вы идете по этому пути, не забывайте использовать только CV-прогнозы в качестве функций для обучения вашей модели, в противном случае вы, скорее всего, будете слишком плохо подходить (вы можете сделать достаточно класс, чтобы сделать все это в пределах одного, Pipelineесли хотите ).

Все три подхода действительны и имеют свои плюсы и минусы. Лично я нахожу (1), как правило, худшим, потому что он, относительно говоря, чрезвычайно медленный. Я также нахожу (3), как правило, лучшим, будучи достаточно быстрым и приводящим к очень хорошим прогнозам. Очевидно, что вы можете сделать их комбинацию, если захотите сделать более обширный ансамбль.

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

Дэвид
источник
10

Линейные модели просто добавляют свои характеристики, умноженные на соответствующие веса. Если, например, у вас есть 1000 разреженных объектов, только 3 или 4 из которых активны в каждом экземпляре (а остальные - нули) и 20 плотных объектов, которые не являются нулями, то весьма вероятно, что плотные объекты будут составлять большую часть воздействие, в то время как редкие особенности добавят только небольшую ценность. Вы можете проверить это, посмотрев на веса объектов для нескольких случаев и их влияние на итоговую сумму.

Один из способов исправить это - отказаться от аддитивной модели. Вот пара моделей-кандидатов.

SVM основан на разделении гиперплоскостей. Хотя гиперплоскость сама является линейной моделью, SVM не суммирует ее параметры, а вместо этого пытается оптимально разделить пространство признаков. Учитывая количество функций, я бы сказал, что линейный SVM должен работать нормально, в то время как более сложные ядра могут иметь тенденцию превышать данные.

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

Наконец, случайные леса могут работать как хороший метод ансамбля в этом случае. Рандомизация гарантирует, что различные виды функций (разреженные / плотные) будут использоваться в качестве основных узлов решений в разных деревьях. Деревья RF / принятия решений также хороши для проверки самих объектов, поэтому в любом случае стоит отметить их структуру.

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

ffriend
источник
Спасибо за ваш ответ! У меня есть два дополнительных вопроса :) 1) Чем отличаются SVM (с линейным ядром) и наивный байесовский в том, что они не суммируют свои особенности и соответствующие веса (то есть то, что вы называете «аддитивной моделью»)? И то, и другое эффективно создает разделяющую гиперплоскость, поэтому разве результатом не всегда является добавление каких-либо функций, умноженных на соответствующие веса? 2) Я хотел бы попробовать случайные леса, но, к сожалению, пространство объектов слишком велико, чтобы представить его в плотном формате (я использую sklearn). Есть ли реализация, которая может справиться с этим?
Элмилл
1) В линейной регрессии вас интересуют точки на гиперплоскости, поэтому вы складываете взвешенные объекты, чтобы получить предсказанную точку. В SVM, с другой стороны, вы ищете точки на сторонах гиперплоскости. Вы выполняете классификацию, просто проверяя, на какой стороне находится ваш пример, при прогнозировании не используется суммирование. Наивный байесовский анализ может включать в себя различные виды моделей (например, биномиальные или полиномиальные), но в основном вы умножаете вероятности, а не добавляете их.
друг
2) Я видел некоторые исследования в этой теме, но никогда не сталкивался с реализацией (вероятно, поиск в Google даст некоторые ссылки здесь). Однако вы всегда можете пойти другим путем - уменьшить размерность, скажем, с помощью PCA, а затем запустить случайный лес на основе сокращенного набора данных.
друг