如何在我的 Java 代码中使用带有 Weka 的 LibSVM?
Posted
技术标签:
【中文标题】如何在我的 Java 代码中使用带有 Weka 的 LibSVM?【英文标题】:How to use LibSVM with Weka in my Java code? 【发布时间】:2011-07-10 14:05:16 【问题描述】:我想在我的应用程序中使用带有 Weka 的 LibSVM 分类器。我怎样才能(或者我在哪里可以找到好的例子)做到这一点?
【问题讨论】:
【参考方案1】:现在有点晚了,当然,但无论如何我都会回答。您必须在项目中使用 weka.jar、libsvm.jar 和 wlsvm.jar(libsvm 包装器)。因此,只需在构建路径或类路径或其他任何内容中包含所有 3 个 jar。
您可以从这里获取 wlsvm.jar:http://ailab.ist.psu.edu/yasser/wlsvm.html
你可以从这里获取weka:http://www.cs.waikato.ac.nz/ml/weka/
您可以从这里获取 libsvm:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
我无法让它与 weka 3.7.7 或 3.7.8 一起使用,但我能够让它与 3.6.8(截至今天的最新稳定版本)一起使用。
另外,因为我必须从 svnlib 中获取 .class 文件,并且还要在我的项目的构建路径中包含这些文件。要构建 .class 文件,请使用 SVNLib/java 中的 make 文件。
这里有一小段代码可以帮助您入门:
DataSource source = new DataSource(new File("mycsvinputfile"));
System.out.println(source.getStructure());
Instances data = source.getDataSet();
// setting class attribute if the data format does not provide this information
// For example, the XRFF format saves the class attribute information as well
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
//initialize svm classifier
LibSVM svm = new LibSVM();
svm.buildClassifier(data);
祝你好运。
【讨论】:
【参考方案2】:点击此链接以结合 Weka 和 libsvm http://www.cs.iastate.edu/~yasser/wlsvm/
weka 擅长计算 ROC、召回率等...... 而 libsvm 对分类、回归等很有用...
【讨论】:
【参考方案3】:要使用最新版本的weka(3.7.9)的libSVM库,您只需要使用weka应用程序的“包管理器”并安装libSVM包。
最后从 java 项目中,你必须将“包管理器”创建的 LibSVM 库添加到类路径中。
通常在“(HOME)\wekafiles\packages\LibSVM”目录下。
【讨论】:
【参考方案4】:事实证明,通过 Maven Central 提供的东西,weka 人员使用最新版本使我们的工作变得更加轻松。
只需从这里获取依赖项: http://mvnrepository.com/artifact/nz.ac.waikato.cms.weka/LibSVM
就依赖关系而言,一切都会正常工作。不要乱用包装器并将 jars 添加到类路径或类似的东西。
我使用的是 3.7.12 版本,但我认为自从将包管理器功能添加到 GUI 后它就可用了。
【讨论】:
【参考方案5】:有了新版本,你只需要 weka.jar 并像这样调用 svm,
WekaPackageManager.loadPackages( false, true, false );
AbstractClassifier classifier = ( AbstractClassifier ) Class.forName(
"weka.classifiers.functions.LibSVM" ).newInstance();
如果你喜欢给选项设置这样的选项
String options = ( "-S 0 -K 0 -D 3 -G 0.0 -R 0.0 -N 0.5 -M 40.0 -C 1.0 -E 0.001 -P 0.1" );
String[] optionsArray = options.split( " " );
classifier.setOptions( optionsArray );
最后训练分类器
classifier.buildClassifier( train );
【讨论】:
以上是关于如何在我的 Java 代码中使用带有 Weka 的 LibSVM?的主要内容,如果未能解决你的问题,请参考以下文章
在java代码中使用weka过滤器(RemoveType)的选项p
如何使用带有 Java 代码的 WEKA 评估类来显示标准差值