Cross-Validation

模型選擇和交叉驗證:正確的方法

  • July 21, 2013

CrossValidated 中有很多關於模型選擇和交叉驗證的主題。這裡有幾個:

然而,這些線程的答案是相當通用的,並且主要強調了交叉驗證和模型選擇的特定方法的問題。

為了使事情盡可能具體,例如我們正在使用帶有 RBF 內核的 SVM: ,並且我有一個特徵X和標籤y的數據集,並且我想要

  1. 找到我的模型的最佳可能值(和)
  2. 使用我的數據集訓練 SVM(用於最終部署)
  3. 估計泛化誤差和圍繞該誤差的不確定性(方差)

為此,我會親自進行網格搜索,例如,我嘗試所有可能的組合 和. 為簡單起見,我們可以假設以下範圍:

更具體地說,使用我的完整數據集,我執行以下操作:

  1. 對於每個 (,) 對,我重複迭代(例如 100 次隨機重複)-折疊交叉驗證(例如),在我的數據集上,即我訓練我的 SVM折疊並評估左側折疊的錯誤,遍歷所有折疊。總的來說,我收集了 100 x 10 = 1000 個測試錯誤。
  2. 對於每一個這樣的(,) 對,我計算這 1000 個測試錯誤的均值和方差.

現在我想選擇最佳模型(最佳內核參數),用於在完整數據集上訓練我的最終 SVM。我的理解是選擇具有最低誤差均值和方差的模型 和將是正確的選擇,並且該模型的是是我在使用完整數據集進行訓練時對模型的泛化誤差偏差和方差的最佳估計。

但是,在閱讀了上述線程中的答案後,我的印像是,這種選擇最佳 SVM 進行部署和/或估計其錯誤(泛化性能)的方法是有缺陷的,並且有更好的方法來選擇最佳 SVM 並報告其錯誤。如果是這樣,它們是什麼?我正在尋找一個具體的答案。

堅持這個問題,我如何具體選擇最佳模型正確估計其泛化誤差

我在 JMLR 中的論文解決了這個確切的問題,並說明了為什麼問題中建議的程序(或至少一個非常類似的程序)會導致樂觀的有偏差的性能估計:

Gavin C. Cawley, Nicola LC Talbot,“論模型選擇中的過度擬合和性能評估中的後續選擇偏差”,機器學習研究雜誌,11(7 月):2079-2107,2010。(www

要記住的關鍵是交叉驗證是一種用於估計生成模型的方法的泛化性能的技術,而不是模型本身的泛化性能。因此,如果選擇內核參數是生成模型過程的一部分,您還需要交叉驗證模型選擇過程,否則您最終會得到一個樂觀的有偏差的性能估計(就像您提出的程序一樣)。

假設您有一個函數 fit_model,它接收由屬性 X 和所需響應 Y 組成的數據集,並返回該數據集的擬合模型,包括超參數的調整(在本例中為內核和正則化參數)。這種超參數的調整可以通過多種方式執行,例如最小化 X 和 Y 上的交叉驗證誤差。

第 1 步 - 使用函數 fit_model 將模型擬合到所有可用數據。這為您提供了將在操作或部署中使用的模型。

第 2 步 - 績效評估。使用所有可用數據執行重複交叉驗證。在每一折中,數據被劃分為訓練集和測試集。使用訓練集擬合模型(記錄擬合模型的超參數值)並評估測試集的性能。使用所有測試集的平均值作為性能估計(也許還可以查看值的分佈)。

第 3 步 - 超參數設置的可變性 - 對第 3 步中收集的超參數值進行分析。但是我應該指出,超參數並沒有什麼特別之處,它們只是已估計的模型參數(間接) 從數據中。為了計算/數學上的方便,它們被視為超參數而不是參數,但事實並非如此。

在這裡使用交叉驗證的問題是訓練和測試數據不是獨立樣本(因為它們共享數據),這意味著對性能估計和超參數方差的估計很可能是有偏差的(即小於每個折疊中真正獨立的數據樣本)。如果這在計算上是可行的,我可能會使用引導程序而不是重複的交叉驗證,並將結果模型打包。

關鍵是要獲得無偏的性能估計,無論您用來生成最終模型 (fit_model) 的任何過程都必須在交叉驗證過程的每一折中獨立地重複完整。

引用自:https://stats.stackexchange.com/questions/64991

comments powered by Disqus