现在,我正在尝试使用Weka在我的训练数据上构建一个J48 (C4.5)分类器模型。
首先,我做这个,这似乎是好的:
java -Xmx10G -cp /weka/weka.jar weka.core.converters.TextDirectoryLoader -dir /home/test/cat> /home/test/cats.arff
这似乎也没问题:
java weka.filters.unsupervised.attribute.StringToWordVector -cp /weka/weka.jar -Xmx10G -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上的说明:Weka Wiki对文本文件进行分类 Weka Wiki Primer
那我做错什么了?我想使用J48,因为它在测试中对我的数据具有很高的准确性。那么,为了让J48分类器接受它,我应该对数据做些什么呢?还是我需要使用不同的分类器?
请帮帮我!
发布于 2011-10-29 06:47:31
可以将单词向量转换为如下二进制:
java weka.filters.unsupervised.attribute.NumericToBinary -cp /weka/weka.jar -Xmx4G -i /home/test/cats vector.arff -o /home/test/cats binary.arff
尽管这增加了您要针对的数据类型的偏见。这意味着非常接近的二进制字符串被视为与远距离的字符串更相似。如果您想要消除这种偏见,并将每个字符串视为一个完全唯一的实体,那么使用@attribute class {ABC, DEF, GHI, etc},那么它就能工作了!
如果您真的想要传达这些特性是重要的,而不是所有相关的,那么为每个字符串创建一个完整的列,其中当一个行有该类别时,它的值为'1‘,而如果没有,则为0。这会产生非常稀疏的数据,但是学习算法偏倚地扫描这些数据以获得信息增益。
发布于 2012-02-16 14:27:22
J48分类器是一种只接受标称类的树分类器。这意味着您要根据哪些类对实例进行分类,必须在掌握之前就知道。例如,如果你试图预测一个等级,并且你知道这个等级是5级的利克特等级,你必须在你的@attribute class {1,2,3,4,5}文件中明确地这样说,但是如果你要预测一个人的体重,那么这个值可能是一个实数,因此不能在树的分类中“适合”。注意:一种方法是创建一个可获得的权重的抽样:从10到15公斤,从15公斤到20公斤等等。这样你就可以有一个标称的等级属性。
https://stackoverflow.com/questions/7932888
复制相似问题