SVMtrain的參數c和g的優化
在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