正規化和模型選擇(Regularization and model selection)

對於某個學習問題,我們如何在幾種不同的模型中進 行選擇。例如,如果我們使用一個多項式迴歸模型hθ(x)=g(θ0+θ1x+θ2x2++θkxk)h_\theta(x) = g(\theta_0 + \theta_1x + \theta_2x^2 + \ldots + \theta_kx^k),我們該如何決定多項式的最高階數kk以最優地平衡偏差和波動?與此類似,對於局部權重回歸如何選擇帶寬參數τ\tau,對於1\ell_1正規化後的SVM算法怎麼選擇參數CC的值?

爲了具體化,這一節中我們假設有一個有限模型集M={M1,,Md}\mathcal{M} = \{ M_1,\ldots,M_d \},我們在模型集中進行選擇,MiM_i即代表第i個模型。


1 交叉驗證

給定某個訓練集後,根據經驗風險最小化,我們可能會這樣進行模型選擇:

  1. 每個模型MiM_i都在訓練集SS上進行一次訓練,得到假設hih_i
  2. 選擇訓練誤差最小的假設

這種算法並不能得到我們想要的結果。假設多項式迴歸,階數越高訓練誤差就會越小。因此這種方法選出的往往是一個高波動高維度的多項式模型,會導致嚴重的過擬合。

下面這個算法表現會好很多,稱爲保留交叉驗證或簡單交叉驗證,步驟如下:

  1. 隨機將訓練集分爲兩部分StrainS_{train}ScvS_{cv}StrainS_{train}佔有70%的數據,ScvS_{cv}佔有30%的數據。ScvS_{cv}稱爲保留交叉驗證集。
  2. 每個模型MiM_i都在訓練集StrainS_{train}上進行一次訓練,得到假設hih_i
  3. 選擇運行在交叉驗證集上,誤差ε^Scv(hi)\hat{\varepsilon}_{S_{cv}}(h_i)最小的假設hih_i

通過測試未訓練的交叉驗證集數據,我們可以更好地估計各個模型預測的真實泛化誤差,選擇泛化誤差最小的模型。普遍而言,交叉驗證集佔總訓練集的30%。

在保留交叉驗證第三步之後,我們可以考慮將產生hih_i的模型在整個訓練集SS上再訓練一次。一般而言這會更好,但對於一些對初始條件或數據很敏感的算法,以StrainS_{train}作爲訓練集表現得好並不意味着用SS作爲訓練集也會表現很好,對於這種情況我們只能放棄再訓練這一步。


保留交叉驗證最大的不足是它浪費了30%的數據。即使我們在最後再訓練一次,這個算法依然只使用了70%的數據。在數據很豐富的時候這沒什麼,當數據很稀少的時候我們可能需要更好的辦法。

我們引入另一種稱爲k次摺疊交叉驗證的方法,他每次的保留數據更少:

  1. 隨機將SS分爲k個不相交的子集,這些子集設爲S1,,SkS_1,\ldots,S_k
  2. 對於每個模型MiM_i,我們這樣對他們進行評估:
    循環k次,將MiM_iS1Sj1Sj+1SkS_1 \cup \ldots \cup S_{j-1} \cup S_{j+1} \cup \ldots S_k上進行訓練得到假設hijh_{ij}
    在假設hijh_{ij}上測試SjS_j,得到誤差ε^Sj(hi)\hat{\varepsilon}_{S_{j}}(h_i)
    令每個模型MiM_i的估計泛化誤差爲ε^Sj(hi)\hat{\varepsilon}_{S_{j}}(h_i)的均值。
  3. 選擇估計泛化誤差最小的模型MiM_i,並在整個訓練集上SS再訓練一次,得到的假設就是最後的答案。

