Scikit-multilearn MEKA-Wrapper: meka.classifiers.multilable.meta.CM - PullRequest
0 голосов
/ 19 марта 2019

В настоящее время я использую scikit-multilearn для классификации нескольких меток. Я должен использовать meka.classifiers.multilabel.CM в качестве meka_classifier.
Но когда я запускаю свой код, я получаю разные ошибки и не понимаю, почему ..

meka = Meka(
    meka_classifier="meka.classifiers.multilabel.meta.CM",
    weka_classifier = "weka.classifiers.trees.J48", 
    meka_classpath = meka_classpath#, #obtained via download_meka
)
print("Fit")
meka.fit(X_train, y_train)

Я должен сказать, что рабочие и пути (Weka & Java (через wichcraft)) работают. Если я обменяю meka_classifier на BR, все работает.
После запуска кода я получаю следующее сообщение об ошибке:

weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.J48: Cannot handle numeric class!
at weka.core.Capabilities.test(Capabilities.java:1067)
at weka.core.Capabilities.test(Capabilities.java:1256)
at weka.core.Capabilities.test(Capabilities.java:1138)
at weka.core.Capabilities.testWithFail(Capabilities.java:1468)
at weka.classifiers.trees.J48.buildClassifier(J48.java:277)
at meka.classifiers.multilabel.meta.CM.buildClassifier(CM.java:50)
at meka.classifiers.multilabel.Evaluation.runExperiment(Evaluation.java:229)
at meka.classifiers.multilabel.ProblemTransformationMethod.runClassifier(ProblemTransformationMethod.java:172)
at meka.classifiers.multilabel.ProblemTransformationMethod.evaluation(ProblemTransformationMethod.java:152)
at meka.classifiers.multilabel.meta.CM.main(CM.java:83)

Странно, что в нем говорится, что он не может обрабатывать числовые значения, потому что, если я перехожу на BR, у классификатора не возникает проблем с (одинаковыми) данными.
Над сообщением об ошибке также есть текст о том, как использовать классификатор (параметры). Поэтому я попробовал это по-другому:

meka = Meka(
    meka_classifier = "meka.classifiers.multilabel.meta.CM  -I 10 -W meka.classifiers.multilabel.CC - -S 0 -W weka.classifiers.trees.J48", 
    #weka_classifier = "weka.classifiers.trees.J48", 
    meka_classpath = meka_classpath#, #obtained via download_meka
)

 print("Fit Data")
 meka.fit(X_train, y_train)

 print("Predict")
 prediction = meka.predict(x_test)

Командная строка с weka_classifier есть, потому что я пробовал это по-разному (исключил J48 из meka_classifier и включил его туда). В любом случае, я всегда получаю ту же ошибку:

Traceback (most recent call last):
File "C:/Users/*****/Desktop/MachineLearningClassifier/blabla.py", line 72, in <module>
prediction = meka.predict(x_test)
File "D:\Users\*****\AppData\Local\Programs\Python\Python36\lib\site-packages\skmultilearn\ext\meka.py", line 314, in predict
self._parse_output()
File "D:\Users\*****\AppData\Local\Programs\Python\Python36\lib\site-packages\skmultilearn\ext\meka.py", line 374, in _parse_output
predictions = self.output_.split(predictions_split_head)[1].split(
IndexError: list index out of range

Я искал эту ошибку и там, где люди установили arff вместо liac-arff, но здесь это не так. И да, как я уже сказал, если я перехожу на BR или что-то еще, все работает. Это просто не работает с CM. Я не знаю, что делать сейчас ... Я надеюсь, что кто-то может помочь. Заранее спасибо!

С наилучшими пожеланиями

EDIT:
После подгонки () я позволил мне напечатать meka.classifier_dump , и, используя второй код, который я разместил, он пуст! Я проверял это с другими, такими как BR, и там не пусто. Итак, я полагаю, что я делаю что-то не так при создании классификатора?

1 Ответ

0 голосов
/ 21 марта 2019

Ошибка weka.core.UnsupportedAttributeTypeException: weka.classifiers.trees.J48: Cannot handle numeric class! гласит, что алгоритм J48 нельзя использовать для числовых классов. Здесь класс означает вывод, который вы хотите выучить, а не атрибут, используемый при обучении. J48 может использовать числовые атрибуты, но не может предсказать числовые классы.

Вы не можете предсказать числовое значение в J48 (например, прогнозирование температуры в виде целого числа), вы можете предсказать только номинальные типы с J48 (например, один из холодного / нейтрального / горячего).

Чтобы использовать J48, необходимо изменить класс на номинальный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...