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

本文首發自集智專欄編程

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

什麼是過擬合?

過擬合是指模型爲了獲得一致假設而使假設變得過於嚴格,也就是說模型對訓練數據的學習有點過頭。模型並無學習數據的總體分佈,而是學習了每一個數據點的預期輸出。機器學習

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

(模型過擬合後就跟圖中的小傢伙同樣:只記得以前作過的一些題的標準答案,但就是不知道怎麼計算。)

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

怎樣發現過擬合

如上所說,過擬合的一個典型特徵就是模型不能泛化。若是想測試模型是否具備泛化能力,一個簡單的方法就是將數據集分紅兩部分:訓練集測試集性能

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

實際上分紅三部分效果會更好:60%的訓練數據集,20%的測試數據集和20%的驗證數據集。學習

經過分割數據集,咱們能夠用每一個數據集去檢驗模型的性能,以深刻了解模型的訓練過程,找出何時發生了過擬合。下圖展現了不一樣的狀況。測試

注意,若是想讓這種方法湊效,你須要確保每一個數據集都能表明你的數據。一個比較好的實踐方法是分割數據集以前先打亂(shuffle)數據集的順序。人工智能

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

如何防止過擬合(從模型&數據角度)

首先,咱們能夠試着查看整個系統的各個組件尋找解決方法,也就是說改變咱們所用的數據。

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優惠券哦)

相關文章
相關標籤/搜索