嵌套交叉驗證(Nested cross-validation)

2020-11-29 CDA數據分析師

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(循環)中,你選擇最佳超參數可以通過在內層循環的訓練摺疊訓練不同的超參數,用內層循環的測試摺疊測試模型,以找到最佳超參數(每個模型的)。然後使用選定的最佳模型,在外部的測試集上測試模型。外循環的平均得分就是你模型表現的估計值。綜上,本文分享了對嵌套交叉驗證的理解及其應用,有關交叉驗證其它部分的內容將在後續進行分享。

相關焦點

  • 機器學習乾貨|交叉驗證(Cross Validation)詳解
    交叉驗證的目的常見的交叉驗證形式簡單交叉驗證:將原始數據隨機分為兩組,一組作為訓練集,一組作為驗證集,利用訓練集訓練分類器,然後利用驗證集驗證模型一般來說,簡單交叉驗證並非一種交叉驗證,因為數據並沒有交叉使用。隨機從最初的樣本中選出部分,形成交叉驗證數據,而剩餘的就當作訓練數據。一般來說,少於原本樣本三分之一的數據被選做驗證數據。優點:好處的處理簡單,只需隨機把原始數據分為兩組即可!
  • K折交叉驗證實例
    交叉驗證思想交叉驗證用於模型選擇,可以更好的來估計模型的試驗誤差。
  • K-fold cross validation的真正用法是用來確定模型超參的
    第一個問題「K-fold cross validation的測試結果是針對K個中的哪個模型的呢?」的答案是:不是其中任何一個。雖然很少有材料提到,但是會容易理解,對10個不同的模型的測試結果取平均,那麼這個平均就不再是對其中任何一個模型的評價。這裡又引申出來一個問題,既然不是其中任何一下,那麼又是對什麼的評價呢?
  • R語言——交叉驗證法計算線性回歸模型擬合優度的第三種R方
    第三種R方的計算源於交叉驗證 (cross validation) 裡的留一法 (leave one out cross validation),交叉驗證也是當前比較熱門的機器學習裡的用來驗證模型匹配度較為常用的方法。傳統的線性回歸是對所有樣本數據進行回歸,根據線性回歸的計算公式,我們的模型能夠使得均方誤差最小。但是,如果樣本中存在異常值,就會嚴重影響我們的回歸模型的準確度。
  • 三分鐘重新學習交叉驗證
    雷鋒網 AI 科技評論根據原文進行了編譯。驗證可能是數據科學家們所使用的最重要的技術之一,因為驗證操作有助於我們了解模型的穩定性——用來探索模型對新數據的泛化能力。我們需要確保模型從數據中正確學習到了大部分的模式,並且沒有被數據中的噪聲過度幹擾,也就是說,模型的偏差和方差都能保持在一個較低值。而本文的目的正是要介紹一下有關於交叉驗證(Cross-validation)的概念。
  • 用交叉驗證識別謠言,可能你都做錯了!
    這件利器就是——交叉驗證。關於交叉驗證,你可能會說:這沒什麼稀奇的啊,不就是同一件事獲取它不同緯度的信息來進行相互檢驗佐證嘛。如果你認為這件利器很容易上手,那麼你可能只練了個皮毛,甚至都練錯了!那麼,真正的交叉驗證是什麼?
  • 交叉驗證的R語言實現
    在之前的內容泛化誤差和留出法,交叉驗證中,我們介紹了泛化誤差的概念以及用以估計泛化誤差的留出法、留一法和K折交叉驗證法,本節我們討論如何在R語言中進行實現。接下來,我們考慮留一法,即Leave-one-out-cross-validatioin。
  • 面向Kaggle 和離線比賽實用工具庫 nyaggle,解決特徵工程與驗證兩...
    submission_filename = None,type_of_target ='auto',feature_list = None,feature_directory = None,with_auto_hpo = False,with_auto_prep = False,with_mlflow = False)實驗詳細代碼在典型的表格數據競賽中,開發者可能會通過交叉驗證重複進行評估
  • cross什麼意思
    cross什麼意思cross的英文解釋很多Police dogs are often a cross between a retriever and a German Shepherd.第四種:英式英語中,cross做名詞可以指用來標示位置信息或者標示錯誤的叉號×。作動詞是金融專業名詞,指的是在支票中間劃兩道線(用來指明需要轉入銀行帳戶中)。
  • cross是穿過,finger是手指,那cross one's fingers是什麼意思?
    我們知道cross有「穿過,越過」的意思,finger的意思是「手指」,那cross one's fingers是什麼意思呢?cross one's fingers的意思是「to hope very much that something will happen」,即「祈求好運,希望」。這句習語源於基督教。
  • 為什麼驗證項目失敗?
    Thus validation is arecurring cost and if not performed in an optimal manner, could significantlyincrease the Cost of Goods (COG).驗證是測試的書面證據,以證明計算機化系統和工藝始終如一地按照設計運行並"適合使用"。
  • TensorFlow四種Cross Entropy算法實現和應用
    ➤交叉熵介紹交叉熵(Cross Entropy)是Loss函數的一種(也稱為損失函數或代價函數),用於描述模型預測值與真實值的差距大小,常見的Loss函數就是均方平方差(Mean Squared Error),定義如下。
  • TensorFlow四種Cross Entropy算法的實現和應用
    平方差可以表達預測值與真實值的差異,但在分類問題種效果並不如交叉熵好,原因可以參考James D.TensorFlow的交叉熵函數TensorFlow針對分類問題,實現了四個交叉熵函數,分別是詳細內容請參考API文檔 https://www.tensorflow.org/versions/master/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits