文章目录
  1. 1. 一.LibSVM简介
  2. 2. 二.LibSVM简单使用
  3. 3. 三.LibSVM使用规范
    1. 3.1. 1.LibSVM数据格式
    2. 3.2. 2.svm-scale用法
    3. 3.3. 3.svm-train用法
    4. 3.4. 4.svm-predict用法
  4. 4. 四.grid.py和easy.py的使用
  5. 5. 五.用LibSVM做回归
  6. 6. 六.Reference

        本文主要简单介绍一下机器学习算法SVM的一个实现库LibSVM的相关内容。

一.LibSVM简介

        LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机算法库,该库运行速度比较快,可以方便的对数据做分类或回归。由于该库程序小,运行灵活,输入参数少,开源易扩展,因此成为目前广泛应用的SVM库。
        该库可以免费获得,目前版本为3.22,下载.zip文件并解压。主要包含5个文件夹和C++源程序。

  1. java:主要用于java平台;
  2. python:用来参数选优的工具;
  3. svm-toy:一个可视化工具,用来展示训练数据和分类界面,有源代码可以编译。
  4. tools:主要有四个python文件,数据集抽样(subset),参数选优(grid),集成测试(easy),数据检查(checkdata);
  5. 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]。缩放的主要目的是:

  1. 防止某个特征过大或者过小,从而在训练中起的作用不平衡;
  2. 为了计算速度。在核计算中,会用到内积运算或者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 - 线性核:uv
    • 1 - 多项式核:(guv+coef0)degree
    • 2 - RBF核:exp(γ||uv||22)
    • 3 - sigmoid核:tanh(γuv+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,默认值为0
  • model_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只能选择34。工作流程和做回归非常类似,主要分为以下几步:

  1. 数据预处理
    ./svm-scale -l -1 -u 1 -s save_filename trainfile > trainfile_scale
    ./svm-scale -r save_filename testfile > testfile_scale
    分别对训练数据和测试数据进行处理,处理训练数据时将处理策略保存,处理测试数据时直接将策略载入处理即可。
  2. 最优参数选择
    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。
  3. 用上一步选择的最优参数进行训练
    ./svm-train -s 3 -t 2 -c 2 -g 0.015625 -p 0.0625 trainfile_scale train.model
  4. 用上一步得到的模型进行预测
    ./svm-predict testfile_scale train.model testfile_predict
    预测的结果保存在文件testfile_predict中。

六.Reference

LibSVM学习
用libsvm进行回归预测
文本分类与SVM

文章目录
  1. 1. 一.LibSVM简介
  2. 2. 二.LibSVM简单使用
  3. 3. 三.LibSVM使用规范
    1. 3.1. 1.LibSVM数据格式
    2. 3.2. 2.svm-scale用法
    3. 3.3. 3.svm-train用法
    4. 3.4. 4.svm-predict用法
  4. 4. 四.grid.py和easy.py的使用
  5. 5. 五.用LibSVM做回归
  6. 6. 六.Reference