我已经检查了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
,而使用没有StringBuffer
的PlainText
将显示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
族(PlainText
、CSV
、XML
等)的对象。 -
此外,
evaluation.predictions()
的结果与 WEKA GUI 中提供的结果不同。 幸运的是,Mark Hall 在问题">交叉验证后打印出预测类"中解释了这一点Evaluation.predictions()
返回包含weka.classifiers.evaluation
包中的NominalPrediction
或NumericPrediction
对象的FastVector
。叫 使用附加AbstractOutput
对象Evaluation.crossValidateModel()
会导致评估对象以您在资源管理器或命令行中看到的格式将预测/分布信息从Nominal
/NumericPrediction
对象打印到StringBuffer
。
引用:
- ">交叉验证后打印出预测类">
- ">如何将交叉评估结果识别到输入数据集中的相应实例?">
- ">如何在WEKA中交叉验证后打印出预测类">