libsvm的使用说明

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37789876/article/details/82594065

SVM是一个以空间为依据的机器学习算法

重点:libsvm实现多分类是1V1的方法实现的

1、C-SVC
以惩罚系数为基础来进行近似平面分割
2、V-SVC
以错分的比例来近似平面分割,是对C-SVC的改进版本,解决了惩罚系数的难以确定的问题。


SVM包括SVC和SVR,一个是分类,一个是回归。
1.E-SVR (ε-SVR)
2.v-SVR
他们的区别没有找到具体的点,有人说ε-SVR是最小化ε为目标;v-SVR是限制向量机的数量为目的。


核函数:
0–线性:u’v
1–多项式:(r*u’v + coef0)^degree
2–RBF函数:exp(-gamma|u-v|^2)
3–sigmoid:tanh(r*u’v + coef0)


开始使用libsvm

在python中有两个svm模块:svm和svmutil
选择svmutil这个高级包装过的就完事。

svmutil里包涵了以下函数:

  • svm_train() : 训练SVM模型

    svm_predict() : 预测测试数据结果

    svm_read_problem() : 读取数据.

    svm_load_model() : 加载SVM模型

    svm_save_model() :保存SVM模型.

    evaluations() : 检验预测结果.

还有下列函数

  • svm_problem(y, x):返回一个problem类,作用等同于记录y,x列表

    svm_parameter(‘training_options’):返回一个parameter类,作用是记录参数选择


svm_read_problem() : 读取数据.
读取文件,文件格式必须要以下面的形式保存:

<label1> <index1>:<value1> <index2>:<value2> ..... <index L>:<valueL>
<label2> ......................

或者你干脆别读取文件了,直接把数据丢进 svm_train()里面训练把

自动数据转化:https://blog.csdn.net/kobesdu/article/details/8944851


先在这里放一个最基本的使用例子

>>>from svmutil import *

#读取LIBSVM数据,分别存入y,x列表,其中y为类别,x为训练样本

>>>y, x = svm_read_problem(r'E:\Projects\Python\svmlib\heart_scale')

#使用前200个数据进行训练,svm_train返回的是model类,表示通过训练产生的model

>>>m =  svm_train(y[:200], x[:200], '-c 4' )

#使用后70个数据对训练的model m进行检验

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

#能够将训练产生的model保留成为文件

>>> svm_save_model('heart_scale.model', m)

#读取保存的model

>>> m = svm_load_model('heart_scale.model')

>>> p_label, p_acc, p_val = svm_predict(y, x, m, '-b 1')

#得到训练检验结果

>>> ACC, MSE, SCC = evaluations(y, p_label)

其实呢,随便用用也好用。认真的用就要好好调整一下参数了。
参数写在哪里呢,就像linux命令一样,就喜欢在命令后面跟着一些args来装逼
libsvm也是一样,也喜欢用字符串输入的形式来装逼。
上面的代码有两个很显眼的字符串,不知道你看见没。
好了下面来开始介绍如何选择参数,而不是一股脑默认参数了。

下面介绍下使用过程中涉及到的一些参数函数:

-s   svm类型:SVM设置类型(默认0)

    0 -- C-SVC

    1 -- v-SVC

    2–一类SVM

    3 -- e -SVR

    4 -- v-SVR

