SVMtrain的参数c和g的优化


hit2015spring

在svm训练过程中,需要对惩罚参数c和核函数的参数g进行优化,选取最好的参数

知道测试集标签的情况下
是让两个参数c和g在某一范围内取离散值,然后,取测试集分类准确率最佳的参数

不知道测试集标签的情况下

(1)利用交叉验证的方法:(k-fold cross validation)

Start
bestAccuracy = 0
bestc = 0
bestg = 0

//n1 , n2 ,k都是事先给定的值
for c = 2^(-n1) : 2^(n1)
     for g = 2^(-n2) : 2^(n2)
     将训练集平均分为k部分,设为
     train(1),train(2), ... ,train(k).
     分别让每一部分作为测试集进行预测(剩下的k-1部分作为训练集对分类器进行训练)取得最后得到的所有分类的准确率的平均数,设为cv
     if(cv>bestAccuracy)
          bestAccuracy = cv; bestc = c; bestg = g
          end
    end
end
over

(2)leave-one-out cross validation(loo交叉验证)

设原始数据有N个样本,那么LOO-CVj就是N-CV,即每一个样本作为验证集,其余的N-1个样本作为训练集,所以在LOO-CV下会得到N个模型,用N个模型的最终验证集的分类准确率的平均数做为在LOO-CV下分类器的性能指标

** 但是LOO-cv计算量太大,每个样本都要建立一个模型,计算成本太大

当计算出所有的c和g时,这时候这些c和g有可能会出现的是:某些成对出现的c和g验证准确率一样高,这时候选择的是惩罚参数最小的c和g,认为c小的那个对象是最佳的选择

伪代码如下

bestAccuracy = 0
bestc = 0
bestg = 0
//将c和g划分为网格进行搜索
for c = 2 ^(cmin):2^(cmax)
        for c = 2 ^(gmin):2^(gmax)
        %%采用K-CV方法
将train大致分为K组,记为train(1)train(2)........train(k)
相应的标签也要分离出来记为train_label(1),train_label(2).....................train_label(k)
                       for run = 1:k
                       让train(run),作为验证集,其他的作为训练集,记录此时的验证准确率为acc(run)
                       end
        cv = (acc(1)+acc(2)+............acc(k))/k
        if (cv>bestAccuracy)
            bestAccury = cv;bestc=c;bestg=g;
        end
    end
end
over

福利答谢大家!

感谢您阅读本篇文章,对此特别发放一个无门槛的现金红包,打开支付宝扫码领取!
这里写图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页