防止機器學習過擬合的6個技巧

2020-12-11 程式設計師日常匯總

概述:(本文閱讀大概花費5分鐘)

在模型訓練中,#過擬合#是機器學習中最常遇到的問題,在這篇文章中,我們打算從三個方向:

1. 什麼是過擬合?

2. 如何判斷模型是否過擬合?

3. 在模型訓練中如何防止過擬合,或者說有哪些方式可以有效的防止過擬合?

什麼是過度擬合?

#過擬合# 指的是模型對訓練數據進行了過度學習。也就是說模型沒有學習到數據的一般性的分布規律,而只學習了每個數據點的結果(相當於記憶化)。

過擬合如右上

eg: 下圖中的做數學題,模型只是記住了訓練數據中的答案,並沒有學習到數據規律(也就是乘法公式),因而,這個模型無法去概括,也就是說,對於這個模型而言,如果是在它熟悉的領域【訓練數據中包含這樣的案例】,它表現得非常好,但是如果一旦跳出它熟悉的領域,它就開始不正常了

如上圖,看起來這個小傢伙不知道怎麼做乘法。他只記得他已經看過的問題的答案。

如何判斷模型是否過擬合?

如上所述,過擬合的特徵在於,模型無法去概括數據的分布規律,所以判斷的標準也是建立在這點能力上。為了測試這種能力,一種簡單的方法是將數據集分成兩部分:訓練集(train set)測試集(test set)。選擇模型時,有時候我們更希望將數據集拆分為三個(訓練集,驗證集,測試集 比例6:2:2),這個原因,我們在以後的文章在來描述.

訓練集代表約80%可用數據,用於訓練模型。該測試集由剩餘20%的可用數據,並用於測試模型準確性上的數據,這部分數據必須是模型之前從未接觸過的,也就是不包含在訓練集中。

有了這種比例分割,我們可以檢查模型的性能,通過觀察模型在測試集和訓練集中的表現,依照下面這種表,來判斷:

需要注意:要使此方法起作用,您需要確保測試和訓練集兩個部分都來自於你的真實情況數據,而且是均勻的。一個好的做法是在拆分之前的數據集的順序進行混洗。如下圖所示:

好的拆分,應該是拆分出的訓練和測試集都能夠表述數據的分布規律.

如何防止過度擬合 - 模型和數據兩個方面

數據上:

第一種方案:收集更多數據

一般來說,機器模型存儲的信息有限,你只能存儲這麼多信息。這也就意味著您餵養的訓練數據越多過擬合的可能性就越小。其原因是,當你添加更多的數據,模型變得無法過擬合所有樣品,並被迫推廣(泛化)取得進展。

收集更多樣本數據應該是每個數據科學任務的第一步,因為更多的數據將提高模型的準確性,同時減少過擬合的可能性。

訓練數據越多,模型泛化越好

第二種方案:數據增強和噪音

第一種方案-收集更多數據是一個繁瑣昂貴的過程。如果你不能做到這一點,你應該儘量讓你的數據更加多樣化。為此,請使用數據增強技術,以便每次模型處理樣本時,它與上一次略有不同。這將使模型更難以學習到每個樣本的參數

每次迭代都看作原始樣本的不同變體

另一個好措施是添加噪音:

對於輸入:這種方式和數據增強具有相同的作用,並且使模型在真實的自然環境下具有更好的魯棒性輸出:再次添加噪音,這將使訓練更加多樣化。註:在這兩種情況下,你需要確保的是:噪聲的幅度不太。否則,您可能最終分別淹沒噪聲中的輸入信息,或使輸出不正確。兩者都會妨礙訓練過程。

第三種方案-簡化模型

假如你現在擁有足夠多的訓練數據,您的模型仍會會出現過擬合現象,原因在於你的模型可能強大了【模型參數非常的多,比如#深度學習#網絡層數很多】,雖然樣本非常的多,但是樣本的多樣性有限,模型可以學習到樣本所有到參數。然後,您可以嘗試降低模型的複雜性

