SVM参数设定

    xiaoxiao2021-03-25  200

    LIBSVM 使用的一般步骤是:

    1)按照LIBSVM软件包所要求的格式准备数据集;                                    

    2)对数据进行简单的缩放操作;                                   

    3)首要考虑选用RBF 核函数;

    4)采用交叉验证选择最佳参数C与g ;

    5)采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;

    6)利用获取的模型进行测试与预测。

    1)LIBSVM使用的数据格式

        该软件使用的训练数据和检验数据文件格式如下:

    [label] [index1]:[value1] [index2]:[value2] ...

    [label] [index1]:[value1] [index2]:[value2] ...

    一行一条记录数据,如:

    +1 1:0.708 2:1 3:1 4:-0.320 5:-0.105 6:-1

    这里(x,y)à((0.708,1,1, -0.320, -0.105, -1), +1)

    label 或说是class, 就是你要分类的种类,通常是一些整数。

    index 是有順序的索引,通常是连续的整数。

    value 就是用来 train 的数据,通常是一堆实数。

     

    2)对数据进行简单的缩放操作

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

        svmscale.exe的用法:svmscale.exe feature.txt feature.scaled

    默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届,feature.txt是输入特征文件名输出的归一化特征名为feature.scaled

     

      它的常见接口有:

        svm_train()        : train an SVM model#训练

        svm_predict()      : predict testing data#预测

        svm_read_problem() : read the data from a LIBSVM-format file.#读取libsvm格式的数据

        svm_load_model()   : load a LIBSVM model.

        svm_save_model()   : save model to a file.

        evaluations()      : evaluate prediction results.

        - Function: svm_train#三种训练写法

        There are three ways to call svm_train()

         model = svm_train(y, x [, 'training_options'])

         model = svm_train(prob [, 'training_options'])

         model = svm_train(prob, param)

    libSVM支持多类分类问题,当有k个待分类问题时,libSVM构建k*(k-1)/2种分类模型来进行分类,即:libSVM采用一对一的方式来构建多类分类器,如下所示:

               1 vs 2, 1 vs 3, ..., 1 vs k, 2 vs 3, ..., 2 vs k, ..., k-1 vs k。

    libsvm在训练model的时候,有如下参数要设置,当然有默认的参数,但是在具体应用方面效果会大大折扣。

    Options:可用的选项即表示的涵义如下   -s svm_type : set type of SVM (default 0)   0 -- C-SVC   1 --v-SVC   2 – 一类SVM   3 -- e -SVR   4 -- v-SVR

      -t kernel_type : set type of kernelfunction (default 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 : set degree in kernel function(default 3)   -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ 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)   -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2   其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部

    当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。

    libsvm使用误区----------------------

    (1)      直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。

    (2)      如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。

     a                  在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。

     b                  虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。

    (3)      样本数<<特征数的情况:

                                                   推荐使用线性核,可以达到与RBF同样的性能。

    (4)      样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。

    (5)      样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数

    网格参数寻优函数(分类问题):SVMcgForClass [bestCVaccuracy,bestc,bestg]=  SVMcgForClass(train_label,train, cmin,cmax,gmin,gmax,v,cstep,gstep,accstep) 输入: train_label:训练集的标签,格式要求与svmtrain相同。 train:训练集,格式要求与svmtrain相同。 cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。 gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。 v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。 cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,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类似,这里不再赘述。

    而当你训练完了model,在用它做classification或regression之前,应该知道model中的内容,以及其含义。

    用来训练的是libsvm自带的heart数据

    model =      Parameters: [5x1 double]       nr_class: 2        totalSV: 259                   % 支持向量的数目            rho: 0.0514               %  b          Label: [2x1 double]     %  classification中标签的个数          ProbA: []          ProbB: []            nSV: [2x1 double]     %  每类支持向量的个数         sv_coef: [259x1 double]  %   支持向量对应的Wi

               SVs: [259x13 double]  %   装的是259个支持向量

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

    SVM 怎样能得到好的结果

    1.    对数据做归一化(simple scaling

    2.    应用 RBF kernel

    3.    cross-validationgrid-search得到最优的cg

    4.    用得到的最优cg训练训练数据

    5.    测试

    关于svmC以及核函数参数设置----------------------

    参考自:对支持向量机几种常用核函数和参数选择的比较研究

      

    C一般可以选择为:10^t , t=- 4..4就是0.0001 10000

     选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合

     

    LIBSVM-t用来指定核函数类型(默认值是2)。

    0)线性核函数

    (无其他参数)

    1)多项式核函数

    (重点是阶数的选择,即d,一般选择1-111 3 5 7 9 11,也可以选择2,46…

    2RBF核函数

    (径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。

    参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k2分类的话就是0.5

    3sigmoid核函数 又叫做S形内核

    两个参数g以及rg一般可选1 2 3 4r0.2 0.4 0.60.8 1

    4)自定义核函数

     

    常用的四种核函数对应的公式如下:

     

    与核函数相对应的libsvm参数:

    1)对于线性核函数,没有专门需要设置的参数

    2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/kk是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0

    3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/kk是类别数)。

    4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/kk是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0

    转载请注明原文地址: https://ju.6miu.com/read-5875.html

    最新回复(0)