Java 验证实例与Weka分类器的兼容性

Java 验证实例与Weka分类器的兼容性,java,weka,Java,Weka,我需要构建一个分类器,然后使用它来预测未来的实例。不幸的是,我注意到未来的实例不需要与源训练数据的格式匹配 如何利用训练数据和新实例之间的差异进行预测? 列车示例: @关系序列 @属性A1{e,f,g} @属性A2数值 @属性A3数值 @属性A4{正,负} @数据 e、 -100,100,阳性 f、 -10,10,阳性 g、 -90,90,负片 示例测试: @关系检验 @属性B1{b,a} @属性B2数值 @属性B3{good,bad} @数据 b、 100,很好 a、 10,坏 b、 90,很

我需要构建一个分类器,然后使用它来预测未来的实例。不幸的是,我注意到未来的实例不需要与源训练数据的格式匹配

如何利用训练数据和新实例之间的差异进行预测?

列车示例:

@关系序列

@属性A1{e,f,g}
@属性A2数值
@属性A3数值
@属性A4{正,负}

@数据
e、 -100,100,阳性
f、 -10,10,阳性
g、 -90,90,负片

示例测试:

@关系检验

@属性B1{b,a}
@属性B2数值
@属性B3{good,bad}

@数据
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]);
    }
}

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

您可以测试一个新实例与用于构建分类器的数据集,如果可以的话[trainset.checkInstance(yourInstance)]。这保证了兼容性。如果训练集太大,您可以通过筛选执行它的子样本。通过这种方式,您可以测试任何新实例是否满足分类器的要求。

我知道这个问题很老,但我的答案可能会帮助其他人


方法
Instances.equalHeaders(Instances)
就是您要查找的。如果两个
实例都兼容,则返回
true
,否则返回
false

非常有趣的问题。只需补充一点,如果您在测试集上构建模型并在训练集上测试它,那么它将不起作用。此外,如果在代码中使用SMO而不是NaiveBayes,则会出现预期的错误消息:属性不匹配!