libsvm使用心得

来源:互联网 发布:汉唐自远 知乎 编辑:程序博客网 时间:2024/05/29 13:21
svmutil中主要包含了以下几个函数:

svm_train(): train an SVM model

Train ( 训练 ) data. 跑 SVM 被戏称为 " 开火车 " 也是由于这个程序名而来 . train 会接受特定格式的输入 , 产生一个 "Model" 檔 . 这个 model 你可以想象成 SVM 的内部数据 , 因为 predict 要 model 才能 predict, 不能直接吃原始数据 . 想想也很合理 , 假定 train 本身是很耗时的动作 , 而 train 好可以以某种形式存起内部数据 , 那下次要 predict 时直接把那些内部数据 load 进来就快多了 .


svm_predict()      : predict testing data

依照已经 train 好的 model, 再加上给定的输入 ( 新值 ), 输出 predict ( 预测 ) 新值所对应的类别 (class)


svm_read_problem() : read the data from a LIBSVM-format file.

数据格式问题:

画点分区的例子来说,我们不是每个点都有 X 跟 Y 的坐标吗? 所以它就有 两种 attribute 。 假定我有两个点: (0,3) 跟 (5,8) 分别在 label(class) 1 跟 2 ,那就会写成 1 1:0 2:3

2 1:5 2:8


同理,空间中的三维坐标就等于有三组 attribute 。

这种档案格式最大的好处就是可以使用 sparse matrix , 或说有些 data 的 attribute 可以不存在。


svmscale:Rescale data.

因为原始数据可能范围过大或过小 , svmscale 可以先将数据重新 scale ( 缩放 ) 到适当范围 .这种档案格式最大的好处就是可以使用 sparse matrix , 或说有些 data 的 attribute 可以不存在。

svm_load_model()   : load a LIBSVM model.
svm_save_model()   : save model to a file.

evaluations()      : evaluate prediction results.


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是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。举个例子如下:



利用libsvm里面自带的癌症数据:

import os

os.chdir(‘/home/huangjiaheng/下载/libsvm-3.21/python’)

#当退出python的时候需要重新执行此操作,即使sys.path.append('/home/huangjiaheng/下载/libsvm-3.21/python')也是不可以,具体#原因暂时未知
from svmutil import *
y, x = svm_read_problem(‘../heart_scale’)

#利用前200个数据做训练数据来求参数

m = svm_train(y[:200], x[:200], ‘-c 4’)

#得到结果:

“”“

*.*
optimization finished,

#iter = 257
nu = 0.351161
obj = -225.628984, rho = 0.636110
nSV = 91, nBSV = 49
Total nSV = 91


#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 %以下为支持向量

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)

这里显示的是结果

一个具体使用的例子。


”“”

p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)



数据格式转换技巧:

其实这个软件就是一个excel工作薄,没什么奇特,打开它就会跳出来一个对话框,选“启用宏”就行了,其他不用管它,把你要的数据拷上去就好了,但是注意下格式,网上帖子也很多,照他们说的办吧。

1,先运行FormatDataLibsvm.xls然后将数据粘贴到sheet1的topleft单元。
   2,再"工具"-->"宏"-->执行下面有一个选项(FormatDatatoLibsvm)-->执行,要选中这个然后运行就可以了 ,这时数据转换的问题就解决了,可是现在生成的数据是.xls格式,它还是不能做为libsvm的训练文件啊!还需要怎么转换呢?

3,可以copy到一个记事本中即可。但是注意在用libsvm的时候要在命令行输入.txt后缀。 

注意,宏安全性应当设置为中或者低。输入数据的格式是

条件属性a  条件属性b  ...  决策属性
      ...  2
      ...  1

输出数据格式是

决策属性  条件属性a  条件属性b  ...
   1:7    2:5    ...
   1:4    2:2    ... 

P.S.在第2步时,执行下面还有另一个选项(FormatDatafromLibsvm)这个可以把libsvm数据的格式重新转回来,转到你第1步时刚拷贝到excel里的数据形式


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, 从编程的角度来说, 这样做可以减少内存的使用, 并提高做矩阵内积时的运算速度. 我们平时在matlab中产生的数据都是没有序号的常规矩阵, 所以为了方便最好编一个程序进行转化.

2). svmscale的用法

svmscale是用来对原始样本进行缩放的, 范围可以自己定, 一般是[0,1]或[-1,1]. 缩放的目的主要是

