【问题标题】:Adding weka instances after classification but before evaluation?在分类之后但在评估之前添加 weka 实例?
【发布时间】:2016-01-28 20:57:03
【问题描述】:

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

还假设Process() 有一些“泄漏”: 某些实例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);

也许这是一个将结果折叠在一起的具体示例 来自多个分类器?

【问题讨论】:

  • 我认为您应该参考以下链接的评估部分:weka.wikispaces.com/Use+WEKA+in+your+Java+code 它指出您不应该在使用交叉验证之前训练分类器,因为它负责训练分类器。
  • 再次感谢@Campino。所以我想我不应该在eval.crossValidateModel() 之前拨打classfr.buildClassifer(Y)。但这仍然不能帮助我理解如何将Leak-classified 实例与分类实例混合?查看Evaluation.java源代码...

标签: weka


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    • 霍夫丁树
    • IBk
    • 科斯塔
    • LWL
    • MultiClassClassifierUpdateable
    • NaiveBayesMultinomialText
    • NaiveBayesMultinomialUpdateable
    • NaiveBayesUpdateable
    • 新元
    • 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);
     }
    

    【讨论】:

    • 感谢您的回复@campino。但除非我遗漏了什么,这只是这些分类器的增量添加接口,添加新的 UNCLASSIFIED 实例?我寻求一种注入 CLASSIFIED 实例的方法,以便它们包含在同一个 EVALUATION 中?
    • 它是增量分类模型的接口,可以一次使用一个实例进行学习。但是updateClassifier 方法使用给定实例更新分类器。
    • 但我不希望分类器完成它的分类工作:我希望其他分类的实例只是被评估的实例集的一部分。
    猜你喜欢
    • 2016-08-22
    • 2015-12-12
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多