【libsvm】参数使用
2022.3.15 星期二
太多了,自己多跑跑数据,改改代码就眼熟了。记录一下免得每次找。
一、参数
1. 读取
libsvmread函数可以读取以LIBSVM格式存储的数据文件。
[label_vector, instance_matrix] = libsvmread(‘data.txt’);这个函数输入的是文件的名字,输出为样本的类标和对应的特征。
2.保存
libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。libsvmwrite(‘data.txt’, label_vector, instance_matrix]
这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。
3. 训练
libsvm函数用于对训练集的数据进行训练,得到训练好的模型。
model = svmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);
这个函数有三个参数,其中
- -training_label_vector:训练样本的类标。如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
- -training_instance_matrix:训练样本的特征。如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
- -libsvm_options:训练的参数,在第5点详细介绍。
4. 预测
libpredict函数用于对测试集的数据进行测试,还能对未知样本进行预测。
[predicted_label, accuracy, decision_values/prob_estimates]
= svmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);
这个函数包括四个参数,其中
- -testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
- -testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
- -model:使用libsvmtrain返回的模型
- -libsvm_options:预测的参数,与训练的参数形式一样。
5. 训练的参数 libsvm_options
- -s svm类型:SVM设置类型(默认0)
0 — C-SVC:C-支持向量分类机;参数C为惩罚系数,C越大表示对错误分类的惩罚越大,适当的参数C对分类Accuracy很关键。
1 — v-SVC:v-支持向量分类机;由于C的选取比较困难,用另一个参数v代替C。C是“无意义”的,v是有意义的。(与C_SVC模型相同,但参数C的范围不同,C_SVC是0到正无穷,该类型是[0,1])
2 — 一类SVM:单类别-支持向量机;不需要类标号,用于支持向量的密度估计和聚类。
后两者是针对回归问题的,分类问题与回归问题最大的不同就是label,分类的label是类别,比如+1,-1,回归的label是目标值,可能为任意值。
3 — e-SVR:ε-支持向量回归机;不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域。
4 — v-SVR:n-支持向量回归机;由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。
- -t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数
1 – 多项式核函数:(r*u’v + coef0)^degree (重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)
2 – RBF(径向基)核函数:exp(-r|u-v|^2)均方差反映了数据波动的大小;(参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)
3 – sigmoid核函数:tanh(r*u’v + coef0) ( 两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1) - -d degree:核函数中的degree设置(只针对多项式核函数)(默认3)
- -g r(gamma):核函数中的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:是否使用启发式,0或1(默认1)
- -wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
- -b probability_estimates:是否训练SVC或SVR模型进行概率估计,0或1(默认为0)
- -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
6. 训练返回的内容
libsvmtrain函数返回训练好的SVM分类器模型,可以用来对未知的样本进行预测。这个模型是一个结构体,包含以下成员:
- -Parameters: 一个5 x 1的矩阵,从上到下依次表示:
-s SVM类型(默认0);
-t 核函数类型(默认2)
-d 核函数中的degree设置(针对多项式核函数)(默认3);
-g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0) - -nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
- -totalSV: 表示支持向量的总数。
- -rho: 决策函数wx+b中的常数项的相反数(-b)。
- -Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
- -ProbA: 使用-b参数时用于概率估计的数值,否则为空。
- -ProbB: 使用-b参数时用于概率估计的数值,否则为空。
- -nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
- -sv_coef: 表示每个支持向量在决策函数中的系数。
- -SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。
7. 预测返回的内容
libsvmtrain函数有三个返回值,不需要的值在Matlab可以用~进行代替。
- -predicted_label:第一个返回值,表示样本的预测类标号。
- -accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
- -decision_values/prob_estimates:
- 第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题:
- 如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;
- 如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。
ps.libsvm可以对多类进行分类,采取的策略为“一对一”,即:K类会有N = (K-1)*K/2个SVM分类器,对样本N个分类器都进行分类,会有N个分类结果,对分类结果中的类别进行统计,出现次数最多的类别为样本类别
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | %训练及测试数据 trainx=[-5,4;-4,5;5,4;4,5;-5,-5;-4,-5;6,-5;5,-6]; trainy=[1;1;2;2;3;3;4;4]; testx=[-6,5;7,4;-7,6;7,5;-100,-100]; testy=[1;2;3;4;3]; %训练程序 %1 model1 = svmtrain(trainy,trainx, '-c 2 -g 0.02 -t 1 ' ); %未指定 -b 1 [~,~,p1] = svmpredict(testy,testx,model1); %未指定 -b 1 %2 model2 = svmtrain(trainy,trainx, '-c 2 -g 0.02 -t 1 -b 1' ); %指定 -b 1 [~,~,p2] = svmpredict(testy,testx,model2); %未指定 -b 1 %3 会报错:Model does not support probabiliy estimates model3 = svmtrain(trainy,trainx, '-c 2 -g 0.02 -t 1 ' ); %未指定 -b 1 [~,~, p3] = svmpredict(testy,testx,model3, '-b 1' ); %指定 -b 1 %4 model4 = svmtrain(trainy,trainx, '-c 2 -g 0.02 -t 1 -b 1' ); %指定 -b 1 [~,~, p4] = svmpredict(testy,testx,model4, '-b 1' ); %指定 -b 1 |
<1>svmtrain(…)中,未指定“-b 1” 时,训练得到的model1;
<2>svmtrain(…)中,指定“-b 1” 时,训练得到的model2;
对比可知,训练时,如果未指定“-b 1”训练模型结构体中,ProbA和ProbB为空,指定时,为K*1的列向量,(K为训练样本类别数)
<3>svmpredict(…)中,指定“-b 1” 时,概率估计(prob_estimates)p4每一行表示一个样本属于每个类别的概率。
<4>svmpredict(…)中,未指定“-b 1” 时,决策值(decision_values)p1;
训练样本有4类有6个二类SVM,最终类别归于类别投票中,出现次数最多的一类,下面对投票过程进行分析:
决策值矩阵列数为6,每列表示一个二类SVM的决策值:
如图,第一列是第一类和第二类SVM的决策值value。value>0,则表示在第一类和第二类比较判别中,样本属于第一类,value<0表示属于第二类;其他列可同理分析,以第5行数据分析投票结果:
从票数统计看,第三类得票最多,因此测试样本5属于第三类。
1,2,1,2,3
二、核函数
在LIBSVM中-t用来指定核函数类型(默认值是2)。
0)线性核函数
1)多项式核函数
2)RBF核函数
3)sigmoid核函数
4)自定义核函数
常用的四种核函数对应的公式如下:
与核函数相对应的参数:
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。
三 超参数
SVM的rbf核函数调参参数模型有两个非常重要的参数C与gamma。
结论:
- C过大或过小,泛化能力变差。
- gamma值越小,模型的泛化性变好, 但过小,模型实际上会退化为线性模型;gamma越大,理论上SVM可以拟合任何非线性数据。
- 相同的模型表现下,取较小的 C (C 值较小能够节省内存,而且跑的更快)。
参考文献: 1.支持向量机通俗导论 支持向量机通俗导论(理解SVM的三层境界)_v_JULY_v的博客-CSDN博客_svm算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】