2016-06-27 10 views
0

Я написал код для SVM на Java с помощью Eclipse, Вот мой код:Weka - ошибка на Java для SVM

import weka.core.Instances; 
import java.util.Random; 
import weka.core.converters.ConverterUtils.DataSource; 
import weka.classifiers.trees.J48; 
import weka.classifiers.evaluation.*; 
import weka.classifiers.functions.SMO; 

public class Evaluate { 

    public static void main (String args [])throws Exception{ 

    DataSource source = new DataSource("/Users/kdash/workspace/Weka/Negative.arff"); 
    Instances dataset = source.getDataSet(); 

    //set class index to last attribute 

    dataset.setClassIndex(dataset.numAttributes()-1); 

    //Create Classifier 

    //J48 tree = new J48(); 
    //tree.buildClassifier(dataset); 

    SMO svm = new SMO(); 
    svm.buildClassifier(dataset); 

    Evaluation eval = new Evaluation(dataset); 

    // test dataset 

    DataSource source1 = new DataSource("/Users/kdash/workspace/Weka/Negative.arff"); 
    Instances testDataset = source1.getDataSet(); 

    testDataset.setClassIndex(testDataset.numAttributes() -1); 
    eval.evaluateModel(svm, testDataset); 

    System.out.println(eval.toSummaryString("Evaluation: \n", false)); 

    System.out.println("Correct % = " + eval.pctCorrect()); 
    System.out.println("Incorrect % = " + eval.pctIncorrect()); 

    System.out.println("AUC % = " + eval.areaUnderROC(1)); 
    System.out.println("Kappa % = " + eval.kappa()); 
    System.out.println("MAE % = " + eval.meanAbsoluteError()); 
    System.out.println("RMSE % = " + eval.rootMeanSquaredError()); 
    System.out.println("RAE % = " + eval.relativeAbsoluteError()); 
    System.out.println("RRSE % = " + eval.rootRelativeSquaredError()); 

    System.out.println("Precision % = " + eval.precision(1)); 
    System.out.println("Recall % = " + eval.recall(1)); 
    System.out.println("F-Measure % = " + eval.fMeasure(1)); 
    System.out.println("Error rate % = " + eval.errorRate()); 

    //confusion matrix 
     System.out.println(eval.toMatrixString("Overall Confusion Matrix === \n")); 
    } 

} 

, но я получаю следующее сообщение об ошибке:

Exception in thread "main" weka.core.UnsupportedAttributeTypeException: 

weka.classifiers.functions.SMO: Cannot handle numeric class! at weka.core.Capabilities.test(Capabilities.java:953) at weka.core.Capabilities.test(Capabilities.java:1109) at weka.core.Capabilities.test(Capabilities.java:1022) at weka.core.Capabilities.testWithFail(Capabilities.java:1301) at weka.classifiers.functions.SMO.buildClassifier(SMO.java:1250) at Evaluate.main(Evaluate.java:25)

Мой набор данных содержит три разные строки 1. Полярность (-1) для всех строк 2. Class - Отрицательные появление 3. Слово

ответ

0

Пример набора данных:

появлений: 1 Класс: -1 Полярность: Отрицательная

+0

отредактируйте свой вопрос, чтобы добавить соответствующие данные вместо написание ответа .. – Sid

0

Я не знаю, как ARFF-файл точно организован, но ошибка предполагает, что последний атрибут (где индекс класса устанавливается в) является числовым (например, количество вхождений слов)

SVM не может быть построен с числовыми классами. Попробуйте установить правый индекс класса (в зависимости от файла arff) или изменить arff-заголовок (если правильный индекс класса присваивается неправильному типу (числовому).