使用自己的 Java 代码在 WEKA 中获取风险预测



我已经检查了WEKA的">进行预测"文档,其中包含命令行和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

我无法复制这个结果,即使它说:

爪哇岛

如果要在自己的代码中执行分类,请参阅本文的分类实例部分,其中介绍了 Weka API 的一般情况。

我去了链接,它说:

对实例进行分类

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

这不是我想要的情况,因为我只想对当前数据集的k折交叉验证预测进行建模。


更新

predictions

public FastVector predictions()

返回已收集的预测。

返回:

对包含已收集预测的FastVector的引用。如果未收集任何预测,则此值应为 null。

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

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
...

这和上面的是一回事吗?

经过深入的谷歌搜索(并且因为文档提供的帮助很少),我终于找到了答案。

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

  • 对于示例代码,我看到了问题">如何在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);
    

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

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

    我要感谢ManChon U(Kevin)和他们的问题">如何将交叉评估结果识别到输入数据集中的相应实例?"为我提供了有关这意味着什么的线索:

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

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

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

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

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

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

  • 此外,evaluation.predictions()的结果与 WEKA GUI 中提供的结果不同。 幸运的是,Mark Hall 在问题">交叉验证后打印出预测类"中解释了这一点

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

引用:

  • ">交叉验证后打印出预测类">
  • ">如何将交叉评估结果识别到输入数据集中的相应实例?">
  • ">如何在WEKA中交叉验证后打印出预测类">

最新更新