機器學習中用來防止過擬合的方法有哪些?

景略集智發表於2018-07-12

本文首發自集智專欄

過擬合可能是機器學習中最煩人的問題。下面我們就談談什麼是過擬合?怎麼發現過擬合?以及防止出現過擬合的6種方法。

什麼是過擬合?

過擬合是指模型為了得到一致假設而使假設變得過於嚴格,也就是說模型對訓練資料的學習有點過頭。模型並沒有學習資料的整體分佈,而是學習了每個資料點的預期輸出。

機器學習中用來防止過擬合的方法有哪些?

這就好比你在做數學題的時候,你只記準了某些特定問題的答案是什麼,但不知道解題的公式。這就造成模型無法泛化。如同一個人在他熟悉的領域暢通無阻,而一旦邁出這個領域就不知所措了。

機器學習中用來防止過擬合的方法有哪些?
(模型過擬合後就跟圖中的小傢伙一樣:只記得之前做過的一些題的標準答案,但就是不知道怎麼計算。)

過擬合問題比較棘手的是,猛一看好像模型的效能很好,因為它在訓練資料上出現的錯誤很小。然而,一旦讓模型去預測新的資料,它就掉鏈子了。

怎樣發現過擬合

如上所說,過擬合的一個典型特徵就是模型不能泛化。如果想測試模型是否具有泛化能力,一個簡單的方法就是將資料集分成兩部分:訓練集測試集

  • 訓練集包含80%的可用資料,用於訓練模型。
  • 測試集包含剩餘的20%可用資料,用於測試模型在它從未見過的資料上的準確率。

實際上分成三部分效果會更好:60%的訓練資料集,20%的測試資料集和20%的驗證資料集。

通過分割資料集,我們可以用每個資料集去檢驗模型的效能,以深入瞭解模型的訓練過程,找出什麼時候發生了過擬合。下圖展示了不同的情況。

機器學習中用來防止過擬合的方法有哪些?

注意,如果想讓這種方法湊效,你需要確保每個資料集都能代表你的資料。一個比較好的實踐方法是分割資料集之前先打亂(shuffle)資料集的順序。

機器學習中用來防止過擬合的方法有哪些?

過擬合雖然很難纏,但是也有一些方法能讓我們預防,下面分別從3個角度分享6種防止過擬合的方法。

如何防止過擬合(從模型&資料角度)

首先,我們可以試著檢視整個系統的各個元件尋找解決方法,也就是說改變我們所用的資料。

1 獲取更多資料

你的模型可以儲存很多很多的資訊,這意味著你輸入模型的訓練資料越多,模型就越不可能發生過擬合。原因是隨著你新增更多資料,模型會無法過擬合所有的資料樣本,被迫產生泛化以取得進步。 收集更多的資料樣本應該是所有資料科學任務的第一步,資料越多會讓模型的準確率更高,這樣也就能降低發生過擬合的概率。

機器學習中用來防止過擬合的方法有哪些?

2 資料增強&噪聲資料

收集更多的資料會比較耗時耗力。如果沒有時間和精力做這個,應該嘗試讓你的資料看起來更多元化一些。利用資料增強的方法可以做到這一點,這樣模型每次處理樣本的時候,都會以不同於前一次的角度看待樣本。這就提高了模型從每個樣本中學習引數的難度。

關於資料增強的方法,參見集智的這篇回答

另一個好方法是增加噪聲資料:

  • 對於輸入:和資料增強的目的相同,但是也會讓模型對可能遇到的自然擾動產生魯棒性。
  • 對於輸出:同樣會讓訓練更加多元化。

注意:在這兩種情況中,你需要確保噪聲資料的量級不能過大。否則最後你獲取的輸入資訊都是來自噪聲資料,或者導致模型的輸出不正確。這兩種情況也都會對模型的訓練過程帶來一定干擾。

3 簡化模型

即時你現在手中獲取了所有需要的資料,如果你的模型仍然過擬合訓練資料集,可能是因為模型過於強大。那麼你可以試著降低模型的複雜程度。

如前所述,模型只能過擬合部分資料。通過不斷降低模型的複雜度(比如隨機森林中的估計量,神經網路中的引數),最終達到一個平衡狀態:模型足夠簡單到不產生過擬合,又足夠複雜到能從資料中學習。這樣操作時一個比較方便的方法是根據模型的複雜程度檢視模型在所有資料集上的誤差。

