2012-06-12 1 views
1

Я пытаюсь создать «автоматическую тренировку» с использованием java api из weka, но я думаю, что я делаю что-то не так, когда я тестирую свой файл ARFF через интерфейс Weka, используя MultiLayerPerceptron с 10 Cross Validation или 66% Percentage Split. Я получаю удовлетворительные результаты (около 90%), но когда я пытаюсь проверить один и тот же файл через API-интерфейс Weka, каждый тест возвращает в основном соответствие 0% (каждая строка возвращает false)расходящиеся результаты от обучения в нашей школе и обучения java

вот результат от графического интерфейса Weka в:

=== оценки на тест раскола === === Сводка ===

Correctly Classified Instances   78    91.7647 % 
Incorrectly Classified Instances   7    8.2353 % 
Kappa statistic       0.8081 
Mean absolute error      0.0817 
Root mean squared error     0.24 
Relative absolute error     17.742 % 
Root relative squared error    51.0603 % 
Total Number of Instances    85  

=== Детальная точность By класса ===

   TP Rate FP Rate Precision Recall F-Measure ROC Area Class 
       0.885  0.068  0.852  0.885  0.868  0.958 1 
       0.932  0.115  0.948  0.932  0.94  0.958 0 
Weighted Avg. 0.918  0.101  0.919  0.918  0.918  0.958 

=== Путаница Матрица ===

a b <-- classified as 
23 3 | a = 1 
    4 55 | b = 0 

и вот код, который я используя Java (на самом деле это на .NET с использованием IKVM):

var classifier = new weka.classifiers.functions.MultilayerPerceptron(); 
classifier.setOptions(weka.core.Utils.splitOptions("-L 0.7 -M 0.3 -N 75 -V 0 -S 0 -E 20 -H a")); //these are the same options (the default options) when the test is run under weka gui 

string trainingFile = Properties.Settings.Default.WekaTrainingFile; //the path to the same file I use to test on weka explorer 
weka.core.Instances data = null; 
data = new weka.core.Instances(new java.io.BufferedReader(new java.io.FileReader(trainingFile))); //loads the file 
data.setClassIndex(data.numAttributes() - 1); //set the last column as the class attribute 

cl.buildClassifier(data); 

var tmp = System.IO.Path.GetTempFileName(); //creates a temp file to create an arff file with a single row with the instance I want to test taken from the arff file loaded previously 
using (var f = System.IO.File.CreateText(tmp)) 
{ 
    //long code to read data from db and regenerate the line, simulating data coming from the source I really want to test 
} 

var dataToTest = new weka.core.Instances(new java.io.BufferedReader(new java.io.FileReader(tmp))); 
dataToTest.setClassIndex(dataToTest.numAttributes() - 1); 

double prediction = 0; 

for (int i = 0; i < dataToTest.numInstances(); i++) 
{ 
    weka.core.Instance curr = dataToTest.instance(i); 
    weka.core.Instance inst = new weka.core.Instance(data.numAttributes()); 
    inst.setDataset(data); 
    for (int n = 0; n < data.numAttributes(); n++) 
    { 
     weka.core.Attribute att = dataToTest.attribute(data.attribute(n).name()); 
     if (att != null) 
     { 
      if (att.isNominal()) 
      { 
       if ((data.attribute(n).numValues() > 0) && (att.numValues() > 0)) 
       { 
        String label = curr.stringValue(att); 
        int index = data.attribute(n).indexOfValue(label); 
        if (index != -1) 
         inst.setValue(n, index); 
       } 
      } 
      else if (att.isNumeric()) 
      { 
       inst.setValue(n, curr.value(att)); 
      } 
      else 
      { 
       throw new InvalidOperationException("Unhandled attribute type!"); 
      } 
     } 
    } 
    prediction += cl.classifyInstance(inst); 
} 

//prediction is always 0 here, my ARFF file has two classes: 0 and 1, 92 zeroes and 159 ones 

это смешно, потому что если я изменить классификатор, скажем, NaiveBayes результаты соответствуют тест сделанный через Век a's gui

ответ

4

Вы используете устаревший способ чтения в файлах ARFF. См. Это documentation. Попробуйте вместо этого:

import weka.core.converters.ConverterUtils.DataSource; 
... 
DataSource source = new DataSource("/some/where/data.arff"); 
Instances data = source.getDataSet(); 

Обратите внимание, что эта документация также показывает, как подключиться к базе данных напрямую, а обойти создание временных ARFF файлов. Вы можете, кроме того, читать из базы данных и вручную создавать экземпляры для заполнения экземпляра объекта.

Наконец, если просто изменить тип классификатора в верхней части кода на NaiveBayes, устраните проблему, а затем проверьте параметры в вашем weka gui для MultilayerPerceptron, чтобы узнать, отличаются ли они от значений по умолчанию (разные настройки могут привести к один и тот же тип классификатора для получения разных результатов).

Обновление: похоже, что вы используете разные тестовые данные в своем коде, чем в вашем графическом интерфейсе weka (из базы данных по сравнению с исходным учебным файлом); также может быть, что конкретные данные в вашей базе данных действительно выглядят как class 0 классификатору MLP. Чтобы убедиться, что это так, вы можете использовать интерфейс weka, чтобы разделить ваш тренировочный arff на набор поездов/тестов, а затем повторить исходный эксперимент в вашем коде. Если результаты совпадают с результатами gui, есть проблемы с вашими данными. Если результаты разные, тогда нам нужно более внимательно изучить код. Вы можете позвонить, это (from the Doc):

public Instances trainCV(int numFolds, int numFold) 
+0

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

1

У меня была та же проблема.

Weka дал мне разные результаты в Проводнике по сравнению с перекрестной проверкой на Java.

Что-то, что помогло:

Instances dataSet = ...; 
dataSet.stratify(numOfFolds); // use this 
     //before splitting the dataset into train and test set! 
+0

Здравствуйте, @ Dave, спасибо за ваш ответ!Вы можете [прочитать это руководство] (http://stackoverflow.com/help/how-to-answer) о написании ответов в StackOverflow в соответствии с его рекомендациями. Было бы также полезно, если бы вы могли расширить, почему 'dataSet.stratify (numOfFolds)' решил вашу проблему или объяснил, что она делает. Может быть, ссылка на документацию об этом :) –

 Смежные вопросы

  • Нет связанных вопросов^_^