trabajar - weka java
Cómo imprimir la clase predicha después de la validación cruzada en WEKA (3)
Una vez que se realiza una validación cruzada de 10 veces con un clasificador, ¿cómo puedo imprimir la clase predicha de cada instancia y la distribución de estas instancias?
J48 j48 = new J48();
Evaluation eval = new Evaluation(newData);
eval.crossValidateModel(j48, newData, 10, new Random(1));
Cuando probé algo similar a lo de abajo, decía que el clasificador no está construido .
for (int i=0; i<data.numInstances(); i++){
System.out.println(j48.distributionForInstance(newData.instance(i)));
}
Lo que intento hacer es la misma función que en WEKA GUI, donde una vez que un clasificador está entrenado, puedo hacer clic en Visualize classifier error" > Save
y encontraré la clase predicha en el archivo. Pero ahora lo necesito para trabajar en mi propio código Java.
He intentado algo como a continuación:
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);
Sin embargo, me incita el error:
Exception in thread "main" java.lang.ClassCastException: java.lang.StringBuffer cannot be cast to weka.classifiers.evaluation.output.prediction.AbstractOutput
El método crossValidateModel()
puede tomar un parámetro forPredictionsPrinting
varargs
que es una instancia de weka.classifiers.evaluation.output.prediction.AbstractOutput
.
La parte importante de eso es un StringBuffer
para contener una representación de cadena de todas las predicciones. El siguiente código está en JRuby
no probado, pero debería poder convertirlo para sus necesidades.
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
Estuve atascado hace algunos días. Quería evaluar un clasificador Weka en matlab usando una matriz en lugar de cargar desde un archivo arff. Uso http://www.mathworks.com/matlabcentral/fileexchange/21204-matlab-weka-interface y el siguiente código fuente. Espero que esto ayude a alguien más.
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
Asdrúbal López-Chau
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