一般設摺疊次數k=10k=10,這樣每次數據的保留部分相比保留交叉驗證大幅縮小了,當然由於要訓練k次計算成本增加了。儘管k=10k=10是普遍情形,在訓練數據極端稀少的時候,我們也可以讓k=mk=m,即每次僅保留一個數據用以驗證,這種方法稱爲留一交叉驗證

最後,儘管我們介紹了幾種交叉驗證的方法用以選擇模型。實際用交叉驗證來評估單個模型或算法的預測效果也很不錯。


2 特徵選擇

在模型選擇中有一種特殊且重要的部分叫特徵選擇。想象一下如果我們的監督式學習問題中特徵數nn的值非常大,但我們懷疑其中只有部分特徵是和我們的學習目標相關的。即使使用簡單線性分類器,假設類的VC維依然會有O(n)O(n),因此過擬合是一個大問題除非訓練集非常大才能避免。

要解決這個問題,你可以使用特徵選擇算法減少特徵數量。有nn個特徵就意味着有2n2^n個特徵子集,所以特徵選擇也可看成有2n2^n個模型的模型選擇問題。當nn的值很大時,是無法通過枚舉的方法準確地比較2n2^n個模型的,所以一般會使用一些啓發式搜索算法來尋找好的特徵子集。下面這個搜索步驟稱爲前向搜索

  1. 初始化令特徵集F=\mathcal{F} = \emptyset
  2. 重複 {
    (a) 循環i次,如果iFi \notin \mathcal{F},則讓Fi=F{i}\mathcal{F}_i = \mathcal{F} \cup \{i\},並使用交叉驗證來評估特徵$\mathcal{F}_i (b); (b) 令\mathcal{F}$等於(a)中所有特徵子集中最好那一個。
  3. 選擇並輸出整個搜索過程中表現最好的特徵子集。

這個算法的外層循環,在F\mathcal{F}包含所有特徵或達到你設定的閾值時停止。該算法是封裝模型特徵選擇的實例化,它的每個步驟都在包裝你的學習算法並評估不同的特徵子集。除了前向搜索,還有其他的特徵搜索算法,比如後向搜索算法,它從F={1,,n}\mathcal{F} = \{1,\ldots,n\}開始每次去掉一個特徵,直到特徵集爲空。


過濾器特徵選擇是一個啓發式的方法,只需很少的計算成本就能找到特徵子集。它的核心是計算一些評分S(i)S(i)S(i)S(i)是每個特徵xix_i對類標籤yy的影響的評分,最後挑選得分最高的k個特徵組成特徵子集。

一種選擇使用xix_iyy之間的相關性來描述S(i)S(i)。實際中,我們一般(尤其在特徵xix_i是離散值時)使用互信息Mi(xi,y)M_i(x_i,y)作爲S(i)S(i)評分:

Mi(xi,y)=xi{0,1}y{0,1}p(xi,y)logp(xi,y)p(xi)p(y). M_i(x_i,y) = \sum_{x_i \in \{ 0,1 \}} \sum_{y \in \{ 0,1 \}} p(x_i,y)log \frac{p(x_i,y)}{p(x_i)p(y)}.

這些概率p(xi,y),p(xi),p(y)p(x_i,y),p(x_i),p(y)都可以通過訓練集上的經驗分佈來估計。爲了讓概率更直觀,我們可以使用KL散度來刻畫相互信息:

Mi(xi,y)=KL(p(xi,y)p(xi)p(y)) M_i(x_i,y) = \mathrm{KL}(p(x_i,y)||p(x_i)p(y))

你可能不清楚什麼是KL散度,簡要來說它描述p(xi,y)p(x_i,y)p(xi)p(y)p(x_i)p(y)之間的差別有多大。當xix_iyy之間相關性很小時(即p(xi,y)=p(xi)p(y)p(x_i,y) = p(x_i)p(y)),KL的值很小;反之,KL的值就會很大。最後一個需要注意的細節是我們如何選擇最後的特徵數kk的值,標準方法是使用交叉驗證的方法開尋找合適的kk值。

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