Weka J48 Классификатор: Не можете обработать числовой класс? - PullRequest
0 голосов
/ 28 октября 2011

Я сейчас пытаюсь построить модель классификатора 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 принял их? Или мне нужно использовать другой классификатор?

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

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

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

4 голосов
/ 29 октября 2011

Векторы слов можно преобразовать в двоичный файл, например:

java -Xmx4G -cp /weka/weka/jka 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», когда ее нет.Это создает очень разреженные данные, но тогда алгоритм обучения имеет тенденцию к сканированию этих данных для получения информации.

...