1. 傳統交叉驗證和嵌套交叉驗證的區別
在開始分享嵌套交叉驗證前,首先以K-Fold為例,區分K-Fold交叉驗證和嵌套K-Fold交叉驗證的區別,這是我剛始學習時的困惑點:
(1)K-Fold交叉驗證:只有一個loop(循環),即內層循環
(a) 將數據集切分為k-摺疊;
(b) 對於任意$i \in [1; k]$,在第i個摺疊上測試模型,並且在剩餘的摺疊上訓練模型;
(c) 最後的結果是計算k個驗證結果的均值。
(2)嵌套K-Fold交叉驗證:有兩個loops(循環),即內層循環和外層循環
(a) 對於在K-Fold中每一個i,都有一個嵌套的K-Fold交叉驗證。
以上內容詳見。
2. 嵌套交叉驗證簡介
為什麼需要嵌套的交叉驗證:
在scikit-learn官方文檔中指出:「嵌套交叉驗證包含於交叉驗證,並用在訓練模型的步驟中,如果模型的超參數需要被優化,則應該選擇嵌套交叉驗證方法。
嵌套交叉驗證是通過對基礎模型泛化誤差的估計來進行超參數的搜索,以得到模型最佳參數。」 內置的交叉驗證是傳統交叉驗證法(這裡常指K-Fold交叉驗證)的延伸,傳統的交叉驗證僅是將數據集拆分為訓練集和測試集,無法解決最優模型的選擇及模型調參問題。
它的弊端主要有兩個:其一、可能會造成信息洩漏;其二、由於是對相同數據進行誤差估計,所以會導致較高的偏差(當用可能的模型最佳超參數對相同的訓練集和測試集進行誤差的計算時,模型是有偏的,會導致較大偏差) 。 模型選擇看重偏差和方差,因此一個好的評估模型真實誤差的方法應是結合無偏和低方差兩個方面。
內置交叉驗證的原理如下圖所示,其運行流程包含兩個循環,即外層循環和內層循環。內層循環是指帶有搜索模型最佳超參數功能的交叉驗證,目的是給外層循環提供模型的最佳超參數。例如,隨機搜索或者網格搜索。而外層循環是給內層循環提供訓練數據,同時保留部分數據,以作對內層循環模型的測試。通過這樣的方式,可以防止數據的信息洩漏,以得到相對較低的模型評分偏差。
如果從較為抽象的視角看交叉驗證的原理,可以參加下圖所示流程:其中Require表示需要提供的超參數,RandomSample(${P}{sets}$)是一個從超參數網格中獲取隨機數據集的函數。
何時使用嵌套的交叉驗證:
如果數據集非常大時,使用內置交叉驗證法的計算成本會很高。如果你的數據集幾千個樣本,你就會發現計算過程是較漫長的。 內置交叉驗證的使用場景較為有限,尤其應用在數據量不會很大的領域,如生物領域(數據量不會很大,一般指小於幾千個樣本的數據)。
當計算成本不是很大時,需要考慮可以提供的硬體條件。 如果滿足以上兩個標準,就可以考慮使用嵌套交叉驗證來計算數據,得到幾乎無偏的估計誤差,從而對比不同算法的表現。
以下是關於何時使用嵌套交叉驗證的兩句話,詳見論文:
其一,「在使用隨機森林,支持向量機(Gaussian kernel),和梯度提升等算法時,很可能不需要使用嵌套交叉驗證。」 (這裡說的是「很可能」,不是一個絕對的表達,因此,如果計算成本是可支付的,那麼嵌套交叉驗證仍是需要的)
其二,「當使用任何分類算法時,內置交叉驗證過程很可能是不需要使用的。」 (這裡說的仍是「很可能」,但如果需可以使用的超參數是有限的,即你不需要如何費力調節,那麼使用嵌套交叉驗證就會很浪費時間)。
後嵌套交叉驗證步驟:
如果模型結果穩定(例如,一些超參數的設置基本得到相同的誤差估計結果),接下來可以使用傳統的交叉驗證。
運行步驟總結如下:
(1)將所有你希望使用的算法放到嵌套交叉驗證中計算模型誤差。 a. 如果結果穩定就進入到下一步,結果不穩定就就該結果不穩定的模型。
(2)選擇泛化誤差最小的模型。
(3)將該算法在帶有網格搜索或隨機搜索的交叉驗證中運行(不提供任何最佳的超參數)。
(4)將模型在嵌套交叉驗證中的得分與上一步中使用的交叉驗證得分進行比較。 從而,可以檢驗傳統的交叉驗證方法是否可以對模型進行無偏估計。如果結果相差很大,將嵌套交叉驗證的得分作為傳統交叉驗證的指標,並在傳統的交叉驗證中引入誤差估計。
以上內容參考。
3. 嵌套交叉驗證可以應用於時間序列數據
在熟悉嵌套交叉驗證方法和其優良的性質後,可以發現嵌套交叉驗證可以用於時間序列數據的模型選擇和參數優化。對於包含時間信息的數據,如果使用傳統的交叉驗證方法,單純的將數據集隨機拆分為訓練集和測試集,則模型在測試集的表現很可能不好,即出現過擬合的情況。
因此,傳統的交叉驗證方法在處理時間序列數據時具有一定的局限性。(其中:時間序列數據指的是在每一個樣本中,至少含有一個時間戳欄位)
為避免對時間序列數據集不當的拆分,模型在訓練集上表現較佳,而在測試集表現較差,即出現過擬合現象。傳統的交叉驗證方法不適用於時間序列數據。
針對時間序列數據應著重解決如下三個問題:
(1)拆分時間序列數據不會造成信息的;
(2)在使用內置的交叉驗證時,可以在獨立的測試集上獲得誤差的無偏估計;
(3)數據集可以對多時間序列數據進行驗證。(參見Courtney Cochrane,2019)
4. Scikit-learn中代碼實現
以下是scikit-learn中,應用鶯尾花(iris)數據集進行K-Fold交叉驗證和嵌套K-Fold交叉驗證的對比,代碼如下:
結果展示如下圖所示:
5. 有意思的小問題
以下是某網友在StackExchage上提的小問題:
Question:
我理解小的樣本量使用交叉驗證的最好方法不是傳統的hold-out交叉驗證,而是使用整個數據集,並應用K-Fold交叉驗證。但是,在我的例子中,我想找到最佳超參數和選擇最佳模型,我 認為在我的例子中,嵌套交叉驗證可能是更好的選擇。
如果我理解嵌套交叉驗證的方法,例如,將數據集分為2個摺疊。應用每一個摺疊並執行一個K-Fold交叉驗證,決定模型的最佳超參數,並用另一個摺疊執行K-Fold交叉驗證來決定最佳模型。我這樣做對嗎?
基於對上文交叉驗證的理解,他應該怎麼處理數據?
Answer:
在內部loop(循環)中,你選擇最佳超參數可以通過在內層循環的訓練摺疊訓練不同的超參數,用內層循環的測試摺疊測試模型,以找到最佳超參數(每個模型的)。然後使用選定的最佳模型,在外部的測試集上測試模型。外循環的平均得分就是你模型表現的估計值。綜上,本文分享了對嵌套交叉驗證的理解及其應用,有關交叉驗證其它部分的內容將在後續進行分享。