классификация текста унарного класса в weka?

У меня есть обучающий набор данных (текст) для определенной категории (скажем, Рак). Я хочу обучить классификатор SVM для этого класса в weka. Но когда я пытаюсь сделать это, создав папку «рак» и поместив все эти обучающие файлы в эту папку, и когда я запускаю код, я получаю следующую ошибку: weka.classifiers.functions.SMO: Не удается обработать унарный класс!

что я хочу сделать, так это то, что если классификатор находит документ, связанный с «раком», он правильно называет имя класса, и как только я накормил документ, не относящийся к раку, он должен сказать что-то вроде «неизвестно».

Что я должен сделать, чтобы получить такое поведение?


person samsamara    schedule 01.05.2012    source источник


Ответы (1)


Алгоритм SMO в Weka выполняет бинарную классификацию только между двумя классами. Последовательная минимальная оптимизация — это особый алгоритм решения SVM, а в Weka — базовая реализация этого алгоритма. Если у вас есть несколько примеров, которые являются раком, а некоторые нет, то это будет бинарным, возможно, вы не правильно их обозначили.

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

LibSVM в Weka может обрабатывать svm одного класса. В отличие от реализации Weka SMO, LibSVM — это отдельная программа, интерфейс которой в Weka и включает множество различных вариантов SVM. Этот пост на Wekalist объясняет, как использовать LibSVM для этого в Weka.

person karenu    schedule 01.05.2012
comment
Спасибо за Ваш ответ. Я заработал. В чем разница между наличием двух наборов (скажем, рак и нерак) и выполнением бинарной классификации и наличием одного набора (только рак) и выполнением классификации одного класса, если я хочу только определить, сколько документов, относящихся к раку (один класс )? - person samsamara; 01.05.2012
comment
Разница в том, есть ли у вас отрицательные примеры. Если у вас есть 100 примеров рака и 100 примеров нерака, то это два класса: рак и нерак. Если у вас есть только, скажем, 100 здоровых примеров и вы хотите знать, есть ли что-то ненормальное, то это один класс. - person karenu; 02.05.2012
comment
Я провел одно занятие с LibSVM в Weka. Но проблема в том, что во время тестирования все тестовые экземпляры классифицируются по классу, который я использовал в обучении, он не говорит, по крайней мере, об одном нерелевантном экземпляре, о котором я точно знаю, что тестовые экземпляры совершенно нерелевантны из этого класса. Что может быть причиной этого? - person samsamara; 02.05.2012
comment
Вы делали настройку параметров? SVM очень чувствителен к своим параметрам, это не готовое решение. Этот документ от libsvm является отличным введением: csie.ntu. edu.tw/~cjlin/papers/guide/guide.pdf - person karenu; 02.05.2012
comment
Еще пара вещей, которые нужно проверить: если у вас есть два класса, включал ли учебный файл атрибут класса и/или примеры из обоих классов? Если вы выбрали SVM с одним классом и просто передали ему файл с двумя классами, возможно, он посчитал переменную класса атрибутом и включил ее в модель, и в этом случае, если вы передадите ему любое значение для этого атрибута, считать его частью класса. - person karenu; 02.05.2012
comment
Спасибо. Теперь я использую double pred = myClassi.classifyInstance(myInstance); чтобы получить прогнозируемое значение. Я протестировал 6 экземпляров из одного и того же тренировочного набора, и теперь я получаю 4 экземпляра как NaN и 2 как 0.0. Я предполагаю, что здесь NaN = выброс и 0,0 = релевантно, верно? Но как мне получить 4 выброса? это те же экземпляры, которые я использовал для обучения. В чем здесь может быть причина? Я не делал никакой настройки параметров, только -S 2, чтобы сказать унарную классификацию. - person samsamara; 03.05.2012
comment
@KillBill У меня такая же проблема. Все тестовые экземпляры относятся к классу, который я использовал в обучении. Что вы сделали, чтобы решить эту проблему? - person xro7; 19.08.2016
comment
@karenu Ссылка на сообщение, в котором объясняется, как использовать LibSVM для классификации унарных классов вниз/навсегда. Не могли бы вы проверить и предоставить нам новую ссылку. - person drp; 07.09.2016