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());

Результат становится правильным. Я очень удивлен! однако в большинстве документов функция для вставки атрибута не используется. Я хочу понять, почему результат вдруг стал правильным.


person zhenshun chen    schedule 23.11.2015    source источник


Ответы (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();     

Измените соответственно.

Спасибо

person Pandit    schedule 23.11.2015
comment
спасибо за вашу помощь. но результат все еще неверен на моем компьютере. Я забыл сказать вам, что test.csv не имеет значения класса. Если добавить последний столбец класса вручную, результат будет правильным. Я хочу предсказать результат, поэтому я не добавляю класс. - person zhenshun chen; 25.11.2015
comment
Согласно документации weka, последний столбец не имеет значения, добавляете вы или нет. Попробуйте преобразовать файл в .arff и просто укажите статус @attribute{PASS,FAIL} или любые другие значения, которые вы ожидаете. вы также можете скопировать значения класса для последнего столбца из тренировочного набора. и не добавляйте никаких значений в последний столбец. Ниже я добавлю код преобразования файлов. - person Pandit; 25.11.2015
comment
я отредактировал ответ. Пожалуйста, добавьте свой код. Чтобы я мог видеть, что не так. также вы можете конвертировать из графического интерфейса - person Pandit; 25.11.2015