如前所述,模型只能過度填充這麼數據。通過逐步減少模型的複雜性- 比如隨機森林,排名參數神經網絡-可以使模型簡單化,來使它不出現過擬合。要做到這一點,這需要平衡好數據集和模型複雜度之間的關係。如下圖:

如上圖,在紅線左側,模型太簡單了。在紅線右側,模型太複雜,紅線處,正好合適。這也具有使模型更輕訓練更快並且運行更快的優點。

第四種方案-訓練過程

有時候訓練迭代次數過多,會造成模型#過擬合

提前終止:

在大多數情況下,模型學習正確的數據分布開始,並且在某些時候開始過度擬合數據。通過識別發生這種轉變時刻,您可以在過擬合發生之前停止學習過程。和以前一樣,這是通過查看一段時間內的訓練誤差來完成的。

如上圖所示,當測試錯誤開始增加時,我們需要停止模型的繼續迭代.

第五種方案-正則化

正則化是對模型學習過程中對一種約束,以降低過擬合。它可以採取許多不同的形式,我們將看到其中的幾個。

L1和L2正則化L1 懲罰的目的是儘量減少絕對的權重L2處罰的目的是儘量減少平方大小的權重。

由於懲罰約束,模型被迫對其權重做出妥協,因為它不能再使它們的權重變得任意。這使得模型更加通用,這有助於對抗過擬合。

L1懲罰具有附加的優點,即它強制特徵選擇這意味著它會將模型中對應訓練數據中特徵效果比較的差參數設置為0,只留下相關度高的特徵對應的有用的模型參數。這有助於找出最相關特徵數據集。缺點是,不具有L2優點,即實現簡單,優化求解變得穩定很快速,能夠起到正則化的作用。

這是重量矩陣的樣子。注意如何L1矩陣是稀疏了許多零,而L2矩陣具有稍微較小的權重

另一種可能性是在訓練期間為參數添加噪聲,這有助於模型的泛化

第六種方案:深度學習:Dropout和Dropconnect

這種非常有效的技術特定於深度學習,因為它依賴於神經網絡將信息從一層處理到下一層的事實。這個想法是在訓練期間隨機停用神經元連接dropconnect)。

這迫使網絡成為多餘的,因為它可以不再依賴特定的神經元連接到提取特定的功能。訓練完成後,所有神經元和連接都將恢復。已經表明,該技術在某種程度上等同於具有機器學習中對集合方法(有興趣對同學可以,看看這篇論文:Analysis of dropout learning regarded as ensemble learning),其有利於泛化,從而減少過擬合。

好了,看到這兒,關於機器學習的過擬合問題全部說完了~,這篇文章沒有去列舉許多的公式,以一種輕鬆敘述方式來描述,適合對機器學習入門對同學.

