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

时间:2011-10-28 17:47:05

标签: weka classification

我现在正在尝试使用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)

显然我已经以某种方式准备了错误的数据(BTW输入是子目录中的文本文件,这些文件由我想要的类别命名)。但我以为我遵循了Weka Wiki上的说明: Weka Wiki Categorizing Text Files Weka Wiki Primer

那么我做错了什么?我想使用J48,因为它在测试中对我的数据给出了高精度。那么我该如何处理我的数据以使J48分类器接受它呢?或者我需要使用不同的分类器吗?

请帮忙!

2 个答案:

答案 0 :(得分:4)

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

  

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

答案 1 :(得分:4)

J48分类器是一个树分类器,只接受名义类。这意味着您必须事先知道您将对实例进行分类的类。 IE,如果你试图预测评级并且你知道评级是5级李克特量表,你必须在你的ARFF文件中用@attribute class {1,2,3,4,5}明确说明,但如果你预测权重然后,这个值可能是一个实数,因此不能“适合”树分类。注意:一种方法是创建可用重量的样本:从10到15千克,从15到20千克等。这样你就可以有一个名义上的类属性。