Классификация в weka не работает из-за чувствительности номинальных значений к регистру?

Я сделал классификатор для классификации поисковых запросов по одному из следующих классов: {Художник, Актер, Политик, Спортсмен, Объект, Гео, Определение, QA}. У меня есть два файла csv: один для обучения классификатора (содержит 300 запросов) и один для тестирования классификатора (в настоящее время содержит около 200 запросов). Когда я использую обучающий набор и тестовый набор для обучения/оценки классификатора с помощью потока знаний weka, большинство классов достигают довольно хорошей точности. Настройка ситуации обучения/тестирования потока знаний Weka:

Настройка обучения/тестирования Weka

После обучения я сохранил классификатор MultiLayer Perceptron из потока знаний в classifier.model, который я использовал в java-коде для классификации запросов.

Когда я десериализую эту модель в java-коде и использую ее для классификации всех запросов CSV-файла тестового набора (используя метод DistributionForInstance() в десериализованном классификаторе) в потоке знаний, он классифицирует все запросы «Geo» как «Facility». запросы и все запросы «QA» как запросы «Определение». Это меня немного удивило, так как ClassifierPerformanceEvaluator показал мне матрицу путаницы, в которой запросы «Geo» и «QA» получили очень хорошие оценки, а запросы тестирования одинаковы (использовался один и тот же файл CSV). Все другие классификации запросов, использующие метод DistributionForInstance(), похоже, работают нормально и поэтому демонстрируют поведение, которого можно было ожидать, глядя на матрицу путаницы в потоке знаний. Кто-нибудь знает, каковы могут быть возможные причины разницы в классификации между методом распределенияForInstance() в коде Java и результатами оценки потока знаний?

Одна вещь, о которой я могу думать, заключается в следующем: файл testing-CSV содержит среди других атрибутов множество атрибутов номинального значения в заглавной оболочке. Когда я распечатываю значения всех атрибутов экземпляров перед классификацией в java-коде, эти значения, кажется, преобразуются в строчные заглавные буквы (похоже, что метод DataSource.getDataSet() ведет себя так). Может быть, регистр этих атрибутов является причиной того, что некоторые экземпляры моего тестового CSV-файла классифицируются по-разному? Я прочитал в спецификации Weka, что атрибуты номинального значения чувствительны к регистру. Однако я изменяю эти значения в верхнем регистре в файле java, поскольку затем weka выдает исключение, что эти значения не предопределены для номинального атрибута.


person Niek Tax    schedule 24.05.2012    source источник
comment
comment
Хотя у другого вопроса действительно один и тот же автор и он касается одного и того же проекта, я считаю, что оба вопроса на самом деле разные.   -  person Niek Tax    schedule 25.05.2012


Ответы (1)


Weka, вероятно, использует тот же класс в потоке знаний, что и в вашем коде weka для интерпретации csv. Вот почему он работает (выдает наборы данных — Instances объектов — которые совпадают) без дополнительной настройки и дает сбой, когда вы что-то меняете: элементы больше не совпадают. Это означает, что weka последовательно обрабатывает регистр входных строк и не требует от вас его изменения.

Убедитесь, что вы смотрите на значение Error on Test Data, а не на значение Error on Training Data в выходных данных потока знаний, потому что второе значение будет искусственно завышено, учитывая, что вы построили модель, используя именно эти примеры. Возможно, ваш классификатор работает одинаково в обоих местах, но вы смотрите на разные статистические данные.

person kaz    schedule 25.05.2012