Weka J48分类器:不能处理数字类



我现在正尝试使用Weka在我的训练数据上构建一个J48 (C4.5)分类器模型。

首先我这样做,这似乎是OK:

java -Xmx10G -cp/weka/weka.jarweka.core.converter . textdirectoryloader -dir/home/test/cats>/home/test/cats.arff

这个似乎也可以:

java -Xmx10G -cp/weka/weka.jarweka.filters.unsupervised.attribute.StringToWordVector -我/home/test/cats.

java -Xmx10G -cp/weka/weka.jarJ48 - t/home/test/cats-vector。/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.jarJ48 - t/home/test/cats./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分类器接受它呢?或者我需要使用不同的分类器吗?

请帮忙!

字向量可以像这样转换为二进制:

java -Xmx4G -cp/weka/weka.jarweka.filters.unsupervised.attribute.NumericToBinary -我/home/test/cats-vector。/home/test/cats-binary. Arff

尽管这会给你训练的数据类型增加偏见。这意味着彼此非常接近的二进制字符串被视为与距离较远的字符串更相似。如果你想消除这种偏见,并将每个字符串视为一个完全唯一的实体,那么使用@attribute class {ABC, DEF, GHI, etc},然后它工作!

如果你真的想要传达这些特性是重要的,并且根本不相关,那么为每个字符串创建一个完整的列,其中当一行具有该类别时它的值为'1',当它不具有该类别时它的值为0。这会产生非常稀疏的数据,但随后学习算法会倾向于扫描这些数据以获取信息。

J48分类器是一个只接受名义类的树分类器。这意味着必须事先知道将根据哪些类对实例进行分类。例如,如果你试图预测一个评级,你知道这个评级是5级李克特量表,你必须在ARFF文件中明确地说,比如@attribute class {1,2,3,4,5},但如果你要预测一个人的体重,那么这个值可能是一个实数,因此不能"适合"树分类。注:解决这个问题的一种方法是创建一个可用重量的抽样:从10到15公斤,从15到20公斤等等。这样你就可以有一个标称的类属性。

最新更新