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

福利答謝大家!

感謝您閱讀本篇文章,對此特別發放一個無門檻的現金紅包,打開支付寶掃碼領取!
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章