2011-09-06 39 views
4

一旦使用分類器進行了10次交叉驗證,如何打印出每個實例的預測類以及這些實例的分佈情況?如何在WEKA中進行交叉驗證後打印預測的類

J48 j48 = new J48(); 
Evaluation eval = new Evaluation(newData); 
eval.crossValidateModel(j48, newData, 10, new Random(1)); 

當我想類似的東西下面,它說,分類未建

for (int i=0; i<data.numInstances(); i++){ 
    System.out.println(j48.distributionForInstance(newData.instance(i))); 
} 

我試圖做的是相同的功能在WEKA GUI,其中一次分類器進行訓練,我可以點擊Visualize classifier error" > Save,我會發現文件中預測的類。但現在我需要它來使用我自己的Java代碼。


我已經試過類似如下:

J48 j48 = new J48(); 
Evaluation eval = new Evaluation(newData); 
StringBuffer forPredictionsPrinting = new StringBuffer(); 
weka.core.Range attsToOutput = null; 
Boolean outputDistribution = new Boolean(true); 
eval.crossValidateModel(j48, newData, 10, new Random(1), forPredictionsPrinting, attsToOutput, outputDistribution); 

然而,它會提示我的錯誤:

Exception in thread "main" java.lang.ClassCastException: java.lang.StringBuffer cannot be cast to weka.classifiers.evaluation.output.prediction.AbstractOutput 

回答

3

crossValidateModel()方法可以採取forPredictionsPrintingvarargs參數是weka.classifiers.evaluation.output.prediction.AbstractOutput實例。

其中重要的部分是一個StringBuffer來保存所有預測的字符串表示。以下代碼未經測試JRuby,但您應該可以將其轉換爲您的需要。

j48 = j48.new 
eval = Evalution.new(newData) 
predictions = java.lange.StringBuffer.new 
eval.crossValidateModel(j48, newData, 10, Random.new(1), predictions, Range.new('1'), true) 
# variable predictions now hold a string of all the individual predictions 
+1

但http://weka.sourceforge.net/doc/我沒有看到任何crossValidateModel選項,你的描述,你會介意點我到正確的文檔或某處我可以看到這種信息?欣賞!! – Kevin

+1

請參閱http://weka.sourceforge.net/doc.dev/weka/classifiers/Evaluation.html#crossValidateModel。 SO似乎沒有正確解析片段標識符,因此向下滾動到第一個crossValidateModel方法簽名。 – michaeltwofish

+1

請參閱我對該問題的編輯。我嘗試了一些W /你的建議...但它會提示我錯誤,不知道我做錯了什麼。請幫忙!!謝謝!! – Kevin

0

我前幾天被卡住了。我想使用矩陣來評估matlab中的Weka分類器,而不是從arf​​f文件加載。我使用http://www.mathworks.com/matlabcentral/fileexchange/21204-matlab-weka-interface和以下源代碼。我希望這可以幫助別人。

import weka.classifiers.*; 

import java.util.* 

wekaClassifier = javaObject('weka.classifiers.trees.J48'); 

wekaClassifier.buildClassifier(processed);%Loaded from loadARFF 

e = javaObject('weka.classifiers.Evaluation',processed);%Loaded from loadARFF 
myrand = Random(1); 
plainText = javaObject('weka.classifiers.evaluation.output.prediction.PlainText'); 
buffer = javaObject('java.lang.StringBuffer'); 
plainText.setBuffer(buffer) 
bool = javaObject('java.lang.Boolean',true); 
range = javaObject('weka.core.Range','1'); 
array = javaArray('java.lang.Object',3); 
array(1) = plainText; 
array(2) = range; 
array(3) = bool; 
e.crossValidateModel(wekaClassifier,testing,10,myrand,array) 
e.toClassDetailsString 

阿斯德魯瓦爾洛佩斯洲

0
clc 
clear 
%Load from disk 
fileDataset = 'cm1.arff'; 
myPath = 'C:\Users\Asdrubal\Google Drive\Respaldo\DoctoradoALCPC\Doctorado ALC PC\AlcMobile\AvTh\MyPapers\Papers2014\UnderOverSampling\data\Skewed\datasetsKeel\'; 
javaaddpath('C:\Users\Asdrubal\Google Drive\Respaldo\DoctoradoALCPC\Doctorado ALC PC\AlcMobile\JarsForExperiments\weka.jar'); 
wekaOBJ = loadARFF([myPath fileDataset]); 
%Transform from data into Matlab 
[data, featureNames, targetNDX, stringVals, relationName] = ... 
weka2matlab(wekaOBJ,'[]'); 
%Create testing and training sets in matlab format (this can be improved) 
[tam, dim] = size(data); 
idx = randperm(tam); 
testIdx = idx(1 : tam*0.3); 
trainIdx = idx(tam*0.3 + 1:end); 
trainSet = data(trainIdx,:); 
testSet = data(testIdx,:); 
%Trasnform the training and the testing sets into the Weka format 
testingWeka = matlab2weka('testing', featureNames, testSet); 
trainingWeka = matlab2weka('training', featureNames, trainSet); 
%Now evaluate classifier 
import weka.classifiers.*; 
import java.util.* 
wekaClassifier = javaObject('weka.classifiers.trees.J48'); 
wekaClassifier.buildClassifier(trainingWeka); 
e = javaObject('weka.classifiers.Evaluation',trainingWeka); 
myrand = Random(1); 
plainText = javaObject('weka.classifiers.evaluation.output.prediction.PlainText'); 
buffer = javaObject('java.lang.StringBuffer'); 
plainText.setBuffer(buffer) 
bool = javaObject('java.lang.Boolean',true); 
range = javaObject('weka.core.Range','1'); 
array = javaArray('java.lang.Object',3); 
array(1) = plainText; 
array(2) = range; 
array(3) = bool; 
e.crossValidateModel(wekaClassifier,testingWeka,10,myrand,array)%U 
e.toClassDetailsString 
相關問題