LibSvm结论参数

本文转自Bluenight在《Libsvm 使 用心得》,本人测试完成,只不过是libSVM是3.1版本,python和gnuplot都是最新版本,发现一个问题,在交叉验证时候使用:svm- train -c x -g x -v x trainfile 格式不输出.mode文件!去除-v x 就可输出model文件。另外,在此有个问题:下图中为什么说最好的C g是这样的?到底是如何解释呢?有待进一步解决中,希望同行探讨。

首先下载 Libsvm Python Gnuplot

l           libsvm 的主页 http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 上下载 libsvm (我自己用2.86版本)

l           python 的主页 http://www.python.org 下载  python (我自己用2.5版本)

l           gnuplot 的主页 http://www.gnuplot.info/ 下载 gnuplot  (我用4.0版本)

LIBSVM  使用的一般步骤是:

1 )按照 LIBSVM 软件包所要求的格式准备数据集;                                     

2 )对数据进行简单的缩放操作;                                    

3 )首要考虑选用 RBF  核函数;

4 )采用交叉验证选择最佳参数 C

5 )采用最佳参数 C 对整个训练集进行训练获取支持向量机模型;

6 )利用获取的模型进行测试与预测。

1 LIBSVM 使用的数据格式

     该软件使用的训练数据和检验数据文件格式如下:

[label] [index1]:[value1] [index2]:[value2] ...

[label] [index1]:[value1] [index2]:[value2] ...

一行一条记录数据,如 :

+1 1 :0.708 2 :1 3 :1 4 :-0.320 5 :-0.105 6 :-1

这里 (x,y) à ((0.708,1,1, -0.320, -0.105, -1), +1)

label  或说是 class,  就是你要分类的种类,通常是一些整数。

index  是有順序的索引,通常是连续的整数。

value  就是用来  train  的数据,通常是一堆实数。

 

2 )对数据进行简单的缩放操作

     扫描数据 因为原始数据可能范围过大或过小 , svmscale 可以先将数据重新 scale ( 縮放 到适当范围使训练与预测速度更快。

     svmscale.exe 的用法: svmscale.exe feature.txt feature.scaled

默认的归一化范围是 [-1,1] ,可以用参数 -l -u 分别调整上界和下届 ,feature.txt 是输入特征文件名   输出的归一化特征名为 feature.scaled

 

3 )   考虑选用 RBF  核函数