相關焦點

  • 深度學習,防止過擬合的七種方式
    方式一使用傳統的L1、L2正則化來防止過擬合;由於正則化可以限制權重W的大小,從某種意義上可以降低模型複雜度,可以具有更好泛化能力。方式二使用dropout層來防止過擬合。對輸入的一批樣本按照維度進行歸一化,歸一化之後的數據往往分布在坐標軸的原點附近,擬合得到的參數會比較小,所以可以防止過擬合;方式四LayerNormalize防止過擬合與batchNormalize類似,同樣是對數據進行歸一化
  • 深度學習揭秘之防止過擬合(overfitting)
    當我們在多維空間中操作時,需要使用包含數十個特徵的數據集,這種情況該怎麼辦?這個時候需要比較使用訓練集和交叉驗證集計算得到的誤差值。當然,最佳情況是這兩組的錯誤率都很低。主要問題是如何定義低錯誤率——在某些情況下它可以是1%,而在其他情況下它可以高達10%或更大。在訓練神經網絡時,設立一個比較模型性能的基準是有所幫助的。通常,這取決於執行此任務的人員能力水平。
  • 通俗化過擬合(overfitting)與 欠擬合(underfitting)
    >建模當中都有可能遇見兩種結果,即欠擬合與過擬合。基本上能涵蓋所有的特點,並在訓練集中表現得很良好;2、添加多項式特徵,這個在機器學習算法裡面用的很普遍,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強;3、減少正則化參數,正則化的目的是用來防止過擬合的
  • 來學習一下概率論基本知識,它能讓防止你的模型過擬合
    下面,就讓我們一起來跟他學習一下吧。概率論中的基本概念我們先從擲硬幣開始談起。隨機變量可以是離散的,也可以是連續的。比如拋硬幣的結果就是一個離散的隨機變量,而降雨量就是一個連續的隨機變量。下面是四個變量ABCD之間的協方差表格:當兩個變量的協方差是負數時,表示一個變量值增加的同時,另一個變量值在減少。如果協方差是0,表示一個變量的值不會影響另一個變量。
  • 談談過擬合
    為的就是不讓有些同學不好好做模型而是去猜測試集的真值來改數據。我們做的是一個集成的高級回歸模型,xgboost、lightgbm這些,在特徵工程上做不動的時候,模型用lightgbm跑出來最多也就0.8的得分,但排行榜上的分數就一天比一天過分了,當我們還在0.8左右徘徊的時候,排行榜首頁的得分就迅速降到了0.7(模型評價指標是均方誤差,指標值越小模型越好),過幾天又迅速向0.6逼近。
  • 深入理解過擬合與欠擬合
    實際上很遺憾:你剛剛犯了建模中最基本的錯誤之一,過度擬合了訓練數據。過擬合模型表現為在訓練集上具有高方差和低偏差。這會導致對新測試數據預測時與訓練數據的不一致。讓我們從學習英語的嘗試中打破這個令人困惑的定義。我們想要構建的模型是如何使用英語進行交流的表示。我們的訓練數據是莎士比亞的全部作品,我們的測試集是紐約。
  • 深度學習基礎(十一):使用TensorFlow 了解overfitting 與underfitting[過擬合與欠擬合]
    過擬合與欠擬合假設我們想要訓練模型辨識手寫文字,因此建立一個多層感知機的模型,在訓練時會用訓練誤差與測試誤差評估模型的泛化能力。因此,如果數據過少,則訓練出的模型容易發生過擬合的結果。模擬過擬合與欠擬合接著,我們嘗試模擬過擬合與欠擬合發生的情況,將使用多項式回歸(polynomial regression) 擬合以下函數,用擬合的結果解釋過擬合與欠擬合。
  • 【sklearn機器學習】——應用機器學習的建議
    總結了使用機器學習解決新問題的一些建議。包括:可視化數據的方法選擇一個適合當前問題的機器學習方法鑑別和解決過擬合和欠擬合問題處理大資料庫問題(注意:不是非常小的)不同損失函數的利弊本文以 Andrew Ng 的《Advice for applying Machine Learning》為基礎。
  • 用Python進行機器學習(附代碼、學習資源)
    本文從非線性數據進行建模,帶你用簡便並且穩健的方法來快速實現使用Python進行機器學習。使用Python庫、流水線功能以及正則化方法對非線性數據進行建模。在數據科學和分析領域中,對非線性數據進行建模是一項常規任務。但找到一個結果隨自變量線性變化的自然過程很不容易。
  • 【Deep Learning】深度學習調參技巧的總結
    剛開始, 先上小規模數據, 模型往大了放, 只要不爆顯存, 能用256個filter你就別用128個. 直接奔著過擬合去. 沒錯, 就是訓練過擬合網絡, 連測試集驗證集這些都可以不用.為什麼?+ 你要驗證自己的訓練腳本的流程對不對.
  • 深度學習調參有哪些技巧?
    剛開始, 先上小規模數據, 模型往大了放, 只要不爆顯存, 能用256個filter你就別用128個. 直接奔著過擬合去. 沒錯, 就是訓練過擬合網絡, 連測試集驗證集這些都可以不用.為什麼?+ 你要驗證自己的訓練腳本的流程對不對.
  • 量化策略裡的過度擬合
    在概念上,歷史數據包含有用的選股信號和無用的噪音,如果策略能擬合歷史數據中的信號,則策略有真正的預測能力,如果只是擬合噪音,則策略沒有預測能力。一個量化策略通常會同時擬合歷史數據中的信號和噪音,其中的噪音成分就是量化策略過度擬合的成分。 由於量化策略或多或少都有過度擬合的成分,當看到一個回測優異的量化策略時,必須高度警惕其過度擬合的危險。
  • 怎樣構建深度學習模型?六步走,時刻小心過擬合 | 入門指南
    整個過程中,過擬合的問題時時刻刻都要注意。1. 選個損失函數選擇怎樣的損失函數,取決於需要解決怎樣的問題。如果是回歸問題,就可以用均方誤差(MSE) 損失函數。舉個慄子,僅僅基於股票的歷史價格,來預測未來走勢,就很難。4. 擬合驗證集這一步,是最難的,也最花時間。怎樣才能解決訓練集上的過擬合問題?
  • 機器學習訓練中常見的問題和挑戰!
    機器學習還沒達到這一步,大部分機器學習算法需要大量的數據才能正常工作。即使是最簡單的問題,很可能也需要成千上萬個示例,而對於諸如圖像或語音識別等複雜問題,則可能需要數百萬個示例(除非你可以重用現有模型的某些部分)。
  • 圖像分類 | 深度學習PK傳統機器學習
    現在,我們不再試圖用代碼來描述每一個圖像類別,決定轉而使用機器學習的方法處理圖像分類問題。目前,許多研究者使用CNN等深度學習模型進行圖像分類;另外,經典的KNN和SVM算法也取得不錯的結果。然而,我們似乎無法斷言,哪種方法對於圖像分來問題效果最佳。
  • 跟我做機器學習——你也能掌握決策樹分析!
    其具有以下優點:(1)無數據類型的假設,適用於大多數類型的數據分析(如非正態數據、有偏數據與缺失型數據,尤其是醫學、金融的數據);(2)高度自動化過程,可以通過分類、定序、數值等變量預測分類或回歸;(3)是其他機器學習的基礎;其缺點也要注意如:(1)會出現過擬合或欠擬合,導致預測精度下降(R語言通過多種控制條件減少過
  • 過擬合(Overfitting) 與 Dropout
    在過擬合中, W 的值往往變化得特別大或特別小. 為了不讓W變化太大, 我們在計算誤差上做些手腳. 原始的 cost 誤差是 cost = (預測值-真實值)的平方. 如果 W 變得太大, 我們就讓 cost 也跟著變大, 變成一種懲罰機制. 這一種形式的 正規化。
  • 《機器學習及R應用》詳細目錄
    (詳情點擊頁底「閱讀原文」)陳強老師的《機器學習及R應用》終於上市啦!目前已經開始在高等教育出版社的官方微店預售。掃描(或識別)下方二維碼,即可前往售書頁面。昨日推文引起極大反響,不少讀者想知道《機器學習及R應用》的目錄。
  • 深入剖析機器學習中的統計思想
    當你進行機器學習時,你想知道用什麼樣的變量,以及預測未來會是什麼樣子。以統計思想的視角,了解數據分布、評估各種結果的概率、理解數據生成過程、模型解釋性是關注的重點,而機器學習更多的關注的是預測的準確性,我們知道,模型的實際應用光有準確性是不夠的,人類到現在還沒有一個非常成功的機器(系統),工作的好卻不能解釋。
  • CDA承接的全球頂級機器學習Scikit-learn 中文社區上線啦!
    但是由於官方文檔是英文撰寫,限制了很多機器學習愛好者的學習過程。因此,專業、規範、實時的Scikit-learn中文學習社區,一直以來都是國內學習者所急需。CDA 全國教研團隊從2016年已經開始大規模使用Scikit-learn作為Python機器學習課程授課的主要工具庫。