-t   核函数类型:核函数设置类型(默认2)

    0–线性:u'v

    1–多项式:(r*u'v + coef0)^degree

    2–RBF函数:exp(-gamma|u-v|^2)

    3–sigmoid:tanh(r*u'v + coef0)

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

-g  r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
(默认1/ k)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:是否使用启发式,01(默认1)

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

-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2随机地将数据剖分为n部

-b 概率估计:是否计算SVCSVR的概率估计,可选值01(默认0);要使用的话,训练和预测都要写上-b 1

**小提示**:
1、C一般可以选择为:10^t , t=- 4..4就是0.0001到10000,
选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合
2、如果你要输出类的概率,一定要有-b参数
3、在LIBSVM中-t用来指定核函数类型(默认值是2)。
**大提示**:
与核函数相对应的libsvm参数:
(1)对于线性核函数,没有专门需要设置的参数
(2))对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。
(3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。
(4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

程序跑起来之后呢,或有一些东西显示在控制台中,怎么看懂呢?
rho 为判决函数的常数项b#iter为迭代次数,
nu 与前面的操作参数-n n 相同,
obj 为SVM文件转换为的二次规划求解得到的最小值,
nSV 为支持向量个数,
nBSV 为边界上的支持向量个数,
Total nSV 为支持向量总个数。


libsvm中提供了一些的工具包用来帮助你来干一些事情,比如,帮你生成满足svm_read_problem()格式的文本;再比如来帮你选择参数。
在tools里面哦,嘻嘻,是要在控制台用命令来运行的哦不是python模块哦。

svm-scale:这是能够放缩输入数据的工具

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

使用方法:
svm-scale.exe [-l lower] [-u upper] [-y y_lower y_upper] [-s save_name] [-r store_name] filename
其中:

-l lower : x scaling lower limit (default -1)      特征值缩放下限,默认为-1
-u upper : x scaling upper limit (default +1)    特征值缩放上限,默认为+1
-y y_lower y_upper : y scaling limits (default: no y scaling) 是否对目标值进行缩放及缩放的上下限,默认不缩放  注意:(回归需要对目标进行缩放,因此该参数可以设定为 -y -1 1)
-s save_filename : save scaling parameters to save_filename   表示将缩放的规则保存为文件save_filename
-r restore_filename : restore scaling parameters from restore_filename  表示将缩放规则文件restore_filename载入后按此规则缩放

grid.py:放缩后的数据进行最优参数选择

subset.py:自动选择子集减少训练量

checkdata.py:检查是否符合LIBSVM格式


真正的来选择参数的一般方法:
1首先进行的第一步是缩放拉,别忘记了,有些维度的数量级都不一样,所以。
2优先使用RBF核函数,好吧,我就只使用它了,你打我啊。
3我要得到最好的c和g,怎么得到呢?有两种方法,第一种你他妈自己一个个试,自己用交叉验证一个个试啊,看看最后的交叉验证的总准确率哪个大
或者我就用它的工具了——grid-search,直接把数据给工具看看,什么参数cg比较好,如下:

$ python grid.py svmguide1.scale

2.0 2.0 96.8922

(Best C=2.0, γ=2.0 with five-fold cross-validation rate=96.8922%)

看到了下面一句话了吧,5折交叉,嘻嘻,完事了


还有一个要说的,如果你要自己试试试试的话,那你就在参数里面写上“-v 5”吧,自己慢慢把参数试出来,当然你在交叉验证的话,就没有得出模型的必要了,所以svm_train()也不会给你返回一个模型的。

你不写-v的话说明你是要训练模型的,他就会返回一个模型对象,给你去测试。


p_label, p_acc, p_val = svm_predict(y, x, m)
预测返回了3个值

p_labels: a list of predicted labels,预测类别

p_acc: a tuple including accuracy (for classification), mean squared error, and squared correlation coefficient (forregression),准确率,误差的均方差,和相关系数平方

p_val:a list of decision values or probability estimates

-predicted_label:第一个返回值,表示样本的预测类标号。
-accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。注意:当使用预训练核时,并不能取accuracy(1,1)作为分类结果,应该取:mean(predicted_label==testlabel)

-decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。

用了-b 1 p_val的输出是
[[0.9996690583277612, 0.0002867115032725014, 1.5394385393865908e-05, 2.685416784448345e-06, 7.897280153606174e-06, 1.8253086634441957e-05], [0.95384951162545………

不用的输出是
[[1.237018169077492, 1.1042484569575128, 1.318393105345124, 1.0912965676731043, 1.1200341167596464, 0.22880453718038563, 0.4451201138447924, 0.1435289531635482, 0.35323807157943043, 0.2900798347959511, 0.17455648629158832, 0.17378829211610552, -0.3980821438745112, -0.3385724228391866, 0.07270103377827697], [0.3541923852735188, 0.5935249…………..


ACC, MSE, SCC = svmutil.evaluations(true_val, predict_val)
检验预测结果.也返回了3个值,好像有点意思
准确率,均方误差,相关系数平方
就是和svm_predict(y, x, m)的第二个输出一样的

猜你喜欢

转载自blog.csdn.net/m0_37789876/article/details/82594065
今日推荐