假设X
是一个原始的、标记的(即带有训练标签)数据集,Process(X)
返回一组Y
实例已经用属性编码并转换为像Y.arf.这样的weka友好文件
还假设Process()
有一些"泄漏":某些实例Leak = X-Y
无法一致编码,需要以获得默认分类CCD_ 6。训练标签也适用于泄漏集。
我的问题是如何最好地将Leak的实例引入weka评估流AFTER一些分类器已应用于子集Y
,使用其默认值折叠Leak
实例分类标签,在对整套X
进行评估之前?代码中:
DataSource LeakSrc = new DataSource("leak.arff");
Instances Leak = LeakSrc.getDataSet();
DataSource Ysrc = new DataSource("Y.arff");
Instances Y = Ysrc.getDataSet();
classfr.buildClassifer(Y)
// YunionLeak = ??
eval.crossValidateModel(classfr, YunionLeak);
也许这是一个将结果折叠在一起的具体例子来自多个分类器?
赏金即将结束,但Mark Hall在另一个论坛上(http://list.waikato.ac.nz/pipermail/wekalist/2015-November/065348.html)应该算是目前的答案:
您需要实现构建用于交叉验证的分类器在您的代码中。您仍然可以使用评估对象来计算不过,修改后的测试会折叠起来,因为它计算的统计数据都是添加剂Instances.trainCV()和Instances.testCV()可用于创建折叠:
http://weka.sourceforge.net/doc.stable/weka/core/Instances.html#trainCV(int,%20int,%20java.util.Rondom)
然后可以调用buildClassifier()来处理每个训练折叠,修改测试让您满意,然后在实例上迭代在测试折叠中,同时使用Evaluation.evalateModelOnce()或Evaluation.eevaluateModelOnceAndRecordPrediction()。更高版本是如果您需要曲线下面积汇总指标(如下需要保留预测)。
http://weka.sourceforge.net/doc.stable/weka/classifiers/Evaluation.html#evaluateModelOnce(weka.Classifier.Classifier,%20weka.core.Istance)
http://weka.sourceforge.net/doc.stable/weka/classifiers/Evaluation.html#evaluateModelOnceAndRecordPrediction(weka.classers.Classifier,%20weka.core.Istance)
根据您的分类器,这可能非常容易!Weka有一个名为UpdateableClassifier
的接口,任何使用它的类都可以在构建后更新!以下类实现此接口:
- HoeffdingTree
- IBk
- KStar
- LWL
- MultiClassClassClassifierUpdateable
- NaiveBayesMultinomialText
- NaiveBayesMultinomialUpdateable
- NaiveBayes可更新
- SGD
- SGD文本
然后可以更新如下:
ArffLoader loader = new ArffLoader();
loader.setFile(new File("/data/data.arff"));
Instances structure = loader.getStructure();
structure.setClassIndex(structure.numAttributes() - 1);
NaiveBayesUpdateable nb = new NaiveBayesUpdateable();
nb.buildClassifier(structure);
Instance current;
while ((current = loader.getNextInstance(structure)) != null) {
nb.updateClassifier(current);
}