python 方差分解_干货 :教你用Python来计算偏差-方差权衡
原標(biāo)題:干貨 :教你用Python來計算偏差-方差權(quán)衡
作者:Jason Brownlee 翻譯:吳振東
本文約3800字,建議閱讀8分鐘。
本文為你講解模型偏差、方差和偏差-方差權(quán)衡的定義及聯(lián)系,并教你用Python來計算。
衡量一個機(jī)器學(xué)習(xí)模型的性能,可以用偏差和方差作為依據(jù)。
一個高偏差的模型,總是會對數(shù)據(jù)分布做出強(qiáng)假設(shè),比如線性回歸。而一個高方差的模型,總是會過度依賴于它的訓(xùn)練集,例如未修剪的決策樹。我們希望一個模型的偏差和方差都很低,但更多情況下我們需要在二者之間做出權(quán)衡。
在選擇和調(diào)整模型時,“偏差-方差權(quán)衡”是一個非常有用的概念。當(dāng)然它在一般情況下是無法直接計算的,因為這需要這一問題領(lǐng)域內(nèi)的全部知識,而我們并不具備。盡管如此,我們可以評估出一個模型的誤差,并將其拆分成偏差和方差兩部分,從而借此了解該模型的運(yùn)行方式。
在這篇教程中,你將了解如何計算一個機(jī)器學(xué)習(xí)模型的偏差和方差。
在完成這篇教程后,你將會學(xué)到:
模型誤差包含模型方差、模型偏差以及不可約誤差;
我們希望模型具有低偏差和低方差,但是一般情況下一個值的縮小會導(dǎo)致另一個值的增大;
如何將均方誤差分解成模型的偏差和方差。
我的新書《用Python掌握機(jī)器學(xué)習(xí)》(https://machinelearningmastery.com/machine-learning-with-python/)將幫助你開始新的項目,其中包括分步教程和所有示例的Python源代碼文件。
讓我們開始吧。
教程綜述
本篇教程可以分為三部分,分別是:
偏差、方差和不可約誤差;
偏差-方差權(quán)衡;
計算偏差和方差。
偏差、方差和不可約誤差
機(jī)器學(xué)習(xí)模型是用來做預(yù)測任務(wù)的,例如回歸或分類。
一個模型預(yù)測性能可以用對未參與訓(xùn)練的樣本做預(yù)測后的誤差來表示,我們將其視作是模型誤差。
誤差(模型)
模型誤差可以被分解為三個部分:模型的方差、模型的偏差以及不可約誤差的方差。
誤差(模型)= 方差(模型)+ 偏差(模型)+ 方差(不可約誤差)
讓我們仔細(xì)看看這三個術(shù)語。
模型偏差
偏差用于衡量一個模型擬合的輸入和輸出之間關(guān)系與真實情況的近似程度。
這能獲得模型的剛度:模型對于輸入和輸出之間的函數(shù)的假設(shè)強(qiáng)度。
“這能夠反映出模型的擬合結(jié)果與真實規(guī)律之間的差距?!?/p>
——《預(yù)測模型應(yīng)用》2013年版,97頁
當(dāng)偏差符合未知的真實規(guī)律時,我們可以接受具有高偏差的預(yù)測模型。但是,當(dāng)真實數(shù)據(jù)函數(shù)形式與模型的假設(shè)完全不匹配時,例如對一個高度非線性關(guān)系的數(shù)據(jù)使用線性關(guān)系的假設(shè),具備過高偏差的模型是毫無用處的。
低偏差:關(guān)于對輸入到輸出映射函數(shù)形式的弱假設(shè)。
高偏差:關(guān)于對輸入到輸出映射函數(shù)形式的強(qiáng)假設(shè)。
偏差一定是正值。
模型方差
模型的方差是模型在擬合不同的訓(xùn)練數(shù)據(jù)時性能的變化大小。它反映特定數(shù)據(jù)對模型的影響。
“方差指的是,用不同訓(xùn)練數(shù)據(jù)進(jìn)行模型評估時,模型表現(xiàn)的變化程度?!?/p>
——《統(tǒng)計學(xué)習(xí)及其在R中的應(yīng)用》2014年版,第34頁
一個高方差的模型在訓(xùn)練數(shù)據(jù)集發(fā)生細(xì)小變化時預(yù)測結(jié)果會發(fā)生很大變化。相反,對于低方差的模型,訓(xùn)練數(shù)據(jù)發(fā)生或大或小的改變時,預(yù)測結(jié)果的變化都很小。
低方差:訓(xùn)練數(shù)據(jù)集的變化對于模型來說影響很小。
高方差:訓(xùn)練數(shù)據(jù)集的變化對于模型來說影響很大。
方差一定是正值。
不可約誤差
整體而言,模型的誤差包含可約誤差和不可約誤差。
模型誤差 = 可約誤差 + 不可約誤差
可約誤差是我們可以去優(yōu)化的成分。在模型通過學(xué)習(xí)訓(xùn)練集后這一數(shù)值會下降,我們會努力讓這一數(shù)值盡可能地接近于零。
不可約誤差是我們無法從模型中剔除的誤差,在任何模型中都不可能被去除。
這一誤差源于不可控因素,例如觀測中的統(tǒng)計噪聲。
“……通常會稱之為“不可約噪聲”,且不能在建模過程中剔除?!?/p>
——《預(yù)測模型應(yīng)用》2013年版,第97頁
同樣的,盡管我們能夠把可約誤差壓縮到接近于零或者非常小的值,甚至有時能夠等于零,但不可約誤差依然會存在。這決定了模型性能的下限。
“有一點(diǎn)是我們是需要牢牢記住的,那就是不可約誤差始終會作為我們對目標(biāo)Y預(yù)測精確率的下限值,這個邊界在實踐中永遠(yuǎn)是未知的?!?/p>
——《統(tǒng)計學(xué)習(xí)及其在R中的應(yīng)用》2014年版,第19頁
這提醒我們?nèi)魏文P投疾皇峭昝赖摹?/p>
偏差-方差的權(quán)衡
對于模型的表現(xiàn)來說,偏差和方差是有關(guān)聯(lián)的。
理想情況下,我們希望一個模型能有低偏差和低方差,但是在實際操作中這是非常具有挑戰(zhàn)性的。實際上這是機(jī)器學(xué)習(xí)建模的目標(biāo)。
降低偏差很容易使方差升高。相反,降低方差也會使得偏差升高。
“這被稱之為一種‘權(quán)衡’,因為一般的方法很容易得到極低的偏差和很高的方差……或很低的方差和很高的偏差……”
——《統(tǒng)計學(xué)習(xí)及其在R中的應(yīng)用》2014年版,第36頁
這種關(guān)系一般被稱為“偏差與方差的權(quán)衡”。這是一個關(guān)于思考如何選擇模型和調(diào)整模型的概念框架。
我們可以基于偏差和方差來選擇模型。簡單的模型,例如線性回歸和邏輯回歸,通常具有高偏差和低方差。而復(fù)雜的模型,例如隨機(jī)森林,通常具有低偏差和高方差。
我們通常會基于模型的偏差和方差所造成的影響來調(diào)整模型。對于K-近鄰算法來說,超參數(shù)k控制著模型的偏差-方差權(quán)衡。k取值較小,例如k=1,會得到低偏差高方差的結(jié)果。反之k取值較大,如k=21,導(dǎo)致高偏差和低方差。
高偏差和高方差都不一定是壞的,但他們有可能會導(dǎo)致不良的結(jié)果。
我們時常要對一組不同的模型和模型參數(shù)進(jìn)行測試,從而在給定的數(shù)據(jù)集中得到最好的結(jié)果。一個高偏差的模型有可能會是過于保守的,出現(xiàn)欠擬合。相反的,一個高方差的模型可能會出現(xiàn)過擬合。
我們有可能會選擇提高偏差或方差,來減少模型的整體誤差。
計算偏差和方差
我經(jīng)常會遇到這樣的問題:
“如何能量化我的算法在數(shù)據(jù)集上所得到的偏差-方差權(quán)衡呢?”
從技術(shù)的角度講,我們無法進(jìn)行這樣的計算。
我們無法針對一個預(yù)測建模問題來計算實際的偏差和方差。因為我們并不知道真實的映射函數(shù)。
但是我們可以將偏差、方差、不可約誤差和偏差-方差權(quán)衡作為幫助我們選擇模型、調(diào)整模型和解釋結(jié)果的工具。
“在實際情況中,f是無法被觀察到的,所以一般對于統(tǒng)計學(xué)習(xí)方法來說無法明確計算MSE值、偏差、方差。雖然如此,我們必須要關(guān)注偏差-方差權(quán)衡?!?/p>
——《統(tǒng)計學(xué)習(xí)及其在R中的應(yīng)用》2014版,第36頁
雖然偏差-方差權(quán)衡是一個概念上的工具,某些情況下我們也可以進(jìn)行估計。
Sebastian Raschka建立的mlxtend庫提供了bias_variance_decomp()函數(shù),可以對一個模型采用多重自采樣(multiple bootstrap samples)的方式來評估偏差和方差。
首先,你需要安裝mlxtend庫,例如:
sudo pip install mlxtend
下面這個例子是直接通過URL載入波士頓房價數(shù)據(jù)集,劃分為訓(xùn)練集和測試集,然后估計出對于線性回歸的均方根誤差(MSE),以及采用200次自采樣所獲得的偏差和方差模型誤差。
#estimate the bias and variance for a regression model
frompandas import read_csv
fromsklearn.model_selection import train_test_split
fromsklearn.linear_model import LinearRegression
frommlxtend.evaluate import bias_variance_decomp
#load dataset
url ='https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe= read_csv(url, header=None)
#separate into inputs and outputs
data= dataframe.values
X, y= data[:, :-1], data[:, -1]
#split the data
X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,random_state=1)
#define the model
model= LinearRegression()
#estimate bias and variance
mse,bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test,loss='mse', num_rounds=200, random_seed=1)
#summarize results
print('MSE:%.3f' % mse)
print('Bias:%.3f' % bias)
print('Variance:%.3f' % var)
執(zhí)行上述代碼,記錄估計出的誤差和模型的偏差和方差。
注意:考慮到算法或評估過程的自然隨機(jī)性或者是數(shù)值精度的不同,你的結(jié)果有可能會存在很大的差異。你可以考慮把這段代碼反復(fù)執(zhí)行幾次,比較結(jié)果的平均值。
本例中,我們可以看到這個模型具有高偏差和低方差。這是預(yù)料之中的,因為我們用的是線性回歸模型。我們還可以看到估計平均值加上方差等于模型的評估誤差,即20.726+1.1761=22.487。
MSE:22.487
Bias:20.726
Variance:1.761
深入了解
如果您想進(jìn)一步了解,本節(jié)將提供更多有關(guān)該主題的資源。
教程
機(jī)器學(xué)習(xí)中的偏差-方差權(quán)衡:
https://machinelearningmastery.com/gentle-introduction-to-the-bias-variance-trade-off-in-machine-learning/
書籍
《統(tǒng)計學(xué)習(xí)及其在R中的應(yīng)用》,2014版:
https://amzn.to/2RC7ElX
《預(yù)測模型應(yīng)用》,2013版:
https://amzn.to/3a7Yzrc
文章
偏差-方差權(quán)衡,維基百科:
https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff
偏差方差分解,MLxtend庫:
http://rasbt.github.io/mlxtend/user_guide/evaluate/bias_variance_decomp/
總結(jié)
在這篇教程中,你掌握了如何計算一個機(jī)器學(xué)習(xí)模型的偏差和方差。
具體而言,你學(xué)到了:
模型誤差包含模型方差、模型偏差以及不可約誤差。
我們尋求具有低偏差和低方差的模型,但是一般情況下一個值的縮小會導(dǎo)致另一個值的增大。
如何將均方誤差分解成模型的偏差和方差。
原文標(biāo)題:
How to Calculate the Bias-Variance Trade-off with Python
原文鏈接:
https://machinelearningmastery.com/calculate-the-bias-variance-trade-off/
譯者簡介:吳振東,法國洛林大學(xué)計算機(jī)與決策專業(yè)碩士?,F(xiàn)從事人工智能和大數(shù)據(jù)相關(guān)工作,以成為數(shù)據(jù)科學(xué)家為終生奮斗目標(biāo)。來自山東濟(jì)南,不會開挖掘機(jī),但寫得了Java、Python和PPT。
轉(zhuǎn)自: 數(shù)據(jù)派THU 公眾號;轉(zhuǎn)載請注明原文鏈接和作者,如有侵權(quán)或出處有誤請和我們聯(lián)系。返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的python 方差分解_干货 :教你用Python来计算偏差-方差权衡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Php 哈夫曼 压缩图片,快速Huffm
- 下一篇: 在Python中,查看torch、cud