在分类之后但在评估之前添加 weka 实例?

Adding weka instances after classification but before evaluation?

假设 X 是一个原始的、标记的(即带有训练标签的)数据集,并且 Process(X) returns 一组 Y 个实例 已使用属性编码并转换为 weka 友好文件,如 Y.arff.

还假设 Process() 有一些 'leakage': 某些实例 Leak = X-Y 无法一致编码,需要 获得默认分类 FOO。训练标签也以泄漏集而闻名。

我的问题是如何最好地将 Leak 中的实例引入到 一些分类器被应用到之后的 weka 评估流 子集 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);

也许这是折叠结果的具体例子 来自多个分类器?

根据您的 classifier,这可能非常简单! Weka 有一个名为 UpdateableClassifier 的接口,任何使用它的 class 都可以在构建后更新!以下 classes 实现了这个接口:

  • HoeffdingTree
  • IBk
  • 韩星
  • LWL
  • MultiClassClassifierUpdateable
  • 朴素贝叶斯多项式文本
  • 朴素贝叶斯多项式可更新
  • 朴素贝叶斯可更新
  • 新币
  • 新元文本

然后可以像下面这样更新它:

 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);
 }

赏金活动即将结束,但 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.Random)

然后你可以调用 buildClassifier() 来处理每个训练折叠,修改 测试折叠到你心中的内容,然后遍历实例 在测试折叠中使用 Evaluation.evaluateModelOnce() 或 Evaluation.evaluateModelOnceAndRecordPrediction()。后来的版本是 如果您需要曲线下面积汇总指标(因为这些 要求保留预测)。

http://weka.sourceforge.net/doc.stable/weka/classifiers/Evaluation.html#evaluateModelOnce(weka.classifiers.Classifier,%20weka.core.Instance)

http://weka.sourceforge.net/doc.stable/weka/classifiers/Evaluation.html#evaluateModelOnceAndRecordPrediction(weka.classifiers.Classifier,%20weka.core.Instance)