sklearn-weka-plugin return JavaException

sklearn-weka-plugin return JavaException

我正在使用 sklearn-weka-plugin 并想要 运行 JRip 分类器。当我尝试使用 python-weka-wrapper 运行 时:

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

jvm.start()

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

jvm.stop()

一切正常,但如果我尝试对 sklearn-weka-plugin 做同样的事情:

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

在这两种情况下,您都应该使用 classname=,因为这些 类 的所有参数都是可选的。区别在于 Classifier 的第一个参数是 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()