簡化模型的另一個好處是能讓模型更輕便,訓練速度更快,執行速度也會更快。

機器學習中用來防止過擬合的方法有哪些?
(左側是模型太簡單,右側是模型過擬合)

如何防止過擬合(從訓練過程角度)

模型出現過擬合的第二個地方可能是在訓練階段,應對方法包括調整損失函式或訓練過程中模型執行的方式。

提前終止

大部分情況下,模型會首先學習資料的正確分佈,然後在某個時間點上開始對資料過擬合。通過識別模型是從哪些地方開始發生轉變的,那麼就可以在過擬合出現之前停止模型的學習過程。和前面一樣,通過檢視隨著時間推移的訓練錯誤,就可以做到這一點。

機器學習中用來防止過擬合的方法有哪些?
(當測試錯誤開始增加時,就該停止訓練了)

如何防止過擬合(從正則化角度)

正則化是指約束模型的學習以減少過擬合的過程。它可以有多種形式,下面我們看看部分形式。

L1和L2正則化

正則化的一個最強大最知名的特性就是能向損失函式增加“懲罰項”(penalty)。所謂『懲罰』是指對損失函式中的某些引數做一些限制。最常見的懲罰項是L1和L2:

  • L1懲罰項的目的是將權重的絕對值最小化
  • L2懲罰項的目的是將權重的平方值最小化

機器學習中用來防止過擬合的方法有哪些?

對於線性迴歸模型,使用L1正則化的模型建叫做Lasso迴歸,使用L2正則化的模型叫做Ridge迴歸(嶺迴歸)。下圖是Python中Lasso迴歸的損失函式,等式中加號後面一項α||w||1即為L1正則化項。

機器學習中用來防止過擬合的方法有哪些?

下圖是Python中Ridge迴歸的損失函式,等式中加號後面一項α||w||22即為L2正則化項。

機器學習中用來防止過擬合的方法有哪些?

一般迴歸分析中迴歸w表示特徵的係數,從上面等式可以看到正則化項是對係數做了處理(限制)。

結合等式,我們可以做出如下說明:

  • L1正則化是指權值向量w中各個元素的絕對值之和,通常表示為||w||1 。L1正則化可以產生稀疏權值矩陣,即產生一個稀疏模型,可以用於特徵選擇。
  • L2正則化是指權值向量w中各個元素的平方和然後再求平方根(可以看到Ridge迴歸的L2正則化項有平方符號),通常表示為||w||2。

有了懲罰項以後,模型就被迫對其權重做出妥協,因為它不能再任意讓權重變大。這樣就能讓模型更泛化,從而幫助我們對抗過擬合。

L1懲罰項另一個優點是它能進行特徵選擇,也就是說它可以讓一部分無用特徵的係數縮小到0,從而幫助模型找出資料集中最相關的特徵。缺點就是通常它在計算上不如L2懲罰項高效。

下面是權重矩陣的情形。注意L1矩陣是稀疏的權值矩陣,有很多0值,而L2矩陣則有相對較小的權值。

機器學習中用來防止過擬合的方法有哪些?

除了利用L1正則化和L2正則化防止模型過擬合之外,在訓練階段向引數中新增噪聲資料也能促進模型的泛化。

如何防止過擬合(應對深度學習模型)

對於深度學習模型中的過擬合問題,我們可以從兩個角度出發:Dropout和Dropconnect。 由於深度學習依賴神經網路處理從一個層到下一個層的資訊,因而從這兩方面著手比較有效。其理念就是在訓練中隨機讓神經元無效(即dropout)或讓網路中的連線無效(即dropconnect)。

機器學習中用來防止過擬合的方法有哪些?

這樣就讓神經網路變得冗長和重複,因為它無法再依賴具體的神經元或連線來提取具體的特徵。等完成模型訓練後,所有的神經元和連線會被儲存下來。試驗顯示這種方法能起到和神經網路整合方法一樣的效果,可以幫助模型泛化,這樣就能減少過擬合的問題。

結語

過擬合是我們在訓練機器學習模型過程中遇到的一個大問題,如果不知道怎麼應對,確實會讓人很頭疼。藉助前面提到的這些方法,相信應該能幫你在訓練機器學習模型過程中有效的防止模型過擬合。

參考資料:戳這裡


0806期《人工智慧-從零開始到精通》限時折扣中!

戳這裡看詳情

談笑風生 線上程式設計 瞭解一下?

(前25位同學還可領取¥200優惠券哦)

相關文章