Java ClassifyInstance()方法错误

Java ClassifyInstance()方法错误,java,machine-learning,classification,weka,Java,Machine Learning,Classification,Weka,对于下面的代码,classifyInstance()行给出了一个错误: Exception in thread "main" java.lang.NullPointerException at weka.classifiers.functions.LinearRegression.classifyInstance(LinearRegression.java:272) at LR.main(LR.java:45) 我试图调试,但没有成功。如何使用保存的模型预测测试文件的类属性?这

对于下面的代码,classifyInstance()行给出了一个错误:

Exception in thread "main" java.lang.NullPointerException
    at weka.classifiers.functions.LinearRegression.classifyInstance(LinearRegression.java:272)
    at LR.main(LR.java:45)
我试图调试,但没有成功。如何使用保存的模型预测测试文件的类属性?这个问题是基于回归的

for (int i = 0; i < unlabeled.numInstances(); i++) {
    double clsLabel = cls.classifyInstance(unlabeled.instance(i));
    labeled.instance(i).setClassValue(clsLabel);
    System.out.println(clsLabel + " -> " + unlabeled.classAttribute().value((int) clsLabel));
}
for(int i=0;i”+未标记的.classAttribute().value((int)clsLabel));
}
这是实际代码:

public class LR{
    public static void main(String[] args) throws Exception
    {
        BufferedReader datafile = new BufferedReader(new FileReader("C:\\dataset.arff"));
        Instances data = new Instances(datafile);

        data.setClassIndex(data.numAttributes()-1);    //setting class attribute
        datafile.close();

        LinearRegression lr = new LinearRegression();  //build model
        int folds=10;

        Evaluation eval = new Evaluation(data);
        eval.crossValidateModel(lr, data, folds, new Random(1));
        System.out.println(eval.toSummaryString()); 

        //save the model
        weka.core.SerializationHelper.write("C:\\lr.model", lr);

        //load the model
        Classifier cls = (Classifier)weka.core.SerializationHelper.read("C:\\lr.model");


        Instances unlabeled = new Instances(new BufferedReader(new FileReader("C:\\testfile.arff")));
        // set class attribute
        unlabeled.setClassIndex(unlabeled.numAttributes() - 1);
        // create copy
        Instances labeled = new Instances(unlabeled);
        double clsLabel;
        // label instances
        for (int i = 0; i < unlabeled.numInstances(); i++) 
        {
            clsLabel = cls.classifyInstance(unlabeled.instance(i));
            labeled.instance(i).setClassValue(clsLabel);
            System.out.println(clsLabel + " -> " + unlabeled.classAttribute().value((int) clsLabel));
        }
        // save labeled data
        BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\final.arff"));
        writer.write(labeled.toString());
        writer.newLine();
        writer.flush();
        writer.close();
    }
}   
公共类LR{
公共静态void main(字符串[]args)引发异常
{
BufferedReader数据文件=新的BufferedReader(新文件读取器(“C:\\dataset.arff”);
实例数据=新实例(数据文件);
data.setClassIndex(data.numAttributes()-1);//设置类属性
datafile.close();
LinearRegression lr=新的LinearRegression();//构建模型
整数倍=10;
评估eval=新评估(数据);
评估交叉验证模型(lr,数据,褶皱,新随机(1));
System.out.println(eval.toSummaryString());
//保存模型
write(“C:\\lr.model”,lr);
//加载模型
分类器cls=(分类器)weka.core.SerializationHelper.read(“C:\\lr.model”);
实例未标记=新实例(新BufferedReader(新文件读取器(“C:\\testfile.arff”));
//设置类属性
未标记的.setClassIndex(未标记的.numAttributes()-1);
//创建副本
已标记的实例=新实例(未标记);
双clsLabel;
//标签实例
for(int i=0;i”+未标记的.classAttribute().value((int)clsLabel));
}
//保存带标签的数据
BufferedWriter writer=新的BufferedWriter(新文件写入程序(“C:\\final.arff”);
writer.write(标记为.toString());
writer.newLine();
writer.flush();
writer.close();
}
}   

您是否培训了分类器


在我看来,您正在尝试分类,但没有训练分类器。

可能重复的内容我已经看到了该帖子,但我无法找到此处可能的空值。您将
null
传递给
cls.classifyInstance()
。检查
未标记的值。实例(i)
哦,好吧!我想stacktrace中第一个提到的类是你的。很抱歉您的类似乎是
LR
。错误发生在这个类的第45行。看那里@lrnzcig m_checksTurnedOff不能具有值
null
,因为它是一个基本
booelan
。不幸的是,我们不知道@user553874使用了什么版本,他没有包括最基本的调试信息-版本号,以及出现问题的代码。或者,对于空指针异常:在这个问题上哪个变量为空…+1,如果您只进行求值,则不需要训练分类器,因为
crossValidateModel
进行训练,但是,您正在保存和加载分类器。在保存之前,必须使用
buildClassifier
方法对分类器进行训练。为什么要在保存之前对分类器进行训练?交叉验证法不是已经训练过了吗?我是Weka的新手,所以如果你能用外行的语言解释我,并帮助我编写代码?crossValidate模拟训练10个分类器,测试它们,然后丢弃它们。这是一种评估方法。