Pull to refresh

Comments 20

За статью спасибо, но есть одно замечание.

> А что делать, если множества не является линейно-разделимым? [...] мы просто позволяем классификатору делить множества так, чтобы между гиперплоскостями могли оказываться точки.

С теоретической точки зрения это не имеет смысла. Если множество не разделимо, то алгоритм просто не сможет построить разделяющую гиперплоскость — какие точки тогда считать опорными векторами? Как с этим поступают на практике в популярных реализациях (SVMLight, LibSVM), честно говоря, не знаю. Но в прикладной программе для обработки линейно неразделимых образцов используют сложные нелинейные ядра, например, полиномиальное ядро. Правда для текста это не актуально — 47000 атрибутов как правило более чем достаточно, чтобы разделить любые документы даже используя линейное ядро.
Как на практике решается проблема нелинейности я также сказать не смогу, но помимо смены ядра есть еще один метод. Было доказано, что любую линейно не разделимую задачу можно свести к линейной путем перехода в другое пространство. Например, из декартовых координат можно перейти к полярным. Впрочем, это можно «сыметировать» использовав другое ядро.
На сколько я понимаю, ядро как раз таки пространство и «искривляет», хотя это с какой стороны посмотреть — дуализм :)
да, это так и делается в svm. используются ядра более высокого порядка.
но как уже выше было сказано при очень большом количестве атрибутов и относительно маленьком количестве документов линейное ядро показывает такие же результаты
А вот это уже очень интересно! Почитаю обязательно.
Тогда ещё советую погуглить «site:download.yandex.ru классификация» — много всего познавательного.
> Документ — это вектор… это список всех слов
Нужно добавить, что метод работает не только для слов, но и для n-грамм, например, биграмм.
И это существенно повышает точность. При этом, естественно, при переходе к биграммам объем словаря растет.
UFO just landed and posted this here
лучше использовать libSVM так как она поддерживает мультиклассовость — то есть входной файл содержит не +1/-1, а номер класса для каждого документа, который вы хотите классифицировать. таким образом вам не нужно 80 классификаторов. а всего лишь 2 файла — для обучения и для тестов

далее, неразумно в качестве свойста использовать +1/-1 для классификации документов. так как у вас из обычного очень разреженного вектора из например 500 значений (500 features), получится вектор из полного списка (47тыс в вашем примере* количество оцениваемых свойств) значений, большая часть которых просто неинформативна — забита -1. или я вас в этом моменте неправильно поняла?

очень рекомендую к прочтению в этом контексте данную статью — A Practical Guide to Support Vector Classication

и по поводу того, какие свойста имеет смысл оценивать в документе — есть так называемые distributional features, которые как раз таки используются для классификации текстов. и если вы знаете о них, то стоило в статье их и описать и назвать своими названиями, можно даже с формулами :) а не обобщенно «доля слова в документе» и т.п.

но в целом приятно было встретить на хабре данную статью.
зато можно классифицировать документ по нескольким категориям
неразумно в качестве свойста использовать +1/-1 для классификации документов. так как у вас из обычного очень разреженного вектора из например 500 значений (500 features), получится вектор из полного списка (47тыс в вашем примере* количество оцениваемых свойств) значений, большая часть которых просто неинформативна — забита -1. или я вас в этом моменте неправильно поняла?

Если я правильно понял Ваш вопрос, то отвечу: из 500 значений переходить к 47000 приходится для соблюдения размерности. А как иначе? Да, они получаются разряженные, и забиты нулями (не -1), но так уж приходится делать.
За статью спасибо.
«После этого документ представляется в виде вектора, где i-тый элемент это мера вхождения i-того слова словаря в документ. Это может быть + 1 или -1 в зависимости от того, входит ли слово в документ или нет»

Я к сожалению не вникала в то как именно работает svmlight, но есть подозрение что структуры там частино одинаковые. это значит, что вы передаете туда компактный вектор:
7:6 11:6.56 19:45.56 25:0.5. то есть только те значения, которые не равны нулю.

Если же вы будете делать как у вас написано в статье +1/-1, то у вас получится вектор с кучей -1 вместо нулей. и вместо того чтобы передавать вектор из 500 значений, вы будете передавать вектор из 47тысяч. Это как бы совсем нелогично и для данного типа классификации не используется. И поэтому я подумала, что либо вы не совсем точно описали в статье что вы хотите сказать этим «i-тый элемент = +1/-1», либо я вас просто не поняла.

Кстати, только что заметила, что например у вас в примере очень разрозненные данные. 19 элемент — 45, 25 — меньше 1! В данном случае просто необходимо делать нормализацию, скалирование. Об этом кстати тоже написано в той статье по моей ссылке.
Если же вы будете делать как у вас написано в статье +1/-1, то у вас получится вектор с кучей -1 вместо нулей. и вместо того чтобы передавать вектор из 500 значений, вы будете передавать вектор из 47тысяч. Это как бы совсем нелогично и для данного типа классификации не используется.

Да, согласен! Я написал это для примера, понятно что на практике так делать не стоит.

В данном случае просто необходимо делать нормализацию, скалирование.

Да, я знаю про это. Для эксперимента я брал долю слова в документе, и значения находились в пределах от 0 до 1 (единица, конечно, не достигалась, поэтому значения нормализовывались).
кто вам мешает это сделать в libSVM? :)
вы не подскажете, где скачать этот корпус целиком? на самой странице нашёл ссылки только результаты обработки…
Sign up to leave a comment.

Articles