WEKA:从classifyInstance中获取类,为啥错了

Posted

技术标签:

【中文标题】WEKA:从classifyInstance中获取类,为啥错了【英文标题】:WEKA: get the class from classifyInstance,why it's wrongWEKA:从classifyInstance中获取类,为什么错了 【发布时间】:2016-02-25 12:24:46 【问题描述】:

我使用 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 函数。 我想了解为什么结果突然变得正确。

【问题讨论】:

【参考方案1】:

它会帮助你。

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();     

相应地改变。

谢谢

【讨论】:

感谢您的帮助。但我的计算机中的结果仍然是错误的。我忘了告诉你,test.csv 没有类值。如果手动添加类的最后一列,结果将是正确的。我想预测结果,所以我不添加类。 根据weka文档,最后一列不管你加不加。尝试将文件转换为 .arff 并提供 @attribute statusPASS,FAIL 或您期望的任何值。您还可以从训练集中复制最后一列的类值。并且不要在最后一列中添加任何值。我将在下面添加文件转换代码。 我编辑了答案。请添加您的代码。这样我就可以看到出了什么问题。此外,您也可以从 GUI 转换

以上是关于WEKA:从classifyInstance中获取类,为啥错了的主要内容,如果未能解决你的问题,请参考以下文章

WEKA - 从 MultiClassClassifier 获取预测值

无法在 weka java *WEKA*DUMMY*STRING*FOR*STRING*ATTRIBUTES* 中获取类标签

如何在 weka 中使用 libsvm

如何使用java在weka中获取最近的邻居

在 Weka 中以编程方式获取 EM 聚类器输出

使用 Weka 获取用于构建关联规则的数据集