1) 防止某个特征过大或过小, 从而在训练中起的作用不平衡;

2) 为了计算速度. 因为在核计算中, 会用到内积运算或exp运算, 不平衡的数据可能造成计算困难.

用法: svmscale [-l lower] [-u upper]

              [-y y_lower y_upper]

              [-s save_filename]

              [-r restore_filename] filename

其中, []中都是可选项:

         -l: 设定数据下限; lower: 设定的数据下限值, 缺省为-1

         -u: 设定数据上限; upper: 设定的数据上限值, 缺省为1

         -y: 是否对目标值同时进行缩放; y_lower为下限值, y_upper为上限值;

         -s save_filename: 表示将缩放的规则保存为文件save_filename;

         -r restore_filename: 表示将按照已经存在的规则文件restore_filename进行缩放;

         filename: 待缩放的数据文件, 文件格式按照libsvm格式.

默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt)

         svmscale test.txt

这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符>来另存为(假设为out.txt):

         svmscale test.txt > out.txt

运行后, 我们就可以看到目录下多了一个out.txt文件, 那就是规范后的数据. 假如, 我们想设定数据范围[0,1], 并把规则保存为test.range文件:

         svmscale –l 0 –u 1 –s test.range test.txt > out.txt

这时, 目录下又多了一个test.range文件, 可以用记事本打开, 下次就可以用-r test.range来载入了.

3). svmtrain的用法

svmtrain我们在前面已经接触过, 他主要实现对训练数据集的训练, 并可以获得SVM模型.

用法: svmtrain [options] training_set_file [model_file]

其中, options为操作参数, 可用的选项即表示的涵义如下所示:

-s 设置svm类型:

         0 – C-SVC

         1 – v-SVC

         2 – one-class-SVM

         3 – ε-SVR

         4 – n – SVR

-t 设置核函数类型, 默认值为2

         0 — 线性核: μν

         1 — 多项式核:    (γμν+coef0)degree

         2 — RBF核: exp(γμν2)

         3 — sigmoid 核: tanh(γμν+coef0)

-d degree: 核函数中的degree设置(针对多项式核函数)(默认3);

-g r(gama): 核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k);

-r coef0: 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0);

-c cost: 设置C-SVC, e -SVR和v-SVR的参数(损失函数)(默认1);

-n nu: 设置v-SVC, 一类SVM和v- SVR的参数(默认0.5);

-p p: 设置e -SVR 中损失函数p的值(默认0.1);

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

-e eps: 设置允许的终止判据(默认0.001);

-h shrinking: 是否使用启发式, 0或1(默认1);

-wi weight: 设置第几类的参数C为weight*C (C-SVC中的C) (默认1);

-v n: n-fold交互检验模式, n为fold的个数, 必须大于等于2;

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

model_file: 可选项, 为要保存的结果文件, 称为模型文件, 以便在预测时使用.

其中-g选项中的k是指输入数据中的属性数. option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差. 以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合, 如果设置的参数在函数或SVM类型中没有也不会产生影响, 程序不会接受该参数; 如果应有的参数设置不正确, 参数将采用默认值.

training_set_file是要进行训练的数据集; model_file是训练结束后产生的模型文件, 文件中包括支持向量样本数, 支持向量样本以及lagrange系数等必须的参数; 该参数如果不设置将采用默认的文件名, 也可以设置成自己惯用的文件名.

默认情况下, 只需要给函数提供一个样本文件名就可以了, 但为了能保存结果, 还是要提供一个结果文件名, 比如: test.model, 则命令为:

    svmtrain test.txt test.model

4). svmpredict 的用法

svmpredict 是根据训练获得的模型, 对数据集合进行预测.

用法: svmpredict [options] test_file model_file output_file

其中, options为操作参数, 可用的选项即表示的涵义如下所示:

-b probability_estimates: 是否需要进行概率估计预测, 可选值为0 或者1, 默认值为0.

model_file: 是由svmtrain 产生的模型文件;

test_file: 是要进行预测的数据文件, 格式也要符合libsvm格式, 即使不知道label的值, 也要任意填一个, svmpredict会在output_file中给出正确的label结果, 如果知道label的值, 就会输出正确率;

output_file: 是svmpredict 的输出文件, 表示预测的结果值.


0 0
原创粉丝点击