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的
我去了链接,它说:
分类实例
如果您有一个未标记的数据集要用新训练的分类器进行分类,则可以使用以下代码段.它加载文件
/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 PlainText而StringBuffer不会显示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/ 对象打印的预测/分发信息NumericPrediction以StringBuffer您在资源管理器中或从命令行中看到的格式打印.
参考文献:
| 归档时间: |
|
| 查看次数: |
3267 次 |
| 最近记录: |