训练数据形成模型( model , 实质是算出了 wx+b=0 中的 w,b.

  Svmtrain 的用法: svmtrain [options] training_set_file [model_file]

 

其中 options 涵义如下 :

-s svm 类型:设置 SVM  类型,默认值为 0 ,可选类型有:

0 -- C- SVC

1 -- nu - SVC

2 -- one-class-SVM

3 -- e - SVR

4 -- nu-SVR

-t  核函数类型:设置核函数类型,默认值为 2 ,可选类型有:

0 --  线性核: u'*v

1 --  多项式核: (g*u'*v+ coef0)degree

2 -- RBF  :exp(-||u-v||*||u-v||/g*g)

3 -- sigmoid  核: tanh(g*u'*v+ coef 0)

-d degree :核函数中的 degree 设置,默认值为 3

-g r(gama) :核函数中的函数设置 ( 默认 1/ k);

-r coef 0 :设置核函数中的 coef0 ,默认值为 0

-c cost :设置 C- SVC e - SVR n - SVR 中从惩罚系数 C ,默认值为 1

-n nu  :设置 nu - SVC one-class-SVM  nu - SVR  中参数 nu  ,默认值 0.5

-p e  :核宽 , 设置 e - SVR 的损失函数中的 ,默认值为 0.1

-m cachesize :设置 cache 内存大小,以 MB 为单位 ( 默认 40)

-e e  :设置终止准则中的可容忍偏差,默认值为 0.001

-h shrinking :是否使用启发式,可选值为 1 ,默认值为 1

-b  概率估计:是否计算 SVC SVR 的概率估计,可选值 1 ,默认 0

-wi weight :对各类样本的惩罚系数 C 加权,默认值为 1

-v n n 折交叉验证模式。

 

其中 -g 选项中的 k 是指输入数据中的属性数。操作参数  -v  随机地将数据剖分为 部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照 SVM  的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或 SVM  类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值 。 training_set_file 是要进行训练的数据集 ; model_file 是训练结束后产生的模型文件 ,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。举个例子如下:

C:/libsvm-2.85/windows>svmtrain heart_scale

*

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

现简单对屏幕回显信息进行说明:

#iter 为迭代次数,

nu  与前面的操作参数 -n nu  相同,

obj SVM 文件转换为的二次规划求解得到的最小值,

rho  为判决函数的常数项 b

nSV  为支持向量个数,

nBSV 为边界上的支持向量个数,

Total nSV 为支持向量总个数。

训练后的模型保存为文件 *.model ,用记事本打开其内容如下:

svm_type c_svc  训练所采用的 svm 类型,此处为 C- SVC

kernel_type rbf % 训练采用的核函数类型,此处为 RBF

gamma 0.0769231 % 设置核函数中的 ,默认值为 1/ k

nr_class 2 % 分类时的类别数,此处为两分类问题

total_sv 132 % 总共的支持向量个数

rho 0.424462 % 决策函数中的常数项 b

label 1 -1% 类别标签

nr_sv 64 68 % 各类别标签对应的支持向量个数

SV % 以下为支持向量

1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1

0.5104832128985164 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5

1 1:0.333333 2:1 3:-1 4:-0.245283 5:-0.506849 6:-1 7:-1 8:0.129771 9:-1 10:-0.16129 12:0.333333 13:-1

1 1:0.208333 2:1 3:0.333333 4:-0.660377 5:-0.525114 6:-1 7:1 8:0.435115 9:-1 10:-0.193548 12:-0.333333 13:1

4 )采用交叉验证选择最佳参数 C g

     通常而言,比较重要的参数是  gamma (-g)   cost (-c)  。而  cross validation (-v)

的参数常用 5 。那么如何去选取最优的参数 c g 呢? libsvm   python  子目录下面的  grid.py  可以帮助我们。   此时。其中安装 python2.5 需要(一般默认安装到 c:/python25

下),将 gnuplot 解压。安装解压完毕后,进入 /libsvm/tools 目录下,用文本编辑器(记事

本, edit 都可以)修改 grid.py 文件,找到其中关于 gnuplot 路径的那项(其默认路径为

gnuplot_exe=r"c:/tmp/gnuplot/bin/pgnuplot.exe" ),根据实际路径进行修改,并保存。然

后,将 grid.py C:/Python25 目录下的 python.exe 文件拷贝到 libsvm/windows 目录下,键入以下命令: $ python grid.py train.1.scale  执行后,即可得到最优参数 c g

     另外,至于下 libsvm python 的接口的问题,在 libsvm2.86 中林老师已经帮助我们解决,在 /libsvm/windows/python 目录下自带了 svmc.pyd 这个文件,将该文件文件复制到

libsvm/python 目录下,同时,也将 python.exe 文件复制到该目录下,键入以下命令以检验效

果(注意: .Py 文件中关于 gnuplot 路径的那项路径一定要根据实际路径修改):

python svm_test.py

     如果能看到程序执行结果,说明 libsvm python 之间的接口已经配置完成,以后就可以直接在 python 程序里调用 libsvm 的函数了!

5 )   采用最佳参数 C 对整个训练集进行训练获取支持向量机模型

    $ svmtrain –c x –g x –v x training_set_file [model_file]

    x 为上述得到的最优参数 c g 的值, v 的值一般取 5

6 )利用获取的模型进行测试与预测

使用 Svmtrain 训练好的模型进行测试。输入新的 X 值,给出 SVM 预测出的 Y

  $ Svmpredict   test_file   model_file   output_file

如: ./svm-predict heart_scale  heart_scale.model  heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

这里显示的是结果

一个具体使用的例子。

      libsvm 中的 heart_scale 作为训练数据和测试数据,同时已经将 python 安装至 c 盘,并将 grid.py 文件中关于 gnuplot 路径的默认值修改为实际解压缩后的路径,将

heart_scale grid.py python.exe 拷贝至 /libsvm/windows 文件夹下。

./svm-train heart_scale

optimization finished, #iter = 162

nu = 0.431029

obj = -100.877288, rho = 0.424462

nSV = 132, nBSV = 107

Total nSV = 132

此时,已经得到 heart_scale.model ,进行预测:

./svm-predict heart_scale   heart_scale.model   heart_scale.out

Accuracy = 86.6667% (234/270) (classification)

正确率为 Accuracy = 86.6667%

./python grid.py heart_scale

得到最优参数 c=2048 g=0.0001220703125.

./svm-train -c 2048 -g 0.0001220703125 heart_scale 得到 model 后,由 ./svm-predict heart_scale   heart_scale.model heart_scale.out 得到的正确

率为 Accuracy = 85.1852%.这块还有点迷惑?为什么正确率降低了?

 

当然也可以结合subset.py 和 easy.py 实现自动化过程。

如果要训练多次,可以写个批处理程序省好多事。

这里举个例子:

::@ echo off
cls
:: split the data and output the results
for /L %%i in (1,1,1000) do python subset.py b59.txt 546 b59(%%i).in8 b59(%%i).out2

for /L %%i in (1,1,1000) do python easy.py b59(%%i).in8 b59(%%i).out2 >> result89.txt

 

这段批处理代码首先调用subset.py对文件b59.txt执行1000次分层随机抽样(对数据进行80-20%分割)然后调用easy.py 进行1000次参数寻优,把记录结果写到result89.txt中

(包括1000次训练的分类准确率和参数对)。

还可以调用fselect.py进行特征选择,调用plotroc.py进行roc曲线绘制。

先写到这里吧,希望能和大家一起学习libsvm,进一步学好svm。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值