在分类之后但在评估之前添加 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() 可用于创建
褶皱:
然后你可以调用 buildClassifier() 来处理每个训练折叠,修改
测试折叠到你心中的内容,然后遍历实例
在测试折叠中使用 Evaluation.evaluateModelOnce()
或 Evaluation.evaluateModelOnceAndRecordPrediction()。后来的版本是
如果您需要曲线下面积汇总指标(因为这些
要求保留预测)。
假设 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() 可用于创建 褶皱:
然后你可以调用 buildClassifier() 来处理每个训练折叠,修改 测试折叠到你心中的内容,然后遍历实例 在测试折叠中使用 Evaluation.evaluateModelOnce() 或 Evaluation.evaluateModelOnceAndRecordPrediction()。后来的版本是 如果您需要曲线下面积汇总指标(因为这些 要求保留预测)。