Классификатор Weka J48: не удается обработать числовой класс?

Сейчас я пытаюсь построить модель классификатора J48 (C4.5) на моих обучающих данных, используя Weka.

Сначала я делаю это, что, кажется, идет нормально:

java -Xmx10G -cp /weka/weka.jar weka.core.converters.TextDirectoryLoader -dir /home/test/cats > /home/test/cats.arff

Кажется, это тоже нормально:

java -Xmx10G -cp /weka/weka.jar weka.filters.unsupervised.attribute.StringToWordVector -i /home/test/cats.arff -o /home/test/cats-vector.arff

Это не идет нормально:

java -Xmx10G -cp /weka/weka.jar weka.classifiers.trees.J48 -t /home/test/cats-vector.arff -d /home/test/cats.model

Это дает следующую ошибку:

weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.j48.C45Prune                 ableClassifierTree: Cannot handle numeric class!
        at weka.core.Capabilities.test(Capabilities.java:954)
        at weka.core.Capabilities.test(Capabilities.java:1110)
        at weka.core.Capabilities.test(Capabilities.java:1023)
        at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
        at weka.classifiers.trees.j48.C45PruneableClassifierTree.buildClassifier                 (C45PruneableClassifierTree.java:116)
        at weka.classifiers.trees.J48.buildClassifier(J48.java:236)
        at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1076)
        at weka.classifiers.Classifier.runClassifier(Classifier.java:312)
        at weka.classifiers.trees.J48.main(J48.java:948)

Итак, я тогда попробовал это:

java -Xmx10G -cp /weka/weka.jar weka.classifiers.trees.J48 -t /home/test/cats.arff -d /home/test/cats.model

Что также дает ошибку:

weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.j48.C45PruneableClassifierTree: Cannot handle string attributes!
        at weka.core.Capabilities.test(Capabilities.java:980)
        at weka.core.Capabilities.test(Capabilities.java:869)
        at weka.core.Capabilities.test(Capabilities.java:1085)
        at weka.core.Capabilities.test(Capabilities.java:1023)
        at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
        at weka.classifiers.trees.j48.C45PruneableClassifierTree.buildClassifier(C45PruneableClassifierTree.java:116)
        at weka.classifiers.trees.J48.buildClassifier(J48.java:236)
        at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1076)
        at weka.classifiers.Classifier.runClassifier(Classifier.java:312)
        at weka.classifiers.trees.J48.main(J48.java:948)

Очевидно, я как-то неправильно подготовил данные (кстати, входные данные - это текстовые файлы в подкаталогах, которые названы в соответствии с категориями, которые я хочу). Но я думал, что следую инструкциям на Weka Wiki: Weka Wiki Категоризация текстовых файлов Weka Wiki Primer

Так что я делаю неправильно? Я хотел бы использовать J48, потому что он дает высокую точность моих данных в тестах. Итак, что мне сделать с моими данными, чтобы классификатор J48 принял их? Или мне нужно использовать другой классификатор?

Пожалуйста помоги!


person Alasdair    schedule 28.10.2011    source источник


Ответы (2)


Векторы слов могут быть преобразованы в двоичные файлы следующим образом:

java -Xmx4G -cp /weka/weka.jar weka.filters.unsupervised.attribute.NumericToBinary -i /home/test/cats-vector.arff -o /home/test/cats-binary.arff

Хотя это добавляет предвзятость к данным, на которых вы тренируетесь. Это означает, что двоичные строки, очень близкие друг к другу, рассматриваются как более похожие на строки, расположенные далеко. Если вы хотите избавиться от этой предвзятости и рассматривать каждую строку как совершенно уникальную сущность, используйте @attribute class {ABC, DEF, GHI, etc} Тогда это сработает!

Если вы действительно хотите сообщить, что эти функции важны и никак не связаны, создайте целый столбец для каждой строки, где он имеет значение «1», если строка имеет эту категорию, и 0, если нет. Это создает очень разреженные данные, но тогда алгоритм обучения склонен сканировать эти данные для получения информации.

person Alasdair    schedule 29.10.2011

Классификатор J48 — это древовидный классификатор, который принимает только номинальные классы. Это означает, что классы, по которым вы будете классифицировать свои экземпляры, должны быть известны заранее. То есть, если вы пытаетесь предсказать рейтинг и знаете, что рейтинг находится на 5-уровневой шкале Лайкерта, вы должны явно указать это в своем файле ARFF с чем-то вроде @attribute class {1,2,3,4,5}, но если вы хотите предсказать вес человека, тогда это значение, вероятно, является действительным числом и, следовательно, не может «подходить» для древовидной классификации. NB: один из способов обойти это — создать выборку доступных весов: от 10 до 15 кг, от 15 до 20 кг и т. д. Таким образом, у вас может быть атрибут номинального класса.

person gerard    schedule 16.02.2012
comment
Все ли классификаторы Weka принимают номинальные классы? У меня есть куча числовых функций прямо сейчас, но я хочу добавить функцию на основе класса прямо сейчас. - person Phani; 08.11.2012
comment
Некоторые классификаторы предсказывают номинальный тип, а другие предсказывают числовые типы. Вы можете просмотреть список классификаторов для получения информации о типе класса, который будет предсказывать классификатор. а также тип атрибутов, которые он будет принимать. - person Richard D; 29.06.2013