Я сделал классификатор для классификации поисковых запросов по одному из следующих классов: {Художник, Актер, Политик, Спортсмен, Объект, Гео, Определение, QA}. У меня есть два файла csv: один для обучения классификатора (содержит 300 запросов) и один для тестирования классификатора (в настоящее время содержит около 200 запросов). Когда я использую обучающий набор и тестовый набор для обучения/оценки классификатора с помощью потока знаний 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 выдает исключение, что эти значения не предопределены для номинального атрибута.