WEKA:从classifyInstance获取类,为什么它是错误的



我使用WEKA Java Api训练并创建一个J48模型。然后,我使用classificationInstance()对实例进行分类。但结果是错误的。我的代码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();     

相应地更改。

感谢