libsvm参数使用说明

libsvm的使用详解,方便简洁,另附cg参数寻优工具箱链接

1.训练的参数:

-s svm类型:设置SVM模型类型(默认0)  关联参数
- 0 -- c-svc (多分类                                        -c (默认1)
- 1 -- nu-svc  (一对一分类   -n (默认0.5)
- 2 -- one-class SvM (分布估计    -n (默认0.5)
- 3 -- epsilon-SVR (回归      -c (默认1)、-p(默认0.1)
- 4 -- nu-sVR     -c (默认1)、-n (默认0.5)
-t 核函数类型:核函数设置类型表达式 关联参数 
0--线性核函数:u'*v
1--多项式核函数

(gamma*ultv + coef0)^degree

-g gamma(默认1/num_features,即属性数目的倒数)

-r coefO(默认0),c=0,同质多项核函数;c=1,不同质多项核函数

-d degree(默认3)   多项式次数d≥1(一般选择3以下

2 -- RBF核函数(默认): 高斯核函数,也叫径向基和函数(最常见

exp(-gamma*|u-v|^2)  或

exp[-|u-v|^2/(2σ^2)], gamma=1/(2σ^2)

-g gamma (默认1/num_features,即属性数目(就是特征的维度数)的倒数)

3 -- sigmoid核函数:

tanh(gamma*u'*v + coef0)

-g gamma(默认1/num_features,即属性数目的倒数).

-r coef0(默认0)

4 --预定义核函数(指定核矩阵)

核函数的具体介绍可见:(1条消息) 支持向量机的核函数及其选择_sunflower_sara的博客-CSDN博客_支持向量机核函数 

 t4参数的使用例子:

使用-t4参数时,是自己构造核矩阵。

例:线性核函数是K(x,x')=(x*X'),设训练集是train_data,设训练集有150个样本,测试集是test_data,设测试集有120个样本。则训练集的核矩阵是ktrain1 = train_data*train_data'; 测试集的核矩阵是ktest1 = test_data*train_data'。

想要使用-t4参数还需要把样本的序列号放在核矩阵前面,形成一个新的矩阵,然后使用svmtrain建立支持向量机,再使用svmpredict进行预测即可。形式与使用其他-t参数稍有不同,大致过程如下:             

ktrain1 = train_data*train_data';
Ktrain1 =[(1:150)'',ktrain1];          % 序列号放在第一列
model_precomputed1 = svmtrain(train_label, Ktrain1, '-t 4'); % 注意此处的输入 Ktrain1. 
ktest1 = test_data*train_data';
Ktest1 = [(1:120)', ktest1];
[predict_label_P1, accuracy_P1, dec__values_P1]=svmpredict(test_label,Ktest1,model_precomputed1);%注意此处输入Ktest1
其他参数介绍
- d degree核函数中的degree设置(针对多项式核函数)(默认3)
- g gama核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/num_features, 即属性数目的倒数)
-r coef0核函数中的coef0设置(针对多项式/sigmoid核函数)(默认O)-c cost:设置C-SVc,epsilon-SVR的参数(损失函数)(默认1)
-n nu设置nu-SVc,one-class SVM和nu-SVR的参数(默认0.5)
-p epsilon设置epsilon-SVR中损失函数epsilon的值(默认0.1)
-m cachesize设置cache内存大小,以MB为单位(默认100)
-e eps设置允许的终止判据(默认0.001)
-h shrinking是否使用启发式,0或1(默认1)

-wi weight

设置第几类的参数C为weight*C(c-SVC中的C)(默认1)·。i指的是标签类型的标号

该参数只能在模型c-svc (-s0)中使用。

当某一类样本的数目比较少时,可以给其设置较大的惩罚参数,提高这一类样本的分类准确率。     

-v n

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

参数-v随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。

 -wi weight例子:

%% 设样本有两类,类别标签是1和-1,标签为1的样本较少。 
modelwi = svmtrain(label,data,'-c 1 -w1 2 -w-1 0.5');    % wi中i代表类别的标签号
% -标签为1的样本的惩罚参数是1*2=2
% -标签为-1的样本的惩罚参数是1*0.5=0.5

 将wi的数值改动后结果和原结果对比:可观察到改动后第一类分类准确率有了提升(这里只是举个简单小例子不能直接用,第二类准确率可看到明显降低了)

         以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影啊,程序不会接受该参致。如果应有的参数设置不正确,参擞将采用默认。

2.训练:

model= svmtrain(train_label, train_matrix, ['libsvm_options']);

- train_label:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。 

-train_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。当使用precomputed核时,[training_instance_matrix]由两部分组成,第一列为长度m,从1-m的序号,第二列之后是训练样本核。

例如:model = svmtrain(trainlabel, ... #训练样本的标签
            [(1 : size(trainfeat, 1))', trainfeat], ... #训练样本
            '-t 4 -q'); #参数

-libsvm_options:训练的参数,见上文1

3.预测返回内容:

[predicted_label, accuracy/mse,decision_values/prob_estimates]=svmpredict(test_label, test_matrix, model, ['libsvm_options']);

-predicted_label第一个返回值,表示样本的预测类标号,即预测得到的标签。 

-accuracy/mse第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。其中第1个数字用于分类问题,表示分类准确率;后两个数字用于回归问题,第2个数字表示mse;第三个数字表示平方相关系数注意:当使用预训练核时,并不能取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的预测结果。

-test_labe: 表示测试集的标签(这个值可以不知道,因为作预测的时候,本来就是想知道这个值的,这个时候,随便制定一个值就可以了,只是这个时候得到的mse就没有意义了)。

-test _matrix: 表示测试集的属性矩阵。

-model: 是上面训练得到的模型。

-libsvm_options: 是需要设置的一系列参数。

4.modle参数

model.Parameters参数意义从上到下依次为:
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:和函数中的degree设置(针对多项式核函数)(默认3)
-g gama:核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)(默认为0)

model.Label:表示数据集中类别的标签
model.nr_class:表示数据集中有多少标签 
model.totalSV:代表总共的支持向量机的数目
model.nSV:表示每类样本的支持向量的数目,就是在分类的边界上,松弛变量等于0
model.sv_coef:表示支持向量在决策函数中的系数
model.SVs:表示支持向量
model.rho:表示决策函数中的常数项的相反数(-b)
model.sv_indices:表示支持向量在数据集中的位置

5.结果参数解析:

分类参数

iter:迭代次数
nu: 与前面的操作参数-n nu 相同
obj:为SVM问题转换为的二次规划求解得到的最小值
rho:表示决策函数中的常数项的相反数(-b)
nSV:标准支持向量个数,就是在分类的边界上,松弛变量等于0,朗格朗日系数 0=<ai<C  
nBSV:边界的支持向量个数,不在分类的边界上,松弛变量大于0,拉格郎日系数 ai = C
Accuracy:预测结果的准确率, 为3*1的向量,第一维就是准确率,显示为百分比,如95,精度就是95%

回归参数

iter:迭代次数
nu: 与前面的操作参数-n nu 相同
obj:为SVM问题转换为的二次规划求解得到的最小值
rho:表示决策函数中的常数项的相反数(-b)
nSV:标准支持向量个数,就是在分类的边界上,松弛变量等于0,拉格朗日系数 0=<ai<C  
nBSV:边界的支持向量个数,不在分类的边界上,松弛变量大于0,拉格郎日系数 ai = C
Mean squared error:均方误差
Squared correlation coefficient:平方相关系数
 

交叉验证(Cross Validation)方法使用简介

交叉验证(Cross Validation, CV) 是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.   

1. 参数寻优

调参:

正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高;当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态;当模型训练集和测试集上准确率都比较低,模型处于欠拟合状态。正常来说测试集上的准确率都会比训练集要低。

以rbf作为核的SVM为例,这时候我们需要调节的参数是正则化参数C和核函数参数gamma。交叉验证是常用的对SVM参数寻优的方法

SVM模型有两个非常重要的参数Cgamma。C过大或过小,泛化能力变差。gamma值越小,模型的泛化性变好, 但过小,模型实际上会退化为线性模型;gamma越大,理论上SVM可以拟合任何非线性数据。

rbf调参参数参数说明
C松弛系数的惩罚项系数,即对误差的宽容度默认1,必须大于0,可不填。如果C值设定比较大,那SVC可能会选择边际较小的,能够更好地分类所有训练点的决策边界,不过模型的训练时间也会更长。如果C的设定值较小,那SVC会尽量最大化边界,决策功能会更简单,但代价是训练的准确度。换句话说,C在SVM中的影响就像正则化参数对逻辑回归的影响。即c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合
gammaRBF函数作为kernel,函数自带的一个参数。默认1/属性数目含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多

RBF公式里面的sigma和gamma的关系如下(见上文-训练的参数-核函数类型):

gamma的物理意义:大家提到很多的RBF的幅宽,它会影响每个支持向量对应的高斯的作用范围,从而影响泛化性能。我的理解:如果gamma设的太大,会很小,很小的高斯分布长得又高又瘦, 会造成只会作用于支持向量样本附近,对于未知样本分类效果很差,存在训练准确率可以很高,(如果让无穷小,则理论上,高斯核的SVM可以拟合任何非线性数据,但容易过拟合)而测试准确率不高的可能,就是通常说的过训练;而如果设的过小,则会造成平滑效应太大,无法在训练集上得到特别高的准确率,也会影响测试集的准确率。

此外,可以明确的两个结论是:

结论1: 样本数目少于特征维度并不一定会导致过拟合

结论2:RBF核应该可以得到与线性核相近的效果(按照理论,RBF核可以模拟线性核),可能好于线性核,也可能差于,但是,不应该相差太多。

当然,很多问题中,比如维度过高,或者样本海量的情况下,大家更倾向于用线性核,因为效果相当,但是在速度和模型大小方面,线性核会有更好的表现。

在调参时,正常情况下,我们都会先设置C和gamma的值在0.1~10之间,然后在根据模型的表现,每次乘以0.1或者10作为一个步长,当确定大致范围后,再细化搜索区间

2.K-fold Cross Validation(K-CV)在svmtrain中的使用方法

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标. 

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

参数-v随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。

当svmtrain使用在训练中使用了-v参数进行交叉验证时,svmtrain返回的不再是一个结构体model,是交叉验证的分类的正确率或者回归的均方根误差。

举例:

结构体model:

 使用交叉验证:

model_precomputed2 = svmtrain(trainLabel, Ktrain2,'-t 4 -v 5');

 对于分类问题,返回的交叉检验下的平均分类准确率; 回归问题,返回的是交叉检验下的平均均方根误差。

看实例

accuracy = svmtrain(heart_scale_label,heart_scale_inst,'-s 0 -v 5')     % s0分类问题

mse = svmtrain(heart_scale_label,heart_scale_inst,'-s 3 -v 5')         % s3 回归问题

-v一般选择5或者10,表示5折或10折交叉检验。

可以参考:

训练集、验证集、测试集以及交验验证的理解_Kieven2oo8的博客-CSDN博客_验证集

对于1.的参数c、g寻优,可使用faruto大神的基于libsvm的工具箱中的SVMcgForClass.m函数,网上很多人的参数寻优函数都是使用或者参考的这个,附上该函数的地址和该工具箱的直接下载地址:

SVMcgForClass.m源代码:

基于GridSearch的svm参数寻优|MATLAB 支持向量机|MATLAB技术论坛 - Powered by Discuz!

faruto工具箱直接下载地址:

(更新libsvm-faruto版本归来)libsvm-3.1-[FarutoUltimate3.1Mcode]|MATLAB 支持向量机|MATLAB技术论坛 - Powered by Discuz! (matlabsky.com)

本文参考链接:

(9条消息) libsvmpredict和svmtrain的参数和返回值_fsfsfsdfsdfdr的博客-CSDN博客_libsvmpredict

Libsvm参数实例详解——《Learn SVM Step by Step》by faruto_哔哩哔哩_bilibili

SVM之交叉验证【转】_tingxie9116的博客-CSDN博客_svm 交叉验证

使用SVM模型进行分类预测时的参数调整技巧_沫嫣子的博客-CSDN博客_如何提高svm预测精度

(17条消息) SVM中参数C的理解_圻子-的博客-CSDN博客_svm中的参数c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值