2015-12-09 7 views
1

Я использую jRip для классификации немаркированных экземпляров. Помимо класса, я хочу знать, какое правило было инициировано. С помощью методов cover() я знаю, если экземпляр включен в правило, которое, похоже, работает. Но когда я хочу напечатать правило, читаемое человеком, используя метод toString (classAttr), он показывает неправильный результат. Мой кодJRip.RipperRule.toString (classAttr) дает неправильный результат

FastVector ruleset = rip.getRuleset(); 
for (int j = 0; j < ruleset.size(); j++) { 
    JRip.RipperRule rule = (JRip.RipperRule) ruleset.elementAt(j); 

    System.out.println("consequent of the rule: " + rule.getConsequent()); 
    System.out.println("rule:" + rule.toString(unlabeled.classAttribute()) + " /// covers = " + rule.covers(unlabeled.instance(i))); 
} 

Когда я итерацию по набору правил, используя код выше, я получаю:

==================================================================== 
consequent of the rule: 0.0 
rule:(humidity = high) and (outlook = sunny) => play=yes /// covers = false 
==================================================================== 
consequent of the rule: 0.0 
rule:(outlook = rainy) and (windy = TRUE) => play=yes /// covers = false 
==================================================================== 
consequent of the rule: 1.0 
rule: => play=no /// covers = true 

При использовании:

System.out.println(rip.toString()); 

я получаю (что правильно):

(humidity = high) and (outlook = sunny) => play=no (3.0/0.0) 
(outlook = rainy) and (windy = TRUE) => play=no (2.0/0.0) 
=> play=yes (9.0/0.0) 

Проблема в том, что в первом журнале i t говорит play => yes, когда он на самом деле играет => нет.

Я использую data.nominal.arff dataset (поставляется с Weka).

ответ

0

В то время как JRip создает классификатор (см. Метод buildClassifier), он переупорядочивает атрибут класса в порядке возрастания «наиболее часто». Насколько я могу судить, вы не переупорядочиваете атрибут класса, который вы предоставляете rule.toString().

Чтобы сохранить их одинаковыми, вы должны изменить порядок атрибута класса, прежде чем передавать его правилу.toString()