前言:若需擷取本文全部的手書版原稿資料,掃碼關注公衆号,回複: 偏差和方差 即可擷取。
原創不易,轉載請告知并注明出處!掃碼關注公衆号【機器學習與自然語言處理】,定期釋出知識圖譜,自然語言處理、機器學習等知識,添加微信号【17865190919】進讨論群,加好友時備注來自CSDN。
在機器學習的面試中,能不能講清楚偏差方差,經常被用來考察面試者的理論基礎,本文就機器學習中偏差和方差進行了詳細總結,供參考
一、了解偏差、方差
偏差:描述的是預測值的期望與真實值之間的差距,偏差越大,越偏離真實資料
方差:預測值的方差,描述的是預測值的變化範圍,離散程度,也就是離預測值期望值的距離,方差越大,資料的分布越分散,概念上了解比較抽象,下面我們通過下面一個例子來了解一下偏差和方差
如上圖,我們假設一次射擊就是一個機器學習模型對一個樣本進行預測,射中紅色靶心位置代表預測準确,偏離靶心越遠代表預測誤差越大。偏差則是衡量射擊的藍點離紅圈的遠近,射擊位置即藍點離紅色靶心越近則偏差越小,藍點離紅色靶心越遠則偏差越大;方差衡量的是射擊時手是否穩即射擊的位置藍點是否聚集,藍點越集中則方差越小,藍點越分散則方差越大。
二、偏差、方差與模型範化能力
先給出結論:模型的泛化能力(泛化誤差)是由偏差、方差與資料噪聲之和,如下式:
Err ( x ) = bias 2 ( x ) + v a r ( x ) + ε 2 \text{Err}\left( x \right) = \ \text{bias}^{2}\left( x \right) + var\left( x \right) + \ \varepsilon^{2} Err(x)= bias2(x)+var(x)+ ε2
偏差度量的是學習算法預測誤差和真實誤差的偏離程度,即刻畫學習算法本身的學習能力,方差度量同樣大小的訓練資料的變動所導緻的學習性能的變化,即刻畫資料擾動所造成的影響,噪聲則表達了目前任務上任何學習算法所能到達的期望預測誤差的下界,即刻畫了學習問題本身的難度,是以泛化誤差是由學習算法的能力、資料的充分性以及問題本身難度決定
學習算法剛訓練時,訓練不足欠拟合,此時偏差較大;當訓練程度加深之後,訓練資料的擾動也被算法學習到了,此時算法過拟合,方差過大,訓練資料輕微擾動都會使得學習模型發生顯著變化,是以我們得出結論:模型欠拟合時偏差過大,模型過拟合時方差過大。我們通過下面的例子來更形象的了解一下上面的描述的結論,看下圖
例如現在我們選擇機器學習模型對圖中資料做拟合,上左圖使用直線對資料進行拟合,直線不能很好的分割資料,預測值将有大量分錯,如紅色的叉分到了藍色的圈一類,此時模型偏差過大,模型欠拟合;再看上右圖,模型過度拟合資料,将資料中的噪音點也都學到,此時資料的輕微波動将會導緻預測結果的波動,方差過大,模型過拟合;自然上中圖是我們認為比較好的拟合。
如上左圖模型便是高偏差,但是方差小;上右圖模型是高方差,但完全分割訓練樣本中所有資料是以偏差小;上中圖便是比較理想的方差和偏差都比較小;那麼有沒有想像一下高方差同時又高偏差的模型是什麼樣子?如下圖紅色線展示的模型便是高方差同時高偏差
上面給出了泛化誤差和偏差、方差與資料噪聲的公式,下面給出繁瑣的推導公式,當然對公式不敏感的可以跳過此段公式推導繼續看下文
Err ( x ) = bias 2 ( x ) + v a r ( x ) + ε 2 \text{Err}\left( x \right) = \ \text{bias}^{2}\left( x \right) + var\left( x \right) + \ \varepsilon^{2} Err(x)= bias2(x)+var(x)+ ε2
先給出各個符号的含義
x:測試樣本集
D:訓練資料集
yD:測試資料集x的标記
y:測試資料集x的真實标記
f:由訓練集D學習到的模型
f(x,D):模型f對x的預測輸出
f(x):模型f對x預測輸出的均值,即期望預測輸出
首先期望預測輸出是由預測輸出f(x,D)的均值得到:
f ‾ ( x ) = E ( f ( x , D ) ) \overset{\overline{}}{f}\left( x \right) = E(f(x,D)) f(x)=E(f(x,D))
根據上面的量我們便可以表示出偏差、方差和噪聲,首先偏差是期望輸出與真是标記y的誤差,友善直接取平方:
bias 2 ( x ) = ( f ‾ ( x ) − y ) 2 \text{bias}^{2}\left( x \right) = \ \left( \overset{\overline{}}{f}\left( x \right) - y \right)^{2} bias2(x)= (f(x)−y)2
方差是針對預測輸出上進行計算:
var ( x ) = E [ f ( x , D ) − f ‾ ( x ) ] 2 \text{var}\left( x \right) = \ {E\left\lbrack f\left( x,D \right) - \ \overset{\overline{}}{f}\left( x \right) \right\rbrack}^{2} var(x)= E[f(x,D)− f(x)]2
噪聲是真實标簽和資料中的标簽的內插補點,這裡友善預算以平方計算:
ε 2 = E [ ( y D − y ) 2 ] \varepsilon^{2} = E\left\lbrack \left( y_{D} - y \right)^{2} \right\rbrack ε2=E[(yD−y)2]
為了下面推導友善我們假設噪聲的均值為0:
E [ y D − y ] = 0 E\left\lbrack y_{D} - y \right\rbrack = 0 E[yD−y]=0
接下來我們以回歸任務為例,學習算法的平方差泛化誤差損失:
上圖推導中紅色部分公式為0,是以省略掉,這裡解釋一下為什麼紅色公式為0,因為有:
E [ f ( x , D ) − f ‾ ( x ) ] = 0 E\left\lbrack f\left( x,D \right) - \ \overset{\overline{}}{f}\left( x \right) \right\rbrack = 0 E[f(x,D)− f(x)]=0
E [ y D − y ] = 0 E\left\lbrack y_{D} - y \right\rbrack = 0 E[yD−y]=0
是以有:
E D ( 2 ( f ( x , D ) − f ‾ ( x ) ) ( f ‾ ( x ) − y D ) ) = 0 E_{D}\left( 2\left( f\left( x,D \right) - \overset{\overline{}}{f}\left( x \right) \right)\left( \overset{\overline{}}{f}\left( x \right) - y_{D} \right) \right) = 0 ED(2(f(x,D)−f(x))(f(x)−yD))=0
E D ( ( f ‾ ( x ) − y ) ( y − y D ) ) = 0 E_{D}\left( (\overset{\overline{}}{f}\left( x \right) - y)\left( y - y_{D} \right) \right) = 0 ED((f(x)−y)(y−yD))=0
這樣經過推導得出:
所有存在模型的泛化能力(泛化誤差)是由偏差、方差與資料噪聲之和:
Err ( x ) = bias 2 ( x ) + v a r ( x ) + ε 2 \text{Err}\left( x \right) = \ \text{bias}^{2}\left( x \right) + var\left( x \right) + \ \varepsilon^{2} Err(x)= bias2(x)+var(x)+ ε2
三、模型偏差高 or 方差高
在實際的應用中,如果一個模型對于測試集的預測不理想,那如何判斷是由于高偏差導緻還是高方差導緻呢,這個判斷對于後續模型優化至關重要。
參考方法:通過訓練集誤差和測試集誤差來看高偏差 or 高方差
我們以貓狗分類模型為背景來看具體如何判斷,對于貓狗分類首先我們有一個前提假設就是該資料本身能夠達到很高的正确率,例如99%的正确率,看下面四種情況:
(1)訓練集錯誤率:1%、測試集錯誤率:11% 低偏差高方差
(2)訓練集錯誤率:15%、測試集錯誤率:16% 高偏差低方差
(3)訓練集錯誤率:15%、測試集錯誤率:30% 高偏差高方差
(4)訓練集錯誤率:0.5%、測試集錯誤率:1% 低偏差低方差
是以在實際工程中我們便可以通過比較訓練集誤差和測試集誤差來看模型是由何種原因導緻,然後采取相應的錯誤,下一節介紹如何優化模型
四、高偏差高方差時優化模型
1、高偏差(模型欠拟合)時模型優化方法
(1)添加特征數
當特征不足或者選取的特征與标簽之間相關性不強時,模型容易出現欠拟合,通過挖掘上下文特征、ID類特征、組合特征等新特征,往往可以達到防止欠拟合的效果,在深度學習中,有很多模型可以幫助完成特征工程,如因子分解機、梯度提升決策樹、Deep-crossing等都可以稱為豐富特征的方法
(2)增加模型複雜度
模型過于簡單則學習能力會差,通過增加模型的複雜度可以使得模型擁有更強的你和能力,例如線上性模型中添加高此項,在神經網絡模型中增加隐層層數或增加隐層神經元個數
(3)延長訓練時間
在決策樹、神經網絡中,通過增加訓練時間可以增強模型的泛化能力,使得模型有足夠的時間學習到資料的特征,可達到更好的效果
(4)減小正則化系數
正則化是用來方式過拟合的,但當模型出現欠拟合時則需要有針對的較小正則化系數,如xgboost算法
(5)內建學習方法Boosting
Boosting算法是将多個弱分類串聯在一起,如Boosting算法訓練過程中,我們計算弱分類器的錯誤和殘差,作為下一個分類器的輸入,這個過程本身就在不斷減小損失函數,減小模型的偏差
(6)選用更合适的模型
有時候欠拟合的原因是因為模型選的不對,如非線性資料使用線性模型,拟合效果肯定不夠好,是以有時需要考慮是否是模型使用的不合适
2、高方差(模型過拟合)時模型優化方法
(1)增加資料集
增加資料集是解決過拟合問題最有效的手段,因為更多的資料能夠讓模型學到更多更有效的特征,減小噪聲的影響度。當然資料是很寶貴的,有時候并沒有那麼多資料可用或者擷取代價太高,但我們也可以通過一定的規則來擴充訓練資料,比如在圖像分類問題上,可以通過圖像的平移,旋轉,縮放、模糊以及添加噪音等方式擴充資料集,在我的這篇文章中有介紹,更一步,可使用生成式對抗網絡來合成大量的新資料
(2)降低模型的複雜度
資料集少時,模型複雜是過拟合的主要因素,适當降低模型複雜度可以避免模型拟合過多的采樣噪音,例如在決策樹算法中降低樹深度、進行剪枝;在深度網絡中減少網絡層數、神經元個數等
(3)正則化防止過拟合
正則化思想:由于模型過拟合很大可能是因為訓練模型過于複雜,是以在訓練時,在對損失函數進行最小化的同時,我們要限定模型參數的數量,即加入正則項,即不是以為的去減小損失函數,同時還考慮模型的複雜程度
未加入正則項的模型損失函數:
C ( x ) = 1 2 ∑ i = 1 n ( f ( x ) − y i ) 2 C\left( x \right) = \ \frac{1}{2}\sum_{i = 1}^{n}{(f\left( x \right) - y_{i})}^{2} C(x)= 21i=1∑n(f(x)−yi)2
加入正則項L後損失函數:
C ( x ) = 1 2 ∑ i = 1 n ( f ( x ) − y i ) 2 + λ L C\left( x \right) = \ \frac{1}{2}\sum_{i = 1}^{n}{{(f\left( x \right) - y_{i})}^{2} + \ \lambda L} C(x)= 21i=1∑n(f(x)−yi)2+ λL
其中λ是正則項系數,是用來權衡正則項和損失函數之間權重,正則化有以下兩種:
<1> L1正則化(L1範數):權重向量w的絕對值之和
L 1 = ∑ i = 1 k ∣ ∣ w i ∣ ∣ 1 L_{1} = \ \sum_{i = 1}^{k}{||w_{i}||}_{1} L1= i=1∑k∣∣wi∣∣1
<2> L2正則化(L2範數):權重向量w的平方和,歐幾裡得範數
L 2 = ∑ i = 1 k ∣ ∣ w i ∣ ∣ 2 2 L_{2} = \ \sum_{i = 1}^{k}{||w_{i}||}_{2}^{2} L2= i=1∑k∣∣wi∣∣22
其中w代表模型的參數,k則代表了模型參數的個數
(4)內建學習方法Bagging
內建學習Bagging是把多個模型內建在一起,來降低單一模型的過拟合風險
(5)選用更合适的模型
在上訴方法都沒有達到很好的效果時可以考慮選擇使用其他模型處理資料
五、談偏差和Boosting、方差和Bagging
上文在提到高偏差和高方差優化時使用內建學習方法,這小節再深入介紹一下為什麼Bagging降低了模型方差,Boosting降低了模型的偏差
1、Bagging和方差
Bagging算法對資料重采樣,然後在每個樣本集訓練出來的模型上取平均值
假設有n個随機變量,方差記為σ2,兩兩變量之間的相關性是ρ,則n個随機變量的均值的方差為:
v a r = n 2 ∗ γ 2 ∗ δ 2 ∗ ρ + m ∗ γ 2 ∗ δ 2 ∗ ( 1 − ρ ) var = \ n^{2}*\gamma^{2}*\delta^{2}*\rho + m*\gamma^{2}*\delta^{2}*(1 - \rho) var= n2∗γ2∗δ2∗ρ+m∗γ2∗δ2∗(1−ρ)
= n 2 ∗ 1 n 2 ∗ δ 2 ∗ ρ + m ∗ 1 n 2 ∗ δ 2 ∗ ( 1 − ρ ) \ \ \ \ \ \ \ = n^{2}*\frac{1}{n^{2}}*\delta^{2}*\rho + m*\frac{1}{n^{2}}*\delta^{2}*(1 - \rho) =n2∗n21∗δ2∗ρ+m∗n21∗δ2∗(1−ρ)
= ρ ∗ δ 2 + ( 1 − ρ ) ∗ δ 2 n = \rho*\delta^{2} + \left( 1 - \rho \right)*\frac{\delta^{2}}{n}\text{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } =ρ∗δ2+(1−ρ)∗nδ2
在随機變量完全獨立的情況下,n個随機變量的方差是原來的1/n
Bagging算法對n個獨立不相關的模型的預測結果取平均,方差是原來單個模型1/n,上述描述不嚴謹因為在實際問題中,模型不可能完全獨立,但為了追求模型的獨立性,Bagging的方法做了不同的改進,比如随機森林算法中,每次選取節點分裂屬性時,會随機抽取一個屬性子集,而不是從所有的屬性中選最有屬性,這就為了避免弱分類器之間過強的關聯性,通過訓練集的重采樣也能夠帶來弱分類器之間的一定獨立性,這樣多個模型學習資料,不會因為一個模型學習到資料某個特殊特性而造成方差過高
2、Boosting和偏差
Boosting算法訓練過程中,我們計算弱分類器的錯誤和殘差,作為下一個分類器的輸入,這個過程本身就在不斷減小損失函數,其bias自然逐漸下降。但由于是采取這種sequential、adaptive的政策,各子模型之間是強相關的,于是子模型之和并不能顯著降低variance。是以說boosting主要還是靠降低bias來提升預測精度
六、偏差方差平衡(Bias-Variance Tradeoff)
在實際的問題中噪音是資料自帶的,沒有辦法優化,是以為了優化模型,降低模型的泛化誤差,我們便從降低偏差和方差入手,但是方差和偏差存在權衡問題,即在優化一個時便會導緻另一個升高,下圖給出了泛化誤差和偏差、方差的變化關系:
在訓練不足時,模型的拟合能力不強,此時偏差主導着總體誤差(泛化誤差),随着訓練程度的加深,模型的拟合能力已經很強,訓練資料發生的噪音擾動也被模型學到,方差逐漸主導總體誤差。是以我們在實際工程中需要找到一個合适的方式來權衡模型的偏差和方差?
1、偏差方差權衡之經驗風險最小化模型
從上面的分析中,我們知道偏差方差權衡既是要同時降低測試誤差和訓練誤差,即如果模型滿足下式便是一個好模型:
Error train = Error test \text{Error}_{\text{train}} = \text{Error}_{\text{test}} Errortrain=Errortest
Error train ≈ 0 \text{Error}_{\text{train}}\ \approx \ \ 0 Errortrain ≈ 0
為了說明如何得到上述模型,先要提出一個更為一般的機器學習模型,經驗風險最小化,這裡給出兩個引理:
(1)聯合界引理
時間A1,A2,…,Ak表示k個不同的事件,k個事件之間不是互相獨立的,可能是有關聯的:
P ( A 1 ⋃ . . ⋃ A k ) ≤ P ( A 1 ) + P ( A 2 ) + … + P ( A k ) P\left( A_{1}\bigcup..\bigcup A_{k} \right) \leq P\left( A_{1} \right) + P\left( A_{2} \right) + \ldots + P(A_{k}) P(A1⋃..⋃Ak)≤P(A1)+P(A2)+…+P(Ak)
(2)Hoeffding不等式
Z1,Z2,…,Zm是m個獨立同分布的随機變量,他們服從均值為φ的伯努利分布(0-1分布),即表示P(Zi=1)=φ,所有對m個獨立同分布的随機變量,其均值為φ,給定λ > 0
下面式子成立:
P ( ∣ ϕ − ϕ ^ ∣ > γ ) ≤ 2 e x p ( − 2 γ 2 m ) P\left( \left| \phi - \hat{\phi} \right| > \gamma \right) \leq 2exp( - 2\gamma^{2}m) P(∣∣∣ϕ−ϕ^∣∣∣>γ)≤2exp(−2γ2m)
不等式含義是:估計的值φ與真實值φ之間的差異,不會超過不等式右側的這個上界
經驗風險最小化ERM算法證明了:當資料集m足夠大時,一般誤差與最小誤差之間是有上界的,簡單地說,當訓練誤差很小時,一般誤差也不會很大,具體證明請參考博文:
https://blog.csdn.net/zb123455445/article/details/78538361
2、偏差方差權衡之交叉驗證
(1) Hold-out cross validation 保留交叉驗證
訓練子集70%、保留交叉驗證子集30%,通常對于保留交叉驗證70%、30%是合理的劃分,先用訓練子集訓練模型,然後在剩下的保留交叉驗證子集中測試模型,選測試誤差小的模型
保留交叉驗證存在兩個問題:
第一: 最終模型和參數的選取将極大程度上依賴于對于訓練資料和測試資料的劃分
第二:部分資料用于訓練,不能很好的利用資料集
有些資料擷取十分珍貴,上述方法沒有很好的利用資料集進行模型訓練,下面提出交叉驗證的變種,更好的利用資料集進行模型訓練
(2)留1交叉驗證
這種計算量更大,僅僅針對于樣本量很少的情況,如樣本數15
如果資料集有n個,留1交叉驗證總共要訓練n次,每次選擇一個資料作為測試集,其他n-1個資料作為驗證集
(3)K重交叉驗證
通常情況下k取5份或10份,若k=10,每次留其中一份作為資料測試,用剩下9份做模型訓練,優點是很好的利用資料,缺點是要進行多次訓練,計算量大,算是上面兩種方式的綜合,當K值大的時候,我們會有更少的Bias(偏差), 更多的Variance。,當K值小的時候,我們會有更多的Bias(偏差),更少的Variance,是以選擇k對于優化結果也有十分重要的影響,一般工程中選擇k=5、10較多
注意事項1:上面提到的保留交叉驗證70%,30%是針對小資料量時劃分,當百萬資料及以上時,我們需要對資料劃分訓練集、驗證集、測試集,驗證集目的:在多個算法中選出最有效的算法;測試集目的:正确評估分類器的性能,;例如100萬,我們可能隻需要10000個作為驗證集,10000作為測試集,劃分比例(98%,1%,1%),當資料量很大時,有時候訓練集可高大99.5%
注意事項2:訓練資料和驗證,測試資料分布不比對的問題,例如:訓練集是非常高清标準的圖檔,測試集是使用者随意拍照上傳的不清楚模糊的圖檔,建議:保證驗證集和測試集是來自同一個分布,有的時候驗證集和測試集被看成同一概念