sklearn-weka-плагин возвращает исключение JavaException

#java #python #scikit-learn #wrapper #weka

Вопрос:

Я использую плагин sklearn-weka и хочу запустить классификатор JRip. Когда я пытаюсь запустить его с помощью оболочки python-weka:

 import weka.core.jvm as jvm
from weka.classifiers import Classifier

jvm.start()

jrip = Classifier("weka.classifiers.rules.JRip")

jvm.stop()
 

все работает нормально, но если я попытаюсь сделать то же самое с плагином sklearn-weka:

 import sklweka.jvm as jvm
from sklweka.classifiers import WekaEstimator

jvm.start()

jrip = WekaEstimator("weka.classifiers.rules.JRip")

jvm.stop()
 

Я получаю следующее сообщение об ошибке:

 Failed to get class weka.classifiers.rules.JRip
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: weka.classifiers.rules.JRip
Traceback (most recent call last):
  File "sklearn_weka_test.py", line 21, in <module>
    jrip = WekaEstimator("weka.classifiers.rules.JRip")
  File "/home/andreas/.local/lib/python3.8/site-packages/sklweka/classifiers.py", line 45, in __init__
    if not is_instance_of(_jobject, "weka.classifiers.Classifier"):
  File "/home/andreas/.local/lib/python3.8/site-packages/weka/core/classes.py", line 285, in is_instance_of
    if is_array(obj):
  File "/home/andreas/.local/lib/python3.8/site-packages/weka/core/classes.py", line 309, in is_array
    cls = javabridge.call(obj, "getClass", "()Ljava/lang/Class;")
  File "/home/andreas/.local/lib/python3.8/site-packages/javabridge/jutil.py", line 888, in call
    fn = make_call(o, method_name, sig)
  File "/home/andreas/.local/lib/python3.8/site-packages/javabridge/jutil.py", line 846, in make_call
    raise JavaException(jexception)
javabridge.jutil.JavaException: weka.classifiers.rules.JRip
 

Ответ №1:

В обоих случаях вы должны использовать classname= , так как все параметры этих классов являются необязательными. Разница в том, что первым параметром Classifier is classname и для WekaEstimator него является объект JavaBridge. Вот почему он работает в первом случае, но терпит неудачу с исключением во втором случае.

Ваш код должен выглядеть следующим образом:

 import weka.core.jvm as jvm
from weka.classifiers import Classifier

jvm.start()

jrip = Classifier(classname="weka.classifiers.rules.JRip")

jvm.stop()
 

И:

 import sklweka.jvm as jvm
from sklweka.classifiers import WekaEstimator

jvm.start()

jrip = WekaEstimator(classname="weka.classifiers.rules.JRip")

jvm.stop()