使用java的多线程交叉验证

使用java的多线程交叉验证,java,machine-learning,weka,Java,Machine Learning,Weka,我正在使用Java线程来实现Weka交叉验证(10倍CV),但很难理解平均部分在方法EvaluateModel()中发生的位置 我需要确保每个线程都有自己的错误率副本,然后在线程完成执行时执行平均值。根据您在这里描述的方法,您必须在多线程概念中尝试 您必须创建接受模型和测试数据集的线程 EvaluateThread t1 = new EvaluateThread(threadName,model,testDataset1); EvaluateThread t2 = new EvaluateThr

我正在使用Java线程来实现Weka交叉验证(10倍CV),但很难理解平均部分在方法
EvaluateModel()中发生的位置


我需要确保每个线程都有自己的错误率副本,然后在线程完成执行时执行平均值。

根据您在这里描述的方法,您必须在多线程概念中尝试

您必须创建接受模型和测试数据集的线程

EvaluateThread t1 = new EvaluateThread(threadName,model,testDataset1);
EvaluateThread t2 = new EvaluateThread(threadName,model,testDataset2);
EvaluateThread t3 = new EvaluateThread(threadName,model,testDataset3);
然后创建同步方法,以便每个线程都可以独立地访问该方法

像这样的

public synchronized double calculateError(model, dataset){
       // do your stuff for e.g. calculate error
       return error;
}
最后计算每个线程的平均误差。
有关同步方法的更多信息,请检查此项。

Weka有10倍交叉验证选项。勾选“是”,但这并没有提供足够的细节来说明ModelEvaluate方法是如何工作的。在(评估类)中,折叠数的除法是的,这就是我所做的,我实现了Runnable接口,在Run方法中,我为weka添加了crossvalidatemethod,运行中的最后一个方法称为EvaluateModel(),它返回一个双数组,用于预测值,称为predicted[]。我不确定这种方法是否会对每次折叠收集的误差进行平均,以及预测数组中的值意味着什么!请你发布一个小片段,以便我能理解更多。好吧,为了让它更清楚,我创建了一个名为Eval_Thread的新类,它实现了Runnable接口,在这个类的Run方法中,我做了以下
Instances train=data.trainCV(numFolds,I,random);setPriors(列车);Classifier copiedClassifier=AbstractClassifier.makeCopy(分类器);复制分类器。构建分类器(训练);实例test=data.testCV(numFolds,i);评价模型(复制分类器,测试);根据您的解释,您得到的是双数组(double[]),根据weka的文档,double[]是由分类器完成的预测,请澄清您想要的错误率或交叉验证参数,如精度召回。我相信你不会把预测平均化。我想做的是让每一根线都有一个折叠,然后分别做这项工作。最后收集每个线程的结果。因此,如果weka的evaluatemodel方法进行平均并返回预测数组,这意味着我不能在运行中使用此方法,这意味着它不能是多线程的