【问题标题】:Get risk predictions in WEKA using own Java code使用自己的 Java 代码在 WEKA 中进行风险预测
【发布时间】:2014-02-20 20:27:53
【问题描述】:

我已经查看了 WEKA 的 "Making predictions" 文档,其中包含命令行和 GUI 预测的明确说明。

我想知道如何在我自己的 Java 代码中使用 Agrawal 数据集 (weka.datagenerators.classifiers.classification.Agrawal) 从 GUI 获得如下预测值:

inst#,  actual,     predicted,  error,  prediction
1,      1:0,        2:1,        +,      0.941
2,      1:0,        1:0,        ,       1
3,      1:0,        1:0,        ,       1
4,      1:0,        1:0,        ,       1
5,      1:0,        1:0,        ,       1
6,      1:0,        1:0,        ,       1
7,      1:0,        2:1,        +,      0.941
8,      2:1,        2:1,        ,       0.941
9,      2:1,        2:1,        ,       0.941
10,     2:1,        2:1,        ,       0.941
1,      1:0,        1:0,        ,       1
2,      1:0,        1:0,        ,       1
3,      1:0,        1:0,        ,       1

即使it 这么说,我也无法复制这个结果:

Java

如果您想在自己的代码中执行分类,请参阅 this articleclassifying instances 部分,对 Weka API 进行一般说明。

我去了link,它说:

分类实例

如果您有一个未标记的数据集要使用新训练的分类器进行分类,您可以使用以下代码 sn-p。它加载文件/some/where/unlabeled.arff,使用之前构建的分类器树来标记实例,并将标记的数据保存为/some/where/labeled.arff

这不是我想要的,因为我只想要对我当前的数据集建模的 k-fold 交叉验证预测。


更新

predictions

public FastVector predictions()

返回已收集的预测。

返回:

对包含已收集预测的FastVector 的引用。如果没有收集到预测,这应该为 null。

我找到了predictions() 类型对象的Evaluation 方法,并使用代码:

Object[] preds = evaluation.predictions().toArray();
for(Object pred : preds) {
    System.out.println(pred);
}

结果是:

...
NOM: 0.0 0.0 1.0 0.9466666666666667 0.05333333333333334
NOM: 0.0 0.0 1.0 0.8947368421052632 0.10526315789473684
NOM: 0.0 0.0 1.0 0.9934883720930232 0.0065116279069767444
NOM: 0.0 0.0 1.0 0.9466666666666667 0.05333333333333334
NOM: 0.0 0.0 1.0 0.9912575655682583 0.008742434431741762
NOM: 0.0 0.0 1.0 0.9934883720930232 0.0065116279069767444
...

这和上面的一样吗?

【问题讨论】:

    标签: java machine-learning weka probability prediction


    【解决方案1】:

    经过深入的 Google 搜索(并且因为 documentation provides minimal help),我终于找到了答案。

    我希望这个明确的答案在未来对其他人有所帮助。

    • 对于示例代码,我看到了问题"How to print out the predicted class after cross-validation in WEKA",我很高兴我能够解码其中一些难以理解的不完整答案。

      这是我的代码,与 GUI 的输出类似

      StringBuffer predictionSB = new StringBuffer();
      Range attributesToShow = null;
      Boolean outputDistributions = new Boolean(true);
      
      PlainText predictionOutput = new PlainText();
      predictionOutput.setBuffer(predictionSB);
      predictionOutput.setOutputDistribution(true);
      
      Evaluation evaluation = new Evaluation(data);
      evaluation.crossValidateModel(j48Model, data, numberOfFolds,
              randomNumber, predictionOutput, attributesToShow,
              outputDistributions);
      

      为了帮助您理解,我们需要实现StringBuffer 被强制转换为AbstractOutput 对象,以便函数crossValidateModel 可以识别它。

      仅使用StringBuffer 会导致java.lang.ClassCastException 与问题中的类似,而使用PlainText 而不使用StringBuffer 将显示java.lang.IllegalStateException

      我要感谢ManChon U (Kevin) 和他们的问题"How to identify the cross-evaluation result to its corresponding instance in the input data set?" 让我知道这意味着什么:

      ...您只需要一个添加参数,它是weka.classifiers.evaluation.output.prediction.AbstractOutput 的具体子类。 weka.classifiers.evaluation.output.prediction.PlainText 可能是 一个你想用的。 Source

      ...尝试创建一个PlainText 对象,它扩展AbstractOutput(例如称为输出)实例并调用output.setBuffer(forPredictionsPrinting) 并将其传递给缓冲区而不是缓冲区。 Source

      这些实际上只是为了创建一个 PlainText 对象,在其中放入一个 StringBuffer 并使用它通过 setOutput(boolean) 和其他方法调整输出。

      最后,要获得我们想要的预测,只需使用:

      System.out.println(predictionOutput.getBuffer());
      

      其中predictionOutput 是来自AbstractOutput 系列(PlainTextCSVXML 等)的对象。

    • 此外,evaluation.predictions() 的结果与 WEKA GUI 中提供的结果不同。幸运的是,Mark Hall 在问题 "Print out the predict class after cross-validation"

      中解释了这一点

      Evaluation.predictions() 返回一个FastVector,其中包含weka.classifiers.evaluation 包中的NominalPredictionNumericPrediction 对象。打电话 Evaluation.crossValidateModel() 和附加的AbstractOutput 对象导致评估对象以您在资源管理器中或从命令行中看到的格式将预测/分布信息从Nominal/NumericPrediction 对象打印到StringBuffer

    参考资料:

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2015-07-07
      • 2013-04-22
      • 1970-01-01
      • 2015-03-07
      • 2021-07-24
      • 2017-12-07
      • 2015-03-23
      相关资源
      最近更新 更多