我应该如何使用 weka 处理网格搜索和多重搜索中的这个错误?

how should i deal with this error on gridsearch and multisearch with pyweka?

我有网格搜索的代码:

from weka.classifiers import GridSearch

data = loader.load_file(data_dir + "bolts.arff")
data.class_is_last()

grid = GridSearch(options=["-sample-size", "100.0", "-traversal", "ROW-WISE", "-num-slots", "1", "-S", "1"])
grid.evaluation = "CC"
grid.y = {"property": "kernel.gamma", "min": -3.0, "max": 3.0, "step": 1.0, "base": 10.0, "expression": "pow(BASE,I)"}
grid.x = {"property": "C", "min": -3.0, "max": 3.0, "step": 1.0, "base": 10.0, "expression": "pow(BASE,I)"}
cls = Classifier(
    classname="weka.classifiers.functions.SMOreg",
    options=["-K", "weka.classifiers.functions.supportVector.RBFKernel"])
grid.classifier = cls
grid.build_classifier(data)
print("Model:\n" + str(grid))
print("\nBest setup:\n" + grid.best.to_commandline())

它向我提出了这个错误:

Failed to get class weka.classifiers.meta.GridSearch

Exception in thread "Thread-0" java.lang.NoClassDefFoundError: weka.classifiers.meta.GridSearch

Caused by: java.lang.ClassNotFoundException: weka.classifiers.meta.GridSearch
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)

同样在多重搜索的情况下,我有这个代码:

from weka.classifiers import MultiSearch


multi = MultiSearch(options=["-S", "1"])           
multi.evaluation = "CC"
mparam = MathParameter()
mparam.prop = "classifier.kernel.gamma"
mparam.minimum = -3.0
mparam.maximum = 3.0
mparam.step = 1.0
mparam.base = 10.0
mparam.expression = "pow(BASE,I)"
lparam = ListParameter()
lparam.prop = "classifier.C"
lparam.values = ["-2.0", "-1.0", "0.0", "1.0", "2.0"]
multi.parameters = [mparam, lparam]
cls = Classifier(
    classname="weka.classifiers.functions.SMOreg",
    options=["-K", "weka.classifiers.functions.supportVector.RBFKernel"])
multi.classifier = cls
multi.build_classifier(data)
print("Model:\n" + str(multi))
print("\nBest setup:\n" + multi.best.to_commandline())

并且还会出现这个错误:

Exception in thread "Thread-0" java.lang.ClassNotFoundException: weka.core.setupgenerator.AbstractParameter
...

我看到大家都说要解决这个错误,需要安装包,我都安装了。

检查:

items = packages.installed_packages()
for item in items:
    print(item.name + " " + item.url)

这给了我:

gridSearch http://prdownloads.sourceforge.net/weka/gridSearch1.0.12.zip?download
timeseriesForecasting http://prdownloads.sourceforge.net/weka/timeseriesForecasting1.1.27.zip?download
LibSVM http://prdownloads.sourceforge.net/weka/LibSVM1.0.10.zip?download
multisearch https://github.com/fracpete/multisearch-weka-package/releases/download/v2020.2.17/multisearch-2020.2.17.zip

并检查是否所有软件包都安装了最新版本及其正确性,其中:

success, exit_required = install_missing_packages([("gridSearch", LATEST),("multisearch", LATEST)])
if exit_required:
    jvm.stop()
    sys.exit(0)

所以我不知道我是应该忽略这个错误还是应该做点什么。

我不得不说,当我执行它时,它给了我一个解决方案,但也引发了这个错误,所以我不知道该怎么做。

谢谢大家

您列出的异常不影响脚本执行,因为它们由 pww3 内部处理(不幸的是,尽管捕获了异常,但无法抑制错误输出;这由底层 javabridge 库输出)。

一些背景知识: 由于 pww3 可以 运行 有和没有包支持,它首先尝试使用 [=25= 加载 类 ] 类加载器。如果失败(这是您看到的错误消息),它将尝试使用 Weka 的加载机制加载它们 类.

刚刚发布的 pww3 版本 0.2.7 对此进行了更智能的处理,避免了这些异常的输出。

最后说明: 使用 MultiSearch.

时,您需要在 属性 名称中删除 classifier. 前缀