#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()