對於某個學習問題,我們如何在幾種不同的模型中進 行選擇。例如,如果我們使用一個多項式迴歸模型,我們該如何決定多項式的最高階數以最優地平衡偏差和波動?與此類似,對於局部權重回歸如何選擇帶寬參數,對於正規化後的SVM算法怎麼選擇參數的值?
爲了具體化,這一節中我們假設有一個有限模型集,我們在模型集中進行選擇,即代表第i個模型。
1 交叉驗證
給定某個訓練集後,根據經驗風險最小化,我們可能會這樣進行模型選擇:
- 每個模型都在訓練集上進行一次訓練,得到假設;
- 選擇訓練誤差最小的假設
這種算法並不能得到我們想要的結果。假設多項式迴歸,階數越高訓練誤差就會越小。因此這種方法選出的往往是一個高波動高維度的多項式模型,會導致嚴重的過擬合。
下面這個算法表現會好很多,稱爲保留交叉驗證或簡單交叉驗證,步驟如下:
- 隨機將訓練集分爲兩部分和,佔有70%的數據,佔有30%的數據。稱爲保留交叉驗證集。
- 每個模型都在訓練集上進行一次訓練,得到假設;
- 選擇運行在交叉驗證集上,誤差最小的假設。
通過測試未訓練的交叉驗證集數據,我們可以更好地估計各個模型預測的真實泛化誤差,選擇泛化誤差最小的模型。普遍而言,交叉驗證集佔總訓練集的30%。
在保留交叉驗證第三步之後,我們可以考慮將產生的模型在整個訓練集上再訓練一次。一般而言這會更好,但對於一些對初始條件或數據很敏感的算法,以作爲訓練集表現得好並不意味着用作爲訓練集也會表現很好,對於這種情況我們只能放棄再訓練這一步。
保留交叉驗證最大的不足是它浪費了30%的數據。即使我們在最後再訓練一次,這個算法依然只使用了70%的數據。在數據很豐富的時候這沒什麼,當數據很稀少的時候我們可能需要更好的辦法。
我們引入另一種稱爲k次摺疊交叉驗證的方法,他每次的保留數據更少:
- 隨機將分爲k個不相交的子集,這些子集設爲。
- 對於每個模型,我們這樣對他們進行評估:
循環k次,將在上進行訓練得到假設。
在假設上測試,得到誤差。
令每個模型的估計泛化誤差爲的均值。 - 選擇估計泛化誤差最小的模型,並在整個訓練集上再訓練一次,得到的假設就是最後的答案。
一般設摺疊次數,這樣每次數據的保留部分相比保留交叉驗證大幅縮小了,當然由於要訓練k次計算成本增加了。儘管是普遍情形,在訓練數據極端稀少的時候,我們也可以讓,即每次僅保留一個數據用以驗證,這種方法稱爲留一交叉驗證。
最後,儘管我們介紹了幾種交叉驗證的方法用以選擇模型。實際用交叉驗證來評估單個模型或算法的預測效果也很不錯。
2 特徵選擇
在模型選擇中有一種特殊且重要的部分叫特徵選擇。想象一下如果我們的監督式學習問題中特徵數的值非常大,但我們懷疑其中只有部分特徵是和我們的學習目標相關的。即使使用簡單線性分類器,假設類的VC維依然會有,因此過擬合是一個大問題除非訓練集非常大才能避免。
要解決這個問題,你可以使用特徵選擇算法減少特徵數量。有個特徵就意味着有個特徵子集,所以特徵選擇也可看成有個模型的模型選擇問題。當的值很大時,是無法通過枚舉的方法準確地比較個模型的,所以一般會使用一些啓發式搜索算法來尋找好的特徵子集。下面這個搜索步驟稱爲前向搜索:
- 初始化令特徵集;
- 重複 {
(a) 循環i次,如果,則讓,並使用交叉驗證來評估特徵$\mathcal{F}_i \mathcal{F}$等於(a)中所有特徵子集中最好那一個。
} - 選擇並輸出整個搜索過程中表現最好的特徵子集。
這個算法的外層循環,在包含所有特徵或達到你設定的閾值時停止。該算法是封裝模型特徵選擇的實例化,它的每個步驟都在包裝你的學習算法並評估不同的特徵子集。除了前向搜索,還有其他的特徵搜索算法,比如後向搜索算法,它從開始每次去掉一個特徵,直到特徵集爲空。
過濾器特徵選擇是一個啓發式的方法,只需很少的計算成本就能找到特徵子集。它的核心是計算一些評分,是每個特徵對類標籤的影響的評分,最後挑選得分最高的k個特徵組成特徵子集。
一種選擇使用和之間的相關性來描述。實際中,我們一般(尤其在特徵是離散值時)使用互信息作爲評分:
這些概率都可以通過訓練集上的經驗分佈來估計。爲了讓概率更直觀,我們可以使用KL散度來刻畫相互信息:
你可能不清楚什麼是KL散度,簡要來說它描述同之間的差別有多大。當和之間相關性很小時(即),KL的值很小;反之,KL的值就會很大。最後一個需要注意的細節是我們如何選擇最後的特徵數的值,標準方法是使用交叉驗證的方法開尋找合適的值。