验证实例与Weka分类器

时间:2016-01-05 14:11:54

标签: java weka

我需要构建一个Weka分类器,然后使用它来预测未来的实例。一个很好的入门资源是here.不幸的是,我注意到 将来的实例不需要匹配源培训数据的格式

如何根据培训数据和新实例之间的差异进行预测?

示例火车:

  

@relation train

     

@attribute A1 {e,f,g}
  @attribute A2数字
  @attribute A3数字
  @attribute A4 {positive,negative}

     

@data
  e,-100,100,正
为   f,-10,10,正
为   g,-90,90,负面

示例测试:

  

@relation test

     

@attribute B1 {b,a}
  @attribute B2数字
  @attribute B3 {good,bad}

     

@data
  b,100,好的   a,10,坏的   b,90,好

如果您保存上述培训和测试数据集,则可以使用以下代码查看基于训练数据构建的模型是否能够根据测试数据对实例进行分类。

import java.io.BufferedReader;
import java.io.FileReader;
import weka.classifiers.Classifier;
import weka.classifiers.bayes.NaiveBayes;
import weka.core.Instances;

public class Main {
    public static void main(String[] args) throws Exception {

        //
        // Load train data
        // 
        String readTrain = "someWhere/train.arff";
        BufferedReader readerTrain = new BufferedReader(new FileReader(readTrain));
        Instances train = new Instances(readerTrain);
        readerTrain.close();
        train.setClassIndex(train.numAttributes() - 1);         

        //
        // Load test data
        // 
        String readTest = "someWhere/test.arff";
        BufferedReader readerTest = new BufferedReader(new FileReader(readTest));
        Instances test = new Instances(readerTest);
        readerTest.close();
        test.setClassIndex(test.numAttributes() - 1);  

        // Create a naïve bayes classifier
        Classifier cModel = (Classifier)new NaiveBayes();
        cModel.buildClassifier(train);

        // Predict distribution of instance
        double[] fDistribution = cModel.distributionForInstance(test.instance(2));
        System.out.println("Prediction class 1: " + fDistribution[0]);
        System.out.println("Prediction class 2: " + fDistribution[1]);
    }
}

对于如何使用不同的数据源进行预测的任何解释,或者强制新实例与分类器的原始训练数据的格式相匹配的想法都是值得赞赏的。但是,我不想依赖Evaluation class

2 个答案:

答案 0 :(得分:1)

我知道这个问题已经过时了,但我的回答可能对其他人有帮助。

方法Instances.equalHeaders(Instances)正是您所寻找的。如果true兼容,则返回Instances,否则返回false

答案 1 :(得分:0)

如果能够[trainset.checkInstance(yourInstance)],您可以测试新实例与用于构建分类器的数据集。这保证了兼容性。如果训练集太大,您可以通过过滤执行它的子样本。这样,您可以测试是否有任何新实例符合分类器的要求。