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'*v1--多项式核函数 (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= 回归参数 iter:迭代次数 nu: 与前面的操作参数-n nu 相同 obj:为SVM问题转换为的二次规划求解得到的最小值 rho:表示决策函数中的常数项的相反数(-b) nSV:标准支持向量个数,就是在分类的边界上,松弛变量等于0,拉格朗日系数 0= 交叉验证(Cross Validation)方法使用简介 交叉验证(Cross Validation, CV) 是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标. 1. 参数寻优 调参: 正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高;当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态;当模型训练集和测试集上准确率都比较低,模型处于欠拟合状态。正常来说测试集上的准确率都会比训练集要低。 以rbf作为核的SVM为例,这时候我们需要调节的参数是正则化参数C和核函数参数gamma。交叉验证是常用的对SVM参数寻优的方法 SVM模型有两个非常重要的参数C与gamma。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