以下內容有任何不理解可以翻看我之前的博客哦:吳恩達deeplearning.ai專欄
在上一節中,我們了解了如何利用測試集來評估模型性能。今天我們來進一步完善這個想法,讓你使用該技術自動選擇一個更好的模型。
文章目錄
- 模型選擇
- 交叉驗證 Cross Validation
- 交叉驗證例子之手寫識別
模型選擇
上一節我們了解到,當你的模型很好地擬合訓練集的時候,訓練集的代價函數就不能很好地表示模型準確度(因為其代價函數基本為0),這將遠遠低于泛化誤差(在新數據上的誤差)。在此時,測試集的代價函數就比訓練集的代價函數能夠更好地反映模型的準確程度了。那么我們該如何利用測試集來選擇更好的模型嘞。
以上是十個不同特征數量的模型,我們如何從中選擇一個合適的模型呢?我們可以依次用這十個模型對數據進行擬合并計算出 J t e s t J_{test} Jtest?,通過J的大小來判斷誰的效果更好。
例如你在測試完這十個模型后,發現 d = 5 d=5 d=5時, J ( w [ 5 ] , b [ 5 ] ) J(w^{[5]},b^{[5]}) J(w[5],b[5])的值為最小,那么你可能會認為模型5的效果是最好的。
但是事實上,我們所測得的J可能是一種樂觀的估計,它可能比真實的J要小些,原因是我們忽略了另一個變參數,就是d的大小。有可能就是恰好這個測試集的數據分布離d=5的函數比較近一些,無法排除偶然性。這個我覺得其實乍一看挺難理解的。可以做一個類比,測試集上的d就類似于訓練集上的w和b,它們都是通過各自的數據集所選出來的,所以不能在各自的數據集上進行驗證。因此在選擇模型的時候,并不能采用這種方法。
交叉驗證 Cross Validation
以上問題的解決方法是,將數據分為三個不同的子集,分別是訓練集,交叉驗證集(也可叫做驗證集、開發集 dev set),以及測試集。
如上圖,我們將數據集的60%設置為訓練集,20%設置為交叉驗證集,剩下20%為測試集。
我們使用以下三個數學公式分別計算其代價函數:
訓練集誤差:
J t r a i n ( w , b ) = 1 2 m t r a i n [ ∑ ( f ? y ) 2 ] J_{train}(w,b)=\frac{1}{2m_{train}}[\sum (f-y)^2] Jtrain?(w,b)=2mtrain?1?[∑(f?y)2]
交叉驗證集誤差:
J c v ( w , b ) = 1 2 m c v [ ∑ ( f ? y ) 2 ] J_{cv}(w,b)=\frac{1}{2m_{cv}}[\sum (f-y)^2] Jcv?(w,b)=2mcv?1?[∑(f?y)2]
測試集誤差:
J t e s t ( w , b ) = 1 2 m t e s t [ ∑ ( f ? y ) 2 ] J_{test}(w,b)=\frac{1}{2m_{test}}[\sum (f-y)^2] Jtest?(w,b)=2mtest?1?[∑(f?y)2]
如此,在上面那個例子中,模型選擇的方法是這樣的:首先在訓練集訓練從而找到合適的w,b;然后在交叉驗證集上測試不同的d誰的價值函數最小,最后,在測試集上測試代價最小的d的模型的泛化能力。
交叉驗證例子之手寫識別
交叉驗證集同樣也可以用于別的模型,例如我們之前了解的手寫識別。
例如你有三個神經網絡模型架構,你想從中選擇效果最好的模型。那么步驟仍然和以前一樣,先在訓練集上得出參數w,b,然后在交叉驗證集上獲得代價函數最小的架構,再在測試集上證明其泛化能力。這樣的步驟可以確保好的效果不是因為數據所造成的偶然結果。
為了給讀者你造成不必要的麻煩,博主的所有視頻都沒開僅粉絲可見,如果想要閱讀我的其他博客,可以點個小小的關注哦。