java - WEKA:从classifyInstance获取类,为什么这是错误的

标签 java weka j48

我使用 WEKA Java Api 训练并创建 J48 模型。 然后,我使用classifyInstance() 对我的实例进行分类。 但结果是错误的。 我的代码ID如下:

    Instances train = reader.getDataSet();
    Instances test = reader_test.getDataSet();

    train.setClassIndex(train.numAttributes() - 1);
    Classifier cls = new J48();
    cls.buildClassifier(train);

    test.setClassIndex(test.numAttributes() - 1);

    for(int i = 0; i < test.numInstances(); i++){
        Instance inst = test.instance(i);
        double result = cls.classifyInstance(inst);
        System.out.println(train.classAttribute().value((int)r));
    }

结果始终等于 0.0

最后,我在 test.setClassIndex() 之前使用 test.insertAttributeAt()。 如下:

test.insertAttributeAt(train.attribute(train.numAttributes() - 1), test.numAttributes());

结果正确。我很惊讶! 然而,大多数文档都没有使用inserAttribute函数。 我想知道为什么结果突然变对了。

最佳答案

这会对你有帮助。

BufferedReader datafile = readDataFile(TrainingFile);
Instances train = new Instances(datafile);
data.setClassIndex(data.numAttributes() - 1);

Classifier cls = new J48();
cls.buildClassifier(train);

DataSource testDataset = new DataSource(Test);
Instances test = testDataset.getDataSet();
Testdata.setClassIndex(Testdata.numAttributes() - 1);

for(int i = 0; i < test.numInstances(); i++){

    Instance inst = test.instance(i);

    double actualClassValue  = test.instance(i).classValue();

    //it will print your class value
    String actual=test.classAttribute().value((int)actualClassValue);

    double result = cls.classifyInstance(inst);

    //will print your predicted value
    String prediction=test.classAttribute().value((int)result );


}

您现在不需要使用insertAttributeAt

文件转换代码

    // load CSV
    CSVLoader loader = new CSVLoader();
    String InputFilename = "TrainingFileName";
    loader.setSource(new File(InputFilename));
    Instances data = loader.getDataSet(); 

    // save ARFF
    ArffSaver saver = new ArffSaver();
    saver.setInstances(data);
    String FileT = Filename+".arff";
    saver.setFile(new File(Path+Directory+"\\"+FileT));
    saver.writeBatch();     

相应地改变。

谢谢

关于java - WEKA:从classifyInstance获取类,为什么这是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870329/

相关文章:

machine-learning - 如何解读weka分类结果J48

java - 比较两个字符串给出 false 作为输出

java - Weka 中的关系数据?

machine-learning - C4.5 决策树算法没有提高准确性

java - Weka java spreadsubsample 过滤器

machine-learning - Weka 中级联分类器的错误方法

python - 在 python 中从一棵决策树 (J48) 分类转换为集成

java - 使用 Java 处理 Postgresql 事务

java - 将数组列表中的单个值存储到数组中

Java:在编译时或应用程序执行时运行测试