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

2 java machine-learning probability prediction weka

我已经检查了WEKA 的" 制作预测 "文档,它包含命令行和GUI预测的明确指令.

我想知道如何使用我自己的Java代码中的Agrawaldataset(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
Run Code Online (Sandbox Code Playgroud)

我不能复制这个结果,即使说:

Java的

如果你想在自己的代码中进行分类,看到分类情况的部分这篇文章,解释一般Weka的API.

我去了链接,它说:

分类实例

如果您有一个未标记的数据集要用新训练的分类器进行分类,则可以使用以下代码段.它加载文件/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);
}
Run Code Online (Sandbox Code Playgroud)

结果是:

...
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
...
Run Code Online (Sandbox Code Playgroud)

这与上面的一样吗?

小智 7

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

我希望这个明确的答案可以帮助其他人.

  • 对于示例代码,我看到了" 如何在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);
    
    Run Code Online (Sandbox Code Playgroud)

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

    StringBuffer只使用会导致java.lang.ClassCastException类似问题中的一个而使用a PlainTextStringBuffer不会显示a 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());
    
    Run Code Online (Sandbox Code Playgroud)

    其中predictionOutput是从一个对象AbstractOutput的家庭(PlainText,CSV,XML等).

  • 此外,结果evaluation.predictions()与WEKA GUI中提供的结果不同.幸运的马克·霍尔解释了这个问题中" 交叉验证后打印出的预测类 "

    Evaluation.predictions()返回FastVector包含包中的一个NominalPrediction或多个NumericPrediction对象weka.classifiers.evaluation.Evaluation.crossValidateModel()使用其他AbstractOutput对象调用会 导致评估对象将您从Nominal/ 对象打印的预测/分发信息NumericPredictionStringBuffer您在资源管理器中或从命令行中看到的格式打印.

参考文献: