WEKA IBk неправильно Результаты для EditDistance (расстояние Левенштейна) - JAVA - PullRequest
0 голосов
/ 11 декабря 2018

Я очень новичок в WEKA и сегодня попробовал IBk-алгоритм для классификации строк в разные классы с помощью функции расстояния Левенштейна-расстояния.Однако я получаю очень плохие результаты.Моим входам всегда присваивается один и тот же класс (класс b), который вообще не корректен.Может кто-нибудь сказать мне, что я делаю неправильно?

В настоящее время мой Код очень прост:

        CSVLoader loader = new CSVLoader();
        loader.setSource(new File("current_path"));
        Instances data = loader.getDataSet();

        int numberAttributes = data.numAttributes();
        data.setClassIndex(data.numAttributes() - 1);
        EditDistance newWeka = new EditDistance();

        IBk ibk = new IBk(1);
        ((IBk) ibk).getNearestNeighbourSearchAlgorithm().setDistanceFunction(newWeka); 
        ibk.setCrossValidate(false);
        ibk.setMeanSquared(false);
        ibk.buildClassifier(data);

        System.out.println(ibk);


        Evaluation eval = new Evaluation(data);
        eval.evaluateModel(ibk, data);

Результат:

** KNN Demo  **

Correctly Classified Instances           4               50      %
Incorrectly Classified Instances         4               50      %
Kappa statistic                          0     
Mean absolute error                      0.398 
Root mean squared error                  0.4449
Relative absolute error                 97.2913 %
Root relative squared error             99.5586 %
Total Number of Instances                8     

=== Detailed Accuracy By Class ===

                 TP Rate  FP Rate  Precision  Recall   F-Measure  MCC      ROC Area  PRC Area  Class
                 0,000    0,000    ?          0,000    ?          ?        0,500     0,375     Surname
                 1,000    1,000    0,500      1,000    0,667      ?        0,500     0,500     Firstname
                 0,000    0,000    ?          0,000    ?          ?        0,500     0,125     Job
Weighted Avg.    0,500    0,500    ?          0,500    ?          ?        0,500     0,406     

=== Confusion Matrix ===

 a b c   <-- classified as
 0 3 0 | a = Surname
 0 4 0 | b = Firstname
 0 1 0 | c = Job

Файл:

"Attribute","class"
"Wellbrock","Surname"
"Kohler","Surname"
"Sanger","Surname"
"Jan","Firstname"
"Anna","Firstname"
"Tim","Firstname"
"Schmidt","Firstname"
"Consultant","Job"

очень ценю вашу помощь

1 Ответ

0 голосов
/ 12 декабря 2018

Я нашел решение самостоятельно.Проблема в том, что для API JAVA стандартным алгоритмом поиска является Zero-R, который всегда классифицирует все атрибуты для самого существующего класса.

Я добавил эту строку в свой код, теперь результат такой, как и ожидалось:ibk.setNearestNeighbourSearchAlgorithm (новый LinearNNSearch ());

=== Confusion Matrix ===

 a b c   <-- classified as
 3 0 0 | a = Surname
 0 4 0 | b = Firstname
 0 0 6 | c = Job
...