SVM学习笔记与Libsvm-Faruto Ultimat工具箱函数详细资料
事先声明:本文是在https://blog.csdn.net/dulingtingzi/article/details/51012476, https://blog.csdn.net/ckzhb/article/details/72844409与《MATLAB神经网络43个案例分析》基础上进行的归纳与总结:回归算法大致流程与函数介绍
对于很多函数的回归虽然能够得到一个准确地model但是大多时候无法进行精准的预测,或者说预测结果并不能说明什么,例如,用一年前数据随时间的变化预测一个月后的数据变化 我觉着也就后几天的可能会有作用 但是以时间作为自变量,做预测我总感觉不靠谱,自变量起码是对输出结果有影响的因素。—仅个人见解
但是可以通过网络对后几天的变化趋势以及变化空间进行预测,这部分可以看 《MATLAB神经网络43个案例分析》第十六十七章 的对比与详细内容。
利用参数寻优函数进行参数寻优,这里的参数是SVMtrain训练模型的参数,参数找的好,模型训练的就好,可以提高后面预测分类的准确率。不同的SVM类型需要寻优的参数不同。然后利用最优参数去训练模型model,得到模型后就可以利用svmpredict函数进行使用预测了。但是需要注意的是并不一定所有数据都需要进行预处理,有的函数 归一化后效果反而更不好,而且将数据归一化到[0-1]与[1-2]后数据处理结果也不一定相同,所以应当根据情况使用
具体流程为:数据归一化–数据降维处理–根据svm函数选择合适的寻找c,g,p的方法(粗选-精选)–数据训练–数据回归。
函数使用规则与详细介绍
函数分为12-19章的单独的函数介绍以及20章中工具箱整合后函数介绍
函数分类为
核心函数:
svmtrain
svmpredict
预处理函数:
scaleForSVM
pcaForSVM
寻优函数:
SVMcgForClass
gaSVMcgForClass
psoSVMcgForClass
可视化及指标函数:
ClassResult
VF
整合函数:
SVC
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
1. svmtrain
model = svmtrain(train_label, train_data, ‘options’);
[predict_label, accuracy/mse, dec_value] = svmpredict(test_label, test_data,model);
----- svmtrain的调用格式 model = svmtrain(train_label, train_data, ‘options’); 输入 – train_data训练集属性矩阵,大小nm,n表示样本数,m表示属性数目(维数),数据类型double; –
-----train_label训练集标签,大小n1,n表示样本数,数据类型double ;
-----options参数选项, 主要有:
Options:
------s svm类型:设置SVM模型类型(默认0) 0 – C-SVC 1 – nu-SVC 2 – one-class SVM 3 – epsilon-SVR 4 – nu-SVR
------t 核函数类型:核函数设置类型(默认2) 0 – 线性核函数: u’v 1 – 多项式核函数: (gammau’v + coef0)^degree 2 --RBF核函数: exp(-gamma|u-v|^2) 3 – sigmoid核函数: tanh(gamma*u’v + coef0) 4 – 预定义核函数(指定核矩阵)
------d degree:核函数中的degree设置(针对多项式核函数)(默认3)
------g gama:核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/num_features,即属性数目的倒数)
------r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)(默认0)
------c cost:设置C-SVC,epsilon-SVR和nu-SVC的参数(损失函数)(默认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为weightC(C-SVC中的C)(默认1)
以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
输出 – model
------dec_value是决策值,暂时不用管
训练得到的模型,是一个结构体。关于他的详细解释,请参考http://blog.sina.com.cn/s/blog_6646924501018fqc.html
注意:当svmtrain使用-v参数时,返回的model不再是一个结构体,分类问题返回的是交叉验证下的平均分类准确率;回归问题返回的是交叉检验下的平均mse(均方根误差)。使用-v是在参数寻优时寻找最优参数所用的,在正常模型训练时不用-v参数。关于参数寻优后面还有会介绍。
注意: [predict_label, accuracy/mse, dec_value] = svmpredict(test_label, test_data,model);函数的输出在分类时为accuracy,在回归时为mse。对于这个函数中的test_label如果不知道的话,就只能对编写一个同维向量,那么预测后的mse等指标就没有意义
2. 归一化matlab自带函数mapminmax
常用格式为
[y,ps]=mapminmax(x,ymin,ymax);归一
[x,ps]=mapminmax(‘reverse’,y,ps);还原
其中ps为一个结构体。并不是任何问题都必须要进行归一化预处理,要具体问题具体分析,进行试验测试表明,有时归一化后的预测准确率要比没有归一化的低好多,而且不同的归一化方式对最后的准确率也会有一定的影响。还要强调一点就是训练集是如何归一化的测试集也要如何归一化。
3. 归一化工具箱函数scaleforsvm
train_scale,test_scale,ps] = scale For SVM(train_data,test_data,ymin,ymax)
输入:
– train_data:训练集
– test_data:测试集
– ymin:归一化范围下限(可不输入,默认为0)
– ymax:归一化范围上限(可不输入,默认为1)
输出:
– train_scale:归一化后的训练集
– test_scale:归一化后的测试集
– ps:归一化映射
归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快。为什么要用归一化呢?首先先说一个概念,叫做奇异样本数据,所谓奇异样本数据数据指的是相对于其他输入样本特别大或特别小的样本矢量。下面举例:
m=[0.11 0.15 0.32 0.45 30;
0.13 0.24 0.27 0.25 45];
其中的第五列数据相对于其他4列数据就可以成为奇异样本数据(下面所说的网络均值bp)。奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,所以对于训练样本存在奇异样本数据的数据集在训练之前,最好先进形归一化,若不存在奇异样本数据,则不需要事先归一化。归一化的算法实现过程可以参考:http://www.ilovematlab.cn/thread-27021-1-1.html。
是否一定要做归一化这个预处理才能提高最后的分类准确率呢?答案是否定的。并不是任何问题都必须要进行归一化预处理,要具体问题具体分析,进行试验测试表明,有时归一化后的预测准确率要比没有归一化的低好多,而且不同的归一化方式对最后的准确率也会有一定的影响。
4. 降维预处理工具箱函数pcaForSVM
[train_pca,test_pca] = pcaForSVM(train,test,threshold)
输入:
– train_data:训练集,格式要求与svmtrain相同
– test_data:测试集,格式要求与svmtrain相同。
– threshold:对原始变量的解释程度([0,100]之间的一个数),通过该阈值可以选取出主成分,该参数可以不输入,默认为90,即选取的主成分默认可以达到对原始变量达到90%的解释程度。
输出:
– train_pca:进行pca降维预处理后的训练集。
– test_pca:进行pca降维预处理后的测试集。
关于降维的本人理解就是,维数太多的话进行拟合回归可能得到的结果并不好或者得不到一个好的模型,把多维的数据进行合理的降维可以使数据维数变少,但是其中包含的信息却只是少了一点,这样有利于计算。至于具体降多少《MATLAB神经网络43个案例分析》第168页有幅图可以参考。
再用SVM做预测时,需要调节相关的参数(主要是惩罚参数c和核函数参数g)才能得到比较理想的分类预测准确率。那么SVM的参数该怎么选择呢,有没有最佳的参数呢?采用CV的思想可以在某种意义下得到最优的参数,可以有效地避免欠学习和过学习状态的发生,最终对于测试集合的预测得到较理想的准确率。
普及一下欠拟合与过拟合
过拟合:训练样本可以百分之百分开,但是预测样本不行,欠学习:训练样本就不能百分百分开。
在讲寻优函数之前,我们先对CV思想做一下简介。交叉验证(Cross Validation)方法思想简介:http://www.matlabsky.com/forum-v … -fromuid-18677.html
关于SVM参数的优化选取,国际上并没有公认统一的最好的方法,现在目前常用的方法就是让c和g在一定的范围内取值,对于取定的c和g对于把训练集作为原始数据集利用K-CV方法《MATLAB神经网络43个案例分析》第127页得到在此组c和g下训练集验证分类准确率,最终取使得训练集验证分类准确率最高的那组c和g做为最佳的参数,但有一个问题就是可能会有多组的c和g对应于最高的验证分类准确率,这种情况怎么处理?这里采用的手段是选取能够达到最高验证分类准确率中参数c最小的那组c和g做为最佳的参数,如果对应最小的c有多组g,就选取搜索到的第一组c和g做为最佳的参数。这样做的理由是:过高的c会导致过学习状态发生,即训练集分类准确率很高而测试集分类准确率很低(分类器的泛化能力降低),因为过高的惩罚因子说明我们非常重视,所以在能够达到最高验证分类准确率中的所有的成对的c和g中认为较小的惩罚参数c是更佳的选择对象。当然,你也可以同时记录下多组c和g,在后面对测试集进行预测时可以分别使用这些参数,看最后的结果如何,再进行选择。
注意:一般情况下先大略找出选取的区间 然后通过等高线图缩小区间得到精确的最优c,v
寻优函数:工具箱版本《MATLAB神经网络43个案例分析》第66页
1、SVMcgForClass:网格划分来寻找最佳参数c和g 针对RBF核函数 -t2类型
2、gaSVMcgForClass:遗传算法参数寻优回归c,g 针对RBF核函数 -t2类型
3、psoSVMcgForClass:粒子群优化算法参数寻优分类c,g 针对RBF核函数 -t2类型
4、SVMcgForRegress:对于回归问题网格参数优化c,g 针对RBF核函数 -t2类型
5、gaSVMcgForRegress:遗传算法参数寻优回归c,g 针对RBF核函数 -t2类型
6、psoSVMcgForClass:粒子群优化算法参数寻优回归 针对RBF核函数 -t2类型
7、gaSVMcgpForRegress:遗传算法参数寻优回归c,g,p 针对epsilon-SVR模型与RBF核函数 -s3 -t2类型
寻优函数:MATLAB版本
1、SVMcgForClass:网格划分来寻找最佳参数c和g 针对RBF核函数 -t2类型
2、gaSVMForClass:遗传算法参数寻优
3、psoSVMForClass:粒子群优化算法参数寻优
对于分类问题网格参数优化(c,g),C-SVC+RBF核函数(’-s 0 –t 2’)
[bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)
输入:
----train_label:训练集的标签,格式要求与svmtrain相同。
----train:训练集,格式要求与svmtrain相同。
----cmin,cmax:惩罚参数c的变化范围,即在[2min,2cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2*(-8),28]。
----gmin,gmax:RBF核参数g的变化范围,即在[2gmin,2gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2(-8),28]。
----v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。
----cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2cmin,2*(cmin+cstep),…,2cmax,,g的取值为2gmin,2*(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
----accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。
输出:
----bestCVaccuracy:最终CV意义下的最佳分类准确率。
----bestc:最佳的参数c。
----bestg:最佳的参数g。
网格参数寻优函数(回归问题):SVMcgForRegress**
[bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)其输入输出与SVMcgForClass类似。
虽然采用网格搜索能够找到在CV意义下的最高分类准确率,即全局最优解,但有时候要想在更大范围内找最佳参数时会很费力,**采用启发式算法就可以不必遍历所有的参数点,也能找到全局最优解。**下面就介绍两种启发式算法ga遗传和pso粒子群优化算法。
对于分类问题利用GA来进行参数优化(c,g),C-SVC+RBF核函数(’-s 0 –t 2’)
[best CVaccuracy,bestc,bestg,ga_option]=gaSVMcgFor Class(train_label,train,ga_option)
输入:
----train_label:训练集的标签,格式要求与svmtrain相同。
---- train:训练集,格式要求与svmtrain相同。
---- ga_option:GA中的一些参数设置,可不输入,有默认值,详细请看代码的帮助说明。
输出:
---- best CVaccuracy:最终CV意义下的最佳分类准确率。
---- bestc:最佳的参数c。
---- bestg:最佳的参数g。
---- ga_option:记录GA中的一些参数。
一般情况下,ga_options 采用默认值就可以,不用输入这部分。
注意:作者farutu用的是谢菲尔德的遗传算法工具箱,直接将遗传算法的工具箱放在了他的工具箱里面,可以直接用,并不是用的MATLAB本身自带的遗传算法的函数。
对于分类问题利用PSO
来进行参数优化(c,g), C-SVC+RBF核函数(’-s 0 –t 2’)
[best CVaccuracy,bestc,bestg,pso_option]= pso SVMcg For Class(train_label,train,pso_option)
输入:
---- train_label:训练集的标签,格式要求与svmtrain相同。
---- train:训练集,格式要求与svmtrain相同。
---- pso_option:PSO中的一些参数设置,可不输入,有默认值,详细请看代码的帮助说明。
输出:
---- best CVaccuracy:最终CV意义下的最佳分类准确率。
---- bestc:最佳的参数c。
---- bestg:最佳的参数g。
---- pso_option:记录PSO中的一些参数。
一般,pso_options采用默认值就可以,不用输入这部分。
对于工具箱函数 对于工具箱函数 对于工具箱函数 对于工具箱函数 对于工具箱函数 对于工具箱函数
GA算法
(1)函数: gaSVMcgForClass.m(分类问题参数寻优)、gaSVMcgForRegress.m(回归问题参数寻优)
(2)使用方法
默认范围:c(0.1-100)、g(0.01-1000)、5折交叉验证。
分类问题[bestCVaccuracy,bestc,bestg,ga_option]= gaSVMcgForClass(train_label,train,ga_option)。
常用格式:[bestCVaccuracy,bestc,bestg] = gaSVMcgForClass(train_label,train)
回归问题[bestCVmse,bestc,bestg,ga_option]= gaSVMcgForRegress(train_label,train,ga_option)
(3)参数详解
ga_option:GA中的一些参数设置,可不输入(即去掉等号两边或左边的ga_option),有默认值,详细请看代码的帮助说明。
ga_option =struct(‘maxgen’,200,‘sizepop’,20,‘ggap’,0.9,‘cbound’,[0,100],‘gbound’,[0,1000],‘v’,5);
-
% maxgen:最大的进化代数,默认为200,一般取值范围为[100,500]
-
% sizepop:种群最大数量,默认为20,一般取值范围为[20,100]
-
% cbound = [cmin,cmax],参数c的变化范围,默认为(0,100]
-
% gbound = [gmin,gmax],参数g的变化范围,默认为[0,1000]
-
% v:SVM Cross Validation参数,默认为5
对于cgp的情况
function [BestMSE,Bestc,Bestg,Bestp,ga_option] = gaSVMcgpForRegress(train_label,train_data,ga_option);
ga_option = struct('maxgen',200,'sizepop',20,'ggap',0.9,... 'cbound',[0,100],'gbound',[0,1000],'pbound',[0.01,1],'v',5);
-
% maxgen:最大的进化代数,默认为200,一般取值范围为[100,500]
-
% sizepop:种群最大数量,默认为20,一般取值范围为[20,100]
-
% cbound = [cmin,cmax],参数c的变化范围,默认为(0,100]
-
% gbound = [gmin,gmax],参数g的变化范围,默认为[0,1000]
-
% pbound = [pmin,pmax],参数p的变化范围,默认为[0,1]
-
% v:SVM Cross Validation参数,默认为5
PSO算法
**(1)函数:**psoSVMcgForClass.m(分类问题参数寻优)、psoSVMcgForRegress.m(回归问题参数寻优)
(2)使用方法
默认范围:c(0.1-100)、g(0.01-1000)、3折交叉验证。
适应度函数:分类问题适应度函数用的是cv下的分类准确率;回归问题适应度函数用的是cv下的mse。即fitness(j) = svmtrain(train_label, train, cmd);
分类问题:[bestCVaccuracy,bestc,bestg,pso_option]= psoSVMcgForClass(train_label,train,pso_option)
常用格式为:[bestCVaccuracy,bestc,bestg]= psoSVMcgForClass(train_label,train)
回归问题:[bestCVmse,bestc,bestg,pso_option]= psoSVMcgForRegress(train_label,train,pso_option)
(3)参数详解
**pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',20, ...
'k',0.6,'wV',1,'wP',1,'v',5, ...
'popcmax',10^2,'popcmin',10^(-1),'popgmax',10^3,'popgmin',10^(-2));**
-
% c1:初始为1.5,pso参数局部搜索能力
-
% c2:初始为1.7,pso参数全局搜索能力
-
% maxgen:初始为200,最大进化数量
-
% sizepop:初始为20,种群最大数量
-
% k:初始为0.6(k belongs to [0.1,1.0]),速率和x的关系(V = kX)
-
% wV:初始为1(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的弹性系数
-
% wP:初始为1,种群更新公式中速度前面的弹性系数
-
% v:初始为3,SVM Cross Validation参数
-
% popcmax:初始为100,SVM参数c的变化的最大值.
-
% popcmin:初始为0.1,SVM参数c的变化的最小值.
-
% popgmax:初始为1000,SVM参数g的变化的最大值.
-
% popgmin:初始为0.01,SVM参数c的变化的最小值.
对于cgp的情况
function [bestCVmse,bestc,bestg,bestp,pso_option] = psoSVMcgForRegress(train_label,train,pso_option)
**pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',20, 'k',0.6,'wV',1,'wP',1,'v',5,
‘popcmax’,10^2,‘popcmin’, 10^ (-1),‘popgmax’,10^3, ‘popgmin’,10^(-2),
‘poppmax’,10^2, ‘poppmin’,10^(-2));**
-
% c1:初始为1.5,pso参数局部搜索能力
-
% c2:初始为1.7,pso参数全局搜索能力
-
% maxgen:初始为200,最大进化数量
-
% sizepop:初始为20,种群最大数量
-
% k:初始为0.6(k belongs to [0.1,1.0]),速率和x的关系(V = kX)
-
% wV:初始为1(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的弹性系数
-
% wP:初始为1,种群更新公式中速度前面的弹性系数
-
% v:初始为5,SVM Cross Validation参数
-
% popcmax:初始为100,SVM 参数c的变化的最大值.
-
% popcmin:初始为0.1,SVM 参数c的变化的最小值.
-
% popgmax:初始为1000,SVM 参数g的变化的最大值.
-
% popgmin:初始为0.01,SVM 参数c的变化的最小值.
可视化及指标函数:
1、ClassResult
2、VF
classresult函数的用法:CR = ClassResult(label, data, model, type)
----type 1:输入的data为训练集
----type 2:输入的data为测试集
如果是二分类的时候才会给出下面所有这些参数,多分类只会返回CR.accuracy
----CR.accuracy,整体的分类准确率,及每一类的分类准确率
----CR.SVlovation,model中支持向量在原始数据集中的位置
----CR.b,决策函数中的常数项
----CR.w,每个支持向量的系数
----CR.alpha ,w=alpha*y,y代表标签
如果type=1,输入是训练集的时候,算出来的分类准确率是不具有参考意义的,因为其实就是用训练集训练出来的模型又对训练集进行了一次精确度的验证,所以精确度会比较高,当然也不见得就会达到100,因此只有type=2的分类精度才有意义,多分类时type=1,可以看一下支持向量所占训练集样本数目的比例。
**VF函数的用法,**评价分类结果的好坏不一定非得用分类准确率,还可以用一些其他的指标,VF函数就是返回一些分类问题的评价指标,但是这个函数是只用于二分类的C-SVM,并且类别标签是1或-1(我看了源码,其实只要求二分类时正样本的标签是1就可以了,负样本的标签随意即可),多分类,回归以及概率估计问题不属于考虑范围。关于评价分类效果的指标,可以看http://blog.csdn.net/wangran51/article/details/7579100
[score,str] = VF(true_labels,predict_labels,type)
输入:
----true_labels:是实际的正确的标签
----predict_labels:是预测得到的标签
----type : 1,2,3,4,5
type=1:输出的score就是Accuracy = #true / #total
依次:2:Precision = true_positive / (true_positive + false_positive)
3:Recall = true_positive / (true_positive + false_negative)
4:F-score = 2 * Precision * Recall / (Precision + Recall)
5: BAC (Ballanced ACcuracy) = (Sensitivity + Specificity) / 2, where Sensitivity = true_positive / (true_positive + false_negative) and Specificity = true_negative / (true_negative + false_positive)
输出的str是与score相对应的打印语句。
整合函数SVC(用于分类):
上面所说的这些函数都可以被一个整合函数SVC包含(除了VF),SVC是一个分类问题中各种函数插件的一个整合函数,类似的回归问题的整合函数是SVR。下面是SVC的用法。
[predict_label,accuracy] = SVC(train_label,train_data,test_label,test_data,Method_option)
输入:
前四个和SVMtrain是一样的,后面的Method_option代表的意思如下:其中1代表是,0代表不是
----Method_option.plot Original = 0 or 1 表示是否画出原始数据
----Method_option.scale = 0 or 1 表示是否进行归一化
----Method_option.plot Scale = 0 or 1 表示是否画出归一化后的图像
----Method_option.pca = 0 or 1 表示是否进行pca降维预处理
----Method_option.type = 1[grid] or 2[ga] or 3[pso] 表示采用何种寻参方法
输出:
----predict_label,预测得到的标签,
----accuracy,整体的分类准确率及各个类别的分类准确率,当然你如果想看训练得到的模型的话,也可以在返回参数中加一个model。
整合函数SVR(用于回归):
function [predict_Y,mse,r] = SVR(train_y,train_x,test_y,test_x,Method_option)
输入:
前四个和SVMtrain是一样的,后面的Method_option代表的意思如下:其中1代表是,0代表不是
----Method_option.plot Original = 0 or 1 表示是否画出原始数据
----Method_option.xscale = 0 or 1表示是否对自变量进行归一化
----Method_option.yscale = 0 or 1表示是否对因变量进行归一化
----Method_option.plot Scale = 0 or 1 表示是否画出归一化后的图像
----Method_option.pca = 0 or 1 表示是否进行pca降维预处理
----Method_option.type = 1[grid cg] or 2[ga cg] or 3[pso cg] or 4[pso cgp] or 5[ga cgp] 表示采用何种寻参方法
输出:
----predict_Y,预测得到的输出,
----mse,均方误差
----r, 相关系数
注意下面这两行语句:
cmd = [’-v ‘,num2str(v),’ -c ‘,num2str(cg(nind,1)),’ -g ',num2str(cg(nind,2))];
ObjV(nind,1) = svmtrain(train_label,train_data,cmd);
tip1:在cmd中使用-t等参数的时候,一定要注意’-t’等字母的前后空格,因为如果后面不留空格,会将前后的两个参数连在一起,以为是一个数,就会影响后面的结果。
tip2:在专门强调一下,用在寻优中的SVMtrain和我们训练时用的SVMtrain是不一样的,’-s’的位置换成了’-v’,而且没有核函数的选择,是一个固化好了的训练函数,只是用来训练一个模型然后去进行测试,看结果是怎样的,来评价一下,c,g参数的效果好坏,因为评价c和g好坏的指标就是分类准确率。
GUI版本
SVM_GUI工具箱是在Libsvm-Faruto Ultimate的基础上改进出来的一个图像可视化使用界面,使用前需要安装工具箱,它整合了SVC和SVR也就是分类和回归的两个整合函数
如何提高分类器的性能:
下面这些是我自己的总结,提高分类器的性能首先要提取比较好的特征,这是前提条件。
1、试一下,是不是归一化的结果更好
2、尝试一下不同类型的SVM类型
3、选择适当的核函数,一般情况下径向基RBF核函数效果不会太差
4、参数寻优,找到合适的c和g
5、如果更加重视某一类的精确度,可以调整惩罚因子的大小,就是在c的基础上乘以一个权重,增大惩罚力度,尤其是对样本数据偏斜问题。先来说说样本的偏斜问题,也叫数据集偏斜(unbalanced),它指的是参与分类的两个类别(也可以指多个类别)样本数量差异很大。比如说正类有10,000个样本,而负类只给了100个,这会引起的问题显而易见由于偏斜的现象存在,使得数量多的正类可以把分类面向负类的方向“推”,因而影响了结果的准确性。对付数据集偏斜问题的方法之一就是在惩罚因子上作文章,就是给样本数量少的负类更大的惩罚因子,表示我们重视这部分样本。
上面所说的每一步都有很多细节值得改进推敲,有很多的算法去进行试验,去得到更好的分类准确率。
总结:进行分类预测的整个过程就是:
1、数据准备:将数据特征按照每行代表一个样本的数据,其列数就是每个样本的特征数,排好矩阵,每个样本对应的标签标好,一定要注意,样本与其标签相对应。
2、预处理:是否进行归一化,是否进行降维。
3、参数寻优:采用哪种寻优方式进行c和g的寻优。
4:训练SVMtrain:利用求得的最优参数进行模型训练。
5、预测SVMpredict:利用训练得到的model进行预测。
6、根据预测的结果,进行相应的参数的调整。
出现的问题及解决措施:
运行问题:
model = svmtrain(output_train,inputtrain’,’-s 0 -t 2 -c bestc -g bestg’);
Error: C <= 0
解决方法:
1、分开运行,将SVMcgForClass得到的值直接写在svmtrain中。
[bestCVaccuracy,bestc,bestg] = SVMcgForClass(output_train,inputtrain’,10,15,-8,8,5);
model = svmtrain(output_train,inputtrain’,’-s 0 -t 2 -c 16384 -g 0.5743’);
注意:改变c和g的范围,可以影响最终分类准确率。
2、
%grid search 参数优化
[bestCVaccuracy,bestc,bestg] = SVMcgForClass(output_train,inputtrain’,0,7,-8,8,5);
cmd = [’-c ‘,num2str(bestc),’ -g ‘,num2str(bestg),’-s 0 -t 2’];
model = svmtrain(output_train,inputtrain’,cmd)
即在中间加一步格式的转换。
写在最后:最近在学习SVM的过程中看了《MATLAB神经网络43个案例分析》后发现里面用的的函数很多,一直想总结一下,在网上找了一些资料,并从 https://blog.csdn.net/dulingtingzi/article/details/51012476 ,https://blog.csdn.net/ckzhb/article/details/72844409 这两篇文章和书中源程序中摘出了常用的函数进行总结与简化。大家也可以去这两篇博客以及书中再仔细学习一下。