WEKA: получить класс из classifyInstance, почему это неправильно
Я тренируюсь и создаю модель J48 с использованием WEKA Java Api. Затем я использую classifyInstance() для классификации моего экземпляра. но результат неправильный. мой идентификатор кода следующий:
Instances train = reader.getDataSet();
Instances test = reader_test.getDataSet();
train.setClassIndex(train.numAttributes() - 1);
Classifier cls = new J48();
cls.buildClassifier(train);
test.setClassIndex(test.numAttributes() - 1);
for(int i = 0; i < test.numInstances(); i++){
Instance inst = test.instance(i);
double result = cls.classifyInstance(inst);
System.out.println(train.classAttribute().value((int)r));
}
Результат всегда равен 0.0
Наконец, я использую test.insertAttributeAt() перед test.setClassIndex(). следующим образом:
test.insertAttributeAt(train.attribute(train.numAttributes() - 1), test.numAttributes());
Результат стал правильным. Я очень удивлен! однако большинство документов не используют функцию для вставки атрибута. Я хочу понять, почему результат стал правильным внезапно.
1 ответ
Это поможет вам.
BufferedReader datafile = readDataFile(TrainingFile);
Instances train = new Instances(datafile);
data.setClassIndex(data.numAttributes() - 1);
Classifier cls = new J48();
cls.buildClassifier(train);
DataSource testDataset = new DataSource(Test);
Instances test = testDataset.getDataSet();
Testdata.setClassIndex(Testdata.numAttributes() - 1);
for(int i = 0; i < test.numInstances(); i++){
Instance inst = test.instance(i);
double actualClassValue = test.instance(i).classValue();
//it will print your class value
String actual=test.classAttribute().value((int)actualClassValue);
double result = cls.classifyInstance(inst);
//will print your predicted value
String prediction=test.classAttribute().value((int)result );
}
вам не нужно использовать insertAttributeAt
сейчас.
Код преобразования файлов
// load CSV
CSVLoader loader = new CSVLoader();
String InputFilename = "TrainingFileName";
loader.setSource(new File(InputFilename));
Instances data = loader.getDataSet();
// save ARFF
ArffSaver saver = new ArffSaver();
saver.setInstances(data);
String FileT = Filename+".arff";
saver.setFile(new File(Path+Directory+"\\"+FileT));
saver.writeBatch();
Измените соответственно.
Спасибо