其他关于svm和libsvm的东西这里不再赘述,本文主要介绍下我在用libsvm过程中遇到的问题进行一下说明,网上资料大多数都是关于libsvm参数的一些说明,这里简单介绍下如何用java代码运行一个小例子。
首先我们要下载libsvm jar包,然后我把svm_train,svm_scale,svm_predict三个类文件复制了出来,主要是了解一下内部实现。接着准备好训练数据集合测试数据集。数据文件格式如下,label是类别,index是feature即特征或者维,value是对应特征值。
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
接下来就要开始对数据进行归一化处理,用到svm_scale类。
Usage: svm-scale [options] data_filename
options:
-l lower : x scaling lower limit (default -1)
-u upper : x scaling upper limit (default +1)
-y y_lower y_upper : y scaling limits (default: no y scaling)
-s save_filename : save scaling parameters to save_filename
-r restore_filename : restore scaling parameters from restore_filename
这里特别解释下-s -r参数,-s参数指定保存svm_scale扫描过后的归一化scale标准,-r表示读入的标准。我们因为同时要考虑训练集和测试集,所以这里需要两个参数。libsvm这里采用的是最大最小值归一化,默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下界,java代码如下。
String[] testArgs = {"-l","0", "-u","1","-s","chao-test-scale","UCI-breast-cancer-tra"};
svm_scale.main(testArgs);
String[] argvScaleTest ={"-r","chao-test-scale","UCI-breast-cancer-test"};
svm_scale.main(testArgs);
执行完之后生成的chao-test-scale文件里面就是最后的scale标准,文件内容如下:
x
0.000000000000000 1.000000000000000
1 63375.00000000000 13454352.00000000
2 1.000000000000000 10.00000000000000
3 1.000000000000000 10.00000000000000
4 1.000000000000000 10.00000000000000
5 1.000000000000000 10.00000000000000
6 1.000000000000000 10.00000000000000
7 1.000000000000000 10.00000000000000
8 1.000000000000000 10.00000000000000
9 1.000000000000000 10.00000000000000
10 1.000000000000000 10.00000000000000
文件里面列出了归一化的区间0-1,每个feature的最大最小值,便于后面对整个集合做scale处理。有的遗憾的是svm_scale类没有直接提供参数指定生成scale的文件,不过它在执行过程中会输出整个scale后的文件,我们可以通过控制台直接重定向到新文件里面。
java svm_scale -s chao-test-scale train>train.scale
java svm_scale -s chao-test-scale test>test.scale
这样就将train训练集和test测试集全部scale成功,我们就可以开始训练和检测了,分别使用svm_train和svm_predict。
String[] trainArgs = {"train.scale"};
String modelFile = svm_train.main(trainArgs);
String[] testArgs = {"test.scale", modelFile, "result"};
Double accuracy = svm_predict.main(testArgs);
System.out.println("SVM Classification is done! The accuracy is " + accuracy);
另外从网上看到的使用libsvm的步骤如下:
1)按照LIBSVM软件包所要求的格式准备数据集;
2)对数据进行简单的缩放操作;
3)首要考虑选用RBF 核函数;
4)采用交叉验证选择最佳参数C与g ;
5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6)利用获取的模型进行测试与预测。
对应第4和5步,目前正在研究阶段,了解到的只能使用grid.py来查找最佳参数,这里偷懒贴个链接LibSVM学习(六)——easy.py和grid.py的使用http://blog.csdn.net/flydreamgg/article/details/4470477。
需要重点说明的是,用grid.py找到的
最佳参数c和g是使得训练集在交叉验证思想下达到最高准确率的,不能保证使用这个参数训练之后的模型就能让测试集也能达到对应的正确率。我经过测试找到的0.5 0.125代入之后训练,准确率没有发生变化,依然是0.8974358974358975。
归一化处理可以加快运算速度,提高预测准确率==(这里加个疑问:有说法是看具体情况,有的情况归一化之后反而正确率下降。)。下面贴一下数据归一化之前的运行结果。
optimization finished, #iter = 1223
nu = 0.6996186233933985
obj = -271.992875483972, rho = 0.4257786283326366
nSV = 639, nBSV = 222
Total nSV = 639
Accuracy = 69.23076923076923% (27/39) (classification)
SVM Classification is done! The accuracy is 0.6923076923076923
归一之后的运行结果
optimization finished, #iter = 68
nu = 0.08154427324315143
obj = -44.22486456942005, rho = -0.8163705353889562
nSV = 61, nBSV = 48
Total nSV = 61
Accuracy = 89.74358974358975% (35/39) (classification)
SVM Classification is done! The accuracy is 0.8974358974358975
后续:
后面接着实践,发现了所谓的归一化之后文件增大,运算速度和准确率下降的情况,但是这个情况最后可以通过修改归一化的方式或者参数来解决,其实就是归一化的方式不正确导致的正确率下降的问题。
- 大小: 3 KB
- 大小: 3.5 KB
分享到:
相关推荐
java libsvm 的实用的说明文档,供大家参考
有关libsvm的使用说明,供需要的朋友下载。
这个是libsvm的java版使用文档
新手可以通过这个上路,不需要太多知识背景^_^
国外牛人做的libsvm工具 可以在JAVA,Windows,python等模式下安装 配有安装说明,非常强大
二、LIBSVM工具使用说明 由于libsvm程序小,运用灵活,输入参数较少,并且是开源的,易于扩展,目前已经成为国内应用最多的SVM库。LIBSVM可以从林智仁博士的个人主页免费获得,目前已经发展到3.17版。下载.zip格式...
2-3 使用Java开发OpenCV的缺点 45 2-4 OpenCV的下载及安装 45 2-5 Eclipse设定OpenCV开发环境 46 2-6 整合Java之Eclipse与OpenCV 49 2-7 开发第一个OpenCV程式 51 2-8 建立矩阵 52 范例2-8-1 建立第一个opencv的矩阵...
1.weka 集成LibSVMm所需的libsvm.jar和wlsvm.jar,并附上了使用说明,亲测可使用。 2.libsvm-3.31.zip和liblinear-2.46.zip。
该项目旨在帮助研究/工业界在具有本地库的Android平台上使用[LIBSVM]()以获得更好的性能(与Java版本相比)。 LIBSVM是全世界许多领域中用于分类和回归问题的最强大工具之一。 该项目实际上是[this project]()的...
Weka使用Java写成的,并且限制在GNU通用公共证书的条件下发布。它可以运行于几乎所有操作平台,是一款免费的,非商业化的机器学习以及数据挖掘软件。Weka提供了一个统一界面,可结合预处理以及后处理方法,将许多...
Weka使用Java写成的,并且限制在GNU通用公共证书的条件下发布。它可以运行于几乎所有操作平台,是一款免费的,非商业化的机器学习以及数据挖掘软件。Weka提供了一个统一界面,可结合预处理以及后处理方法,将许多...
有关如何克隆,构建和运行项目的说明,请参阅 。 机器学习库: 数据集: (具有和1024个功能-CHI2,DF和MI) (具有10、20、30、40、50、60、70、80、90和100功能-CHI2,DF和MI) 分类方法: 平均一相关估计...