Как нормализовать векторы tf-idf для SVM?

Я использую поддержку векторных машин для классификация документов. Мой набор функций для каждого документа - это вектор tf-idf. У меня есть документы M с каждым вектором tf-idf размера N. Предоставляя матрицу M * N.

Размер M составляет всего 10 документов, а вектор tf-idf - это вектор из 1000 слов. Так что моих возможностей намного больше, чем количество документов. Также каждое слово встречается в 2 или 3 документах. Когда я нормализую каждую функцию (слово), то есть нормализацию столбца в [0,1] с помощью

val_feature_j_row_i = ( val_feature_j_row_i - min_feature_j ) / ( max_feature_j - min_feature_j)

Это либо дает мне, конечно, 0, 1.

И это дает мне плохие результаты. Я использую libsvm с функция rbf C = 0,0312, гамма = 0,007815

Какие-нибудь рекомендации?

Следует ли мне приложить больше документов? или другие функции, такие как сигмоид или лучшие методы нормализации?


person Ashish Negi    schedule 14.08.2013    source источник


Ответы (1)


Список вещей, которые следует учитывать и исправить, довольно длинный, поэтому в первую очередь я бы порекомендовал немного почитать о машинном обучении, прежде чем пытаться столкнуться с самой проблемой. Существуют десятки отличных книг (например, «Нейронные сети и обучающие машины» Хайкина), а также онлайн-курсы, которые помогут вам с такими основами, как перечисленные здесь: http://www.class-central.com/search?q=machine+learning.

Возвращаясь к самой проблеме:

  • 10 документов - это строки от большого до маленького, чтобы получить какие-либо значимые результаты и / или понимание проблемы,
  • универсального метода предварительной обработки данных не существует, приходится анализировать с помощью многочисленных тестов и аналитики данных,
  • SVM - это параметрические модели, вы не можете использовать отдельные значения C и gamma и ожидать каких-либо разумных результатов. Вы должны проверить десятки из них, чтобы даже понять, «где искать». Самый простой способ сделать это - так называемый grid search,
  • 1000 функций - это большое количество измерений, это говорит о том, что использование ядра, которое подразумевает бесконечно размерное пространство функций, довольно ... избыточно - было бы лучше сначала проанализировать более простые, у которых меньше шансов переобучиться (линейный или полином низкой степени)
  • наконец, tf * idf - хороший выбор, если «каждое слово встречается в 2 или 3 документах»? Это может быть сомнительно, если только вы не имеете в виду 20-30% документов.

наконец, почему простые функции раздавлены

Это либо дает мне, конечно, 0, 1.

он должен приводить к значениям в интервале [0,1], а не только к его пределам. Так что, если это так, у вас, вероятно, есть ошибка в вашей реализации.

person lejlot    schedule 14.08.2013
comment
поскольку функции представлены всего в 2 документах (в основном), либо минимальное, либо максимальное значение, либо в основном 0 или 1. - person Ashish Negi; 14.08.2013
comment
Хорошо, есть разница между «в основном» и «всегда». В вопросе, который вы указали 2 or 3, и поскольку количество появлений данного термина в документах является только нормализующим фактором idf, оно должно приводить к множеству значений между 0 и 1, если только термин не появляется не более одного раза в конкретном документе, тогда выбор tf*idf для этих данных кажется неправильным. - person lejlot; 14.08.2013