LibSVM简介
更新日期:
本文主要简单介绍一下机器学习算法SVM的一个实现库LibSVM的相关内容。
一.LibSVM简介
LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机算法库,该库运行速度比较快,可以方便的对数据做分类或回归。由于该库程序小,运行灵活,输入参数少,开源易扩展,因此成为目前广泛应用的SVM库。
该库可以免费获得,目前版本为3.22,下载.zip文件并解压。主要包含5个文件夹和C++源程序。
- java:主要用于java平台;
- python:用来参数选优的工具;
- svm-toy:一个可视化工具,用来展示训练数据和分类界面,有源代码可以编译。
- tools:主要有四个python文件,数据集抽样(subset),参数选优(grid),集成测试(easy),数据检查(checkdata);
- windows:包含在windows下运行的程序(由于自己使用mac和linux系统,不介绍windows)。
其它.h和.cpp文件都是程序源码,可以编程出相应的可执行文件。其中最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-trian.c(svm-toy中的svm-toy.c)都是调用该文件的接口函数,编译后有相应的可执行文件。README和FAQ也是很好的文件,可以看一下。
Mac和linux下面编译非常简单,直接在libsvm-3.22目录下make一下就可以了,生成svm-train,svm-scale和svm-predict三个可执行文件。
二.LibSVM简单使用
LibSVM的训练非常简单,直接在根目录下执行./svm-train heart_scale train.model
heart_scale为样本文件
train.model为创建的结果文件,保存训练后的结果,可以看到结果:
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
目录下生成的train.model文件中保存的是训练后的结果,可以用记事本打开,内容如下:
svm_type c_svc//所选择的svm类型,默认为c_svc
kernel_type rbf//训练采用的核函数类型,此处为RBF核
gamma 0.0769231//RBF核的参数r
nr_class 2//类别数,此处为二分类问题
total_sv 132//支持向量总个数
rho 0.424462//判决函数的预置项b
label 1 -1//原始文件中的类别标识
nr_sv 64 68//每个类的支持向量个数
SV//以下为各个类的权重系数及相应的支持向量
其它两个可执行文件svm-scale和svm-predict的用法类似。
三.LibSVM使用规范
1.LibSVM数据格式
Label 1:value 2:value …
Label:类别标识,比如上面train.model中的1 -1
,可以自己随意指导,比如-10 0 15
。当然,如果是回归,这是目标值,就要实事求是了。
value:要训练的数据,也就是特征。数据之间以空格隔开。
一行数据的格式为:-15 1:0.708 2:1056 3:-0.3333
需要注意的是,如果特征值为0,特征冒号前面的序号可以不连续,如:-15 1:0.708 3:-0.3333
表明第2个特征值为0。从编程的角度来说,这样可以减少内存的使用,提高矩阵的内积运算速度。
2.svm-scale用法
svm-scale是用来对原始数据进行缩放的,范围可以自己定,一般是[0,1]或者[-1,1]。缩放的主要目的是:
- 防止某个特征过大或者过小,从而在训练中起的作用不平衡;
- 为了计算速度。在核计算中,会用到内积运算或者exp运算,不平衡的数据可能会造成计算困难。
用法:svm-scale [-l lower] [-u upper] [-y y_lower y_upper] [-s save_filename] [-r restore_filename] filename
其中:[]
中都是可选项。
-l:
设定数据下限值,默认值为-1-u:
设定数据上限值,默认值为1-y:
是否对目标值进行缩放-s:
将缩放的规则保存到文件save_filename-r:
表示将按照已经存在的规则文件restore_filename进行缩放filename:
将要缩放的数据文件,文件格式按照LibSVM格式。
默认情况下,只需要输入要缩放的文件就可以了,比如:./svm-scale test.txt
。这时,text.txt中的数据就变成[-1,1]之间的数据了。但原来的数据会被覆盖,可以使用重定向来保存到新文件中:./svm-scale test.txt > out.txt
。运行之后,文件夹下多出来的out.txt就是规范后的数据。如果想设置数据范围为[0,1]并保存规则为text.range文件:./svm-scale -l 0 -u 1 -s test.range test.txt > out.txt
。这时目录下多了一个test.range文件,下次可以用 -r test.range
来载入。
3.svm-train用法
svm-train是用来对训练数据集进行训练,并且可以获得SVM模型。
用法:svm-train [options] train_set_file [model_file]
其中,options为操作参数,可用的选项和表示的含义如下:
-s
设置svm类型,可选参数如下:- 0 - C-SVC
- 1 - v-SVC
- 2 - one-class-SVM
- 3 - e-SVR
- 4 - n-SVR
-t
设置核函数类型,默认值为2,可选参数如下:- 0 - 线性核:u′v
- 0 - 线性核:u′v
- 1 - 多项式核:(gu′v+coef0)degree
- 1 - 多项式核:(gu′v+coef0)degree
- 2 - RBF核:exp(γ||u−v||22)
- 2 - RBF核:exp(γ||u−v||22)
- 3 - sigmoid核:tanh(γu′v+coef0)
- 3 - sigmoid核:tanh(γu′v+coef0)
-d
degree:设置多项式核中degree的值,默认为3-g
r:设置核函数中r的值,默认为1/k,k为特征数-r
coef0:设置核函数中coef0,默认值为0-c
cost: 设置C-SVC、e-SVR、n-SVR中从惩罚系数C,默认值为1-n
v:设置v-SVC、one-class-SVM与n-SVR中参数n,默认值为0.5-p
e:设置终止准则中的容忍误差,默认值为0.001-h
shrinking:是否使用启发式,可选值为0或1,默认值为1-b
概率估计:是否计算SVC或SVR的概率估计,可选值为0或1,默认值为0-wi
weight:对各类样本的惩罚系数C加权,默认值为1-v
n:n折交叉验证模式model_file
:可选项,要保存的模型文件
默认情况下,只需要提供一个样本文件就可以了,但为了保存模型,还需要提供一个模型文件,如:./svm-train heart_scale train.model
4.svm-predict用法
svm-predict 是根据训练得到的模型,对数据集进行预测。
用法:svm-predict [options] test_fle model_file output_file
其中,options为操作参数,可选的参数如下:
-b
probability_estimates - 是否需要进行概率估计预测,可选值为0或1,默认值为0model_file
- 是有svm-train产生的模型文件test_file
- 是要进行预测的数据文件,要符合LibSVM格式,即使不知道label值,也需要填一个,svm-predict会在output_file中给出正确的label结果,如果知道label的值,机会输出准确率。output_file
- 是svm-predict的输出文件,表示预测的结果。
四.grid.py和easy.py的使用
在tool文件夹下有四个python脚本用来对参数选优。常用的有easy.py和grid.py两个脚本。直接在根目录下运行:python tools/grid.py heart_scale
,就会看到终端的[local]数据,待停止后,最后一行输出为:512.0 0.001953125 84.8148
,表示C=512.0,r=0.001953125,交叉验证精度rate=84.8148%,这个结果是最优的。
根目录下会生成两个文件heart_scale.out 和 heart_scale.png,第一个是搜索过程中[local]和最优数据,第二个是gnuplot图像。然后就可以使用最优参数输入到svm-train中进行训练了。
五.用LibSVM做回归
用LibSVM做回归问题,参数-s
只能选择3
或4
。工作流程和做回归非常类似,主要分为以下几步:
- 数据预处理
./svm-scale -l -1 -u 1 -s save_filename trainfile > trainfile_scale
./svm-scale -r save_filename testfile > testfile_scale
分别对训练数据和测试数据进行处理,处理训练数据时将处理策略保存,处理测试数据时直接将策略载入处理即可。 - 最优参数选择
LibSVM工具包中的tools文件夹下提供的grid.py只能进行分类问题的最优参数选择,要对回归问题的最优参数进行选择,需要到作者主页去下载gridregression.py文件,将该文件保存到tools目录下即可。然后运行命令:python tools/gridregression.py -log2c -10,10,1 -log2g -10,10,1 -log2p -10,10,1 -v 10 -s 3 -t 2 trainfile_scale > trainrs.txt
在trainrs.txt的最后一行为:2.0 0.015625 0.0625 0.0198489
,前三个数对应最优的cost,gamma和epsilon。 - 用上一步选择的最优参数进行训练
./svm-train -s 3 -t 2 -c 2 -g 0.015625 -p 0.0625 trainfile_scale train.model
- 用上一步得到的模型进行预测
./svm-predict testfile_scale train.model testfile_predict
预测的结果保存在文件testfile_predict中。