再次讨论libsvm的C-SVC问题关于wi参数的讨论
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
再次讨论libsvm的C-SVC问题关于wi参数的讨论
这个是⽤-s来调节的。
-s svm_type : set type of SVM (default 0)
0 -- C-SVC
1 -- nu-SVC
2 -- one-class SVM
3 -- epsilon-SVR
4 -- nu-SVR
-wi 这个参数就是调整不同类别的惩罚参数的。
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1)
-wi ⽤法的⼀个⼩例⼦
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default 1) (这个说的多明确啊,还不明⽩吗?囧)再说的明确,⼤⽩话⼀点如下:
-wi weight 可以将类别号为i 的这个类别的惩罚参数变为weight*C
⽐如测试数据有两类,标签分别为1 -1 如果之前设置了c=14
此时再⽤-w1 0.5 -w-1 10 参数设置则此时标签为1的这类的惩罚参数变为0.5*14 = 7
标签为-1的这类的惩罚参数变为10*14 = 140
/doc/ce17581785.html
/thread-89155-1-1.html
Libsvm使⽤⼼得
⾸先下载Libsvm、Python和Gnuplot:
l libsvm的主页/doc/ce17581785.html
.tw/~cjlin/libsvm/上下载libsvm (我⾃⼰⽤2.86版本)
l python的主页/doc/ce17581785.html
下载 python (我⾃⼰⽤2.5版本)
l gnuplot的主页/doc/ce17581785.html
/下载gnuplot (我⽤4.0版本)
LIBSVM 使⽤的⼀般步骤是:
1)按照LIBSVM软件包所要求的格式准备数据集;
2)对数据进⾏简单的缩放操作;
3)⾸要考虑选⽤RBF 核函数;
4)采⽤交叉验证选择最佳参数C与g ;
5)采⽤最佳参数C与g 对整个训练集进⾏训练获取⽀持向量机模型;
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的损失函数中的e ,默认值为0.1;
-m cachesize:设置cache内存⼤⼩,以MB为单位(默认40):
-e e :设置终⽌准则中的可容忍偏差,默认值为0.001;
-h shrinking:是否使⽤启发式,可选值为0 或1,默认值为1;
-b 概率估计:是否计算SVC或SVR的概率估计,可选值0 或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认值为1;
-v n:n折交叉验证模式。
其中-g选项中的k是指输⼊数据中的属性数。
操作参数 -v 随机地将数据剖分为n 部分并计算交叉检验准确度和均⽅根误差。
以上这些参数设置可以按照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 %设置核函数中的g ,默认值为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.43396
2 5:-0.383562 6:-1 7:-1 8:0.068702
3 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与g 对整个训练集进⾏训练获取⽀持向量机模型
$ 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。