--> WFU
  • 過度擬合 (Over-fitting): 模型路上的必經難解題

    想寫一篇關於過度擬合的文章很久了,因為每次做機器學習,必會碰到過度擬合,這是一個重要,但不是一個能簡單就讓人懂得概念。之前在隨機森林的文章有解釋過,過度擬合與泛化實際上是一體兩面的名詞,但實在都一樣讓人頭昏昏,所以想用最簡單的言語來試著解釋概念,本篇亦嘗試用簡單的言語說明過度擬合的解決方法。

    用一個例子了解過度配置

    想像你的是一個學生在準備學測,用練習考古題的方式,考古題背到每次做都100分,死背各種題型,然而學測成績還是不好,因為他在做考古題並未真正融會貫通,沒有學到基礎知識,所以也無從在實際考試中取得高分。

    這正如同「過度擬合」的狀況,當我們要預測未來時,我們會用過去資料去預測,把她調教到效能最好,但是效能最好並不表示這是個好模型!  因為效能最好的模型,只代表用過去的資料效能最好,不代表可以運用在未來資料預測,甚至會發生用過去資料預測效能完美,但一放入預測就效果很差的情況!  換句白話文: 「這個模型並沒有融會貫通!」,當這樣情形發生時,就代表模型過度擬合(over fitting)、沒有達到泛化(generalized)。


    怎麼知道有過度擬合? 

    「驗證資料」(Holdout Set)、「交叉驗證」的概念(K-fold)

    在建置模型時,一開始都會將資料區分成兩組。一組是用來建模的建模資料(training data),而另外一組用來檢視模型效能的測試資料(holdout/testing data)。測試資料可以想像成對照組的概念,用實驗組建模,也需要用對照組比對同樣的模型之下,測試資料是否能表現出一樣好的效能? 也因此,對照資料必須與建模資料不相同,才能夠驗證。

    隨著模型越複雜,過度擬合發生可能性也提升,當我們發現,建模資料的效能與測試資料的效能落差開始越來越大,就要注意過度擬合的問題。下圖中,隨著模型複雜度提升,建模資料(training data)開始死記住更多資料型態,錯誤率下降,同一時間驗證資料(holdout data)的錯誤率卻一直提升,代表當模型越複雜時,過度配置的狀況越趨嚴重,模型不再泛化。

    我們在直覺上可以理解為,當資料越複雜,模型需要去調成適應複雜資料的眉眉角角,調到最後反而「見樹而不見林」,看不見主軸,在下一次預測就自然失準了~

    資料來源: Data Science for Business

    如果再深入思考就會發現,一組測試組可能不夠! 萬一這次的對照組剛好是運氣好,才表現到較好效能呢? 所以更嚴謹的做法,是做交叉驗證(Cross-Validation)。交叉驗證的原理是產生出更多驗證資料,根據多次驗證結果的平均值、變異程度判斷模型是否有過度配擬合的狀況。

    但是資料就這麼多,那裏生的出多餘的測試資料來做交叉驗證? 這裡前人發明的方法設計真的非常巧妙,就是利用經濟學原理,在現有的限制式下極大化!!(遠目) 既然原有資料切成建模和驗證不夠,那就切成多個吧,來看看這段像廢話的文字怎麼運作:

    如下面的圖示,先將建模資料切成多組,然後每次驗證時其中一組挑出不建模,用其他組完成建模,而挑出的那組剛好就是用來驗證剛剛建立的模型。以下面例子來說,假設先切成4組,第一個模型資料先用到1,2,3組,第4組驗證; 第二個模型資料用到1,2,4組,第3組驗證....這樣的步驟重複多次之後,會有多個建模、驗證結果,利用平均值和標準差觀察,就得到一個綜合結果,而這個結果可以減少抽樣造成的誤差,這就是所謂K-fold交叉驗證,「K」指的是要將資料切分成幾組。

    我們可以將原本建立的模型,跟K-fold交叉驗證比對,假設我們發現原本模型的效能明顯低於K-fold結果,就要小心是否有過度配置了。同時K-fold交叉驗證的方法,也可提供我們決定模型做參考: 要使用羅吉斯回歸? 還是要使用決策樹? 觀察交叉驗證結果,如果某一個模型驗證平均效能高且標準差更穩定,就可以作為選擇的依據。

    過度擬合為什麼不好?怎麼解決?

    但過度擬合並不是個容易解決的問題,當模型做得越複雜,就越有可能發生過度擬合的狀況。除了無法預測未來資料以外,當模型參數指定的越複雜,模型會可能用想辦法找到一些不存在相關性,而這些虛假相關又進一步把我們引導到錯誤的結果。

    (1) 參數調整

    決策樹相關模型,我們可以想辦法限制樹的生長,無論是用限制每個枝葉必須要有一定以上的樣本樹、限制層樹、自己人工剪枝,背後的概念就是在模型變得複雜前,先阻止他。

    (2) 嵌套交叉驗證(Nested Cross Validation): 

    交叉驗證本身不只可以用來「驗證」模型是否過度配置,甚至可以用來「解決」過度配置問題,怎麼做呢? 方法同樣是先將建模資料分成Training/Validation兩組資料,然後Training這組在分成Training Subset & Testing Subset,我們運用Testing Subset先調整參數,避免overfitting,當參數決定好之後,再重新用決定的參數搭配Training Subset+ Testing Subset合體建模,用原本的Validation做驗證。這樣的方法可以讓我們用現行資料先決定好參數,避免因為參數使模型陷入太複雜的冏境、或是不知道如何選擇參數,參數影響模型複雜度,一旦參數控制住,模型複雜度也可以控制住。

    (3)正規化(Regularization)

    正規化也是處理模型過度擬合常見的方法,但是牽涉到更複雜的技術層面與數學原理。簡單說,正規化處理就是讓資料不只是要擬合資料(fit the data),更要讓模型變簡單,所以是擬合模型與簡化模型的一種拉扯過程。正規化的方法是在找模型擬合最小誤差時,加上一個模型複雜度的懲罰項。如果模型高度擬合,當複雜度高時,懲罰項就會越大,這樣的方法讓模型的複雜度控制在一定程度,不要過度擬合,但也要不能擬合不足。若想更深入了解正規化,可以到參考資料看看喔!

    一點心得

    過度擬合是非常難以處理的問題,原因不是因為沒有方法,或是不知道怎麼處理,而是在不知道怎麼樣處理才是「最佳解」。這必須仰賴大量的測試和模擬資料,並且針對測試資料結果進行修正。建立模型是希望預測未來,但通往未來之路並沒有那麼容易讓我們看見,一個不小心,就陷入了過度擬合,甚至虛假相關的漩渦當中不可自拔。我想,也是因為沒有輕鬆的標準答案,才讓這條通往未來之路充滿挑戰、而值得讓人努力吧~


    參考資料

    1.交叉驗證解釋+Python程式碼: K-fold交叉驗證解釋、文中並且有Python的實際執行程式碼可以參考。

    2.正規化解釋影片: 這個影片用淺顯的方式解釋了L1/L2正規化的差別,並且深入淺出的講解數學算式。

    3.嵌套式交叉驗證深入解釋:針對交叉驗證、嵌套式交叉驗證更深入的解釋原理,並且也提到多種嵌套式變形,包含預測後半(Predict Half)、Day-Forward Chaining(日前向鍊)等優劣勢分析。


  • You might also like

    沒有留言:

    張貼留言