在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
福利答謝大家!
感謝您閱讀本篇文章,對此特別發放一個無門檻的現金紅包,打開支付寶掃碼領取!