我想对我在使用的几个分类器进行n折交叉验证。我在WEKA Wiki上找到了示例代码(这是WekaDemo.java),但这个示例在运行验证之前应用了一个过滤器。这是否总是需要做的,还是说这不是必需的?
这是代码的一部分:
/** * 在训练文件上运行10折交叉验证 */ public void execute() throws Exception { // 运行过滤器 m_Filter.setInputFormat(m_Training); Instances filtered = Filter.useFilter(m_Training, m_Filter); // 在完整文件上训练分类器以生成树 m_Classifier.buildClassifier(filtered); // 使用种子=1进行10折交叉验证 m_Evaluation = new Evaluation(filtered); m_Evaluation.crossValidateModel( m_Classifier, filtered, 10, m_Training.getRandomNumberGenerator(1)); }
这种评估分类器性能的方法是否可以接受?
回答:
我认为这是不好的做法。如果过滤器依赖于/使用类信息,那么交叉验证的估计将(可能非常)乐观地偏向,因此可能毫无用处。举个极端的例子,想象一下在数据中添加类属性的副本。在几乎所有情况下,如果你使用weka.classifiers.meta.FilteredClassifier会更好更安全,你引用的同一Wiki页面上有一个如何使用它的示例。
祝好,Bernhard