Weka J48 分类器:无法处理数字类?

Posted

技术标签:

【中文标题】Weka J48 分类器:无法处理数字类?【英文标题】:Weka J48 Classifier: Cannot handle numeric class? 【发布时间】:2011-12-17 11:42:17 【问题描述】:

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

首先我这样做,这似乎没问题:

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 Categorizing Text Files Weka Wiki Primer

那我做错了什么?我想使用 J48,因为它在测试中对我的数据具有很高的准确性。那么我该如何处理我的数据才能让 J48 分类器接受它呢?还是我需要使用不同的分类器?

请帮忙!

【问题讨论】:

【参考方案1】:

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

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才不是。这会产生非常稀疏的数据,但是学习算法会偏向于扫描该数据以获得信息增益。

【讨论】:

【参考方案2】:

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

【讨论】:

所有 Weka 分类器都接受名义类吗?我现在有一堆数字特征,但我现在想添加一个基于类的特征。 某些分类器将预测名义类型,而其他分类器将预测数字类型。您可以查看list of classifiers,了解有关分类器将预测的类类型以及它将接受的属性类型的信息。

以上是关于Weka J48 分类器:无法处理数字类?的主要内容,如果未能解决你的问题,请参考以下文章

R Weka J48决策树无法处理数字类

使用 J48 构建分类器

使用测试集中的缺失值评估 weka 分类器 J48,R RWeka

Weka 过滤分类器 arrayOutOfBoundsException

Weka 逻辑分类器不可用

Weka 分类器精度