使用 LibSVM 的 Java 代码中的 Weka 错误“无法处理数字类”

Posted

技术标签:

【中文标题】使用 LibSVM 的 Java 代码中的 Weka 错误“无法处理数字类”【英文标题】:Weka error "cannot handle numeric class" in Java code using LibSVM 【发布时间】:2013-07-17 05:44:21 【问题描述】:

我正在尝试使用 Weka 使用基于 LibSVM 的分类器,但出现此错误:

Exception in thread "main" weka.core.UnsupportedAttributeTypeException:weka.classifiers.functions.LibSVM: Cannot handle numeric class!
    at weka.core.Capabilities.test(Unknown Source)
    at weka.core.Capabilities.test(Unknown Source)
    at weka.core.Capabilities.test(Unknown Source)
    at weka.core.Capabilities.testWithFail(Unknown Source)
    at weka.classifiers.functions.LibSVM.buildClassifier(Unknown Source)
    at imgclassifier.ImgClassifier.main(ImgClassifier.java:45)
Java Result: 1

这是我的代码:

try 

   File f = new File("australian.txt");
   LibSVMLoader loader = new LibSVMLoader();
   loader.setSource(f);
   Instances i = loader.getDataSet();

   LibSVM svm = new LibSVM();
   svm.buildClassifier(i);

catch (IIOException e) 
   e.printStackTrace();

australian.txt 是这里的一个例子:LibSVM DataSets 谁能解释一下错误在哪里? 提前谢谢

【问题讨论】:

【参考方案1】:

我无法批评您的整个方法,但您缺少的一项重要内容是告诉 SVM 您想要进行回归。 (与很多人的印象相反,LibSVM 可以做回归;见http://www.csie.ntu.edu.tw/~cjlin/libsvm/ - “LIBSVM is … for … regression (epsilon-SVR, nu-SVR)…”)

你需要这样做来告诉它做回归:

svm.setSVMType(new SelectedTag(LibSVM.SVMTYPE_EPSILON_SVR, LibSVM.TAGS_SVMTYPE)); // -S 3=epsilon-SVR

/抢劫

PS - 在我使用 Java 面向对象的方法、使用 LibSVM 对象上的方法而不是使用基于字符串的“选项”方法对所有参数进行编码之前,我仍然收到“无法处理数字类”错误。我不知道为什么会这样,而且可能是红鲱鱼,但确实如此。

【讨论】:

【参考方案2】:

设置要预测的列的类索引。所以试试这个,

i.setClassIndex( train.numAttributes() - 1 );

【讨论】:

以上是关于使用 LibSVM 的 Java 代码中的 Weka 错误“无法处理数字类”的主要内容,如果未能解决你的问题,请参考以下文章

libsvm java中的交叉验证准确性

在 java 代码中使用 libsvm 在移动设备中执行预测

java中使用LibSVM的一个例子

Java、weka LibSVM 预测不正确

如何在 Java 中使用 LibSVM?

Libsvm java工程实践