機(jī)器學(xué)習(xí)實(shí)踐系列1——線性回歸

摘要:本文結(jié)合實(shí)際案例干旧,介紹機(jī)器學(xué)習(xí)的線性回歸模型渠欺,包括一元線性回歸和多元線性回歸,以及模型的評(píng)估椎眯。案例展示用Python代碼實(shí)現(xiàn)挠将。

一元線性回歸

機(jī)器學(xué)習(xí)系列1——機(jī)器學(xué)習(xí)概況中我們講到,監(jiān)督學(xué)習(xí)的主要任務(wù)是做預(yù)測(cè)编整,其中一種是回歸性預(yù)測(cè)舔稀,預(yù)測(cè)某一個(gè)連續(xù)型變量的數(shù)值。在線性回歸模型中掌测,根據(jù)輸入變量的個(gè)數(shù)(即特征值個(gè)數(shù))内贮,可以將模型分為一元線性回歸模型和多元線性回歸模型。我們先講解一元線性回歸汞斧。

如果在回歸分析中夜郁,只包括一個(gè)自變量和一個(gè)因變量,且二者的關(guān)系可用一條直線近似表示粘勒,這種回歸分析稱為一元線性回歸分析竞端。

一元線性回歸模型的表示:

這里
的ε表示誤差項(xiàng),也叫隨機(jī)干擾項(xiàng)庙睡,即真實(shí)值和預(yù)測(cè)值之間的差異事富。

一元線性回歸

線性回歸模型中技俐,有六大假設(shè)

  1. 對(duì)模型設(shè)定的假設(shè):
    【假設(shè)1】回歸模型是正確設(shè)定的,即模型選擇了正確的變量赵颅,且選擇了正確的函數(shù)形式虽另。
  2. 對(duì)解釋變量的假設(shè):
    【假設(shè)2】解釋變量x是確定性變量,不是隨機(jī)性變量饺谬,在隨機(jī)抽樣中取固定值捂刺。
    【假設(shè)3】解釋變量X在所抽取的樣本中具有變異性,而且隨著樣本容量的無(wú)限增加募寨,解釋變量X的樣本方差趨于一個(gè)非零的有限常數(shù)族展。樣本方差的極限為非零的有限常數(shù)的假設(shè),則旨在排除時(shí)間序列數(shù)據(jù)出現(xiàn)持續(xù)上升或下降的變量作為解釋變量拔鹰,因?yàn)檫@類數(shù)據(jù)不僅使大樣本統(tǒng)計(jì)推斷變得無(wú)效仪缸,而且往往產(chǎn)生所謂的偽回歸問(wèn)題(spurious regression problem)。
  3. 對(duì)誤差項(xiàng)ε的假設(shè):
    【假設(shè)4】誤差項(xiàng)ε是一個(gè)期望為0的隨機(jī)變量列肢。
    【假設(shè)5】誤差項(xiàng)ε與解釋變量之間不相關(guān)恰画,即兩者協(xié)方差為0。
    【假設(shè)6】誤差項(xiàng)ε是一個(gè)服從正態(tài)分布的隨機(jī)變量瓷马,且相互獨(dú)立。

案例

假設(shè)我們有以下汽車(chē)相關(guān)的數(shù)據(jù)(僅以前兩行示例)欧聘。

燃油 氣缸 排量 馬力 重量 加速度 型號(hào)年份 原產(chǎn)地
mpg cylinders displacement horsepower weight acceleration model_year origin
18.0 8 307.0 130.0 3504.0 12.0 70 1
15.0 8 350.0 165.0 3693.0 11.5 70 1
數(shù)據(jù)集下載: https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/
其中:
  mpg - 燃油效率
  model_year - 型號(hào)年份,70代表1970年
  origin - 原產(chǎn)地片林,0:北美;1:歐洲怀骤;2:亞洲

我們想知道费封,汽車(chē)的氣缸、排量蒋伦、馬力弓摘、重量、加速度凉敲、型號(hào)年份衣盾、原產(chǎn)地等這些特征,對(duì)汽車(chē)的燃油效率有什么影響爷抓,從而判斷可以根據(jù)哪些特征势决,預(yù)測(cè)出燃油效率。
我們可以先探索一下蓝撇,這些特征分別和燃油效率的相關(guān)度有多大果复。

import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

cars = pd.read_table('auto-mpg.data', delim_whitespace = True)
#刪除horsepower值為'?'的行
cars = cars[cars.horsepower != '?']

#用散點(diǎn)圖分別展示氣缸、排量渤昌、馬力虽抄、重量走搁、加速度與燃油效率的關(guān)系
fig = plt.figure(figsize = (8,20))
ax1 = fig.add_subplot(5,1,1)
ax2 = fig.add_subplot(5,1,2)
ax3 = fig.add_subplot(5,1,3)
ax4 = fig.add_subplot(5,1,4)
ax5 = fig.add_subplot(5,1,5)
ax1.scatter(cars[['cylinders']], cars['mpg'], label='a')
ax1.set_title('cylinders')
ax2.scatter(cars[['displacement']], cars['mpg'])
ax2.set_title('displacement')
ax3.scatter(cars[['horsepower']], cars['mpg'])
ax3.set_title('horsepower')
ax4.scatter(cars[['weight']], cars['mpg'])
ax4.set_title('weight')
ax5.scatter(cars[['acceleration']], cars['mpg'])
ax5.set_title('acceleration')
plt.show()
散點(diǎn)圖

可以看出,重量Weight迈窟、馬力Horsepower私植、排量Displacement和燃油效率呈現(xiàn)明顯的相關(guān)性。為了說(shuō)明一元線性回歸车酣,這里我們先假設(shè)曲稼,重量Weight和燃油效率的關(guān)系最大雷猪,我們采用重量Weight來(lái)預(yù)測(cè)燃油效率译打。

為了預(yù)測(cè),我們需要找到一個(gè)模型竿音,能夠很好的描述重量和燃油效率之間的關(guān)系娘摔,這個(gè)過(guò)程叫做擬合窄坦。我們用一元線性回歸方程y=α+βx來(lái)表示他們之間的關(guān)系,其中y表示輸出變量凳寺,這里是燃油效率鸭津,x為輸入變量,這里是重量肠缨,α為截距曙博,β為相關(guān)系數(shù),這兩個(gè)參數(shù)是我們最關(guān)心的怜瞒。因?yàn)橹亓亢腿加托手g為負(fù)相關(guān),這里β應(yīng)該是一個(gè)負(fù)數(shù)般哼。

我們利用Python中的 Scikit-learn中的LinearRegression來(lái)構(gòu)建一元線性回歸模型吴汪。Scikit-learn是建立在Python的NumPy和matplotlib庫(kù)基礎(chǔ)之上機(jī)器學(xué)習(xí)庫(kù),支持的機(jī)器學(xué)習(xí)算法包括分類蒸眠,回歸漾橙,降維和聚類,還有一些特征提壤憧ā(extracting features)霜运、數(shù)據(jù)處理(processing data)和模型評(píng)估(evaluating models)的模塊。

from sklearn.linear_model import LinearRegression
#sklearn中的模型是面向?qū)ο蟮慕褂弥靶枰跏蓟P?lr_model = LinearRegression()
#擬合模型
lr_model.fit(cars[['weight']], cars['mpg'])
#預(yù)測(cè)
cars['predictions'] = lr_model.predict(cars[['weight']])
#顯示
cars.head(5)
預(yù)測(cè)

現(xiàn)在原燃油效率淘捡、預(yù)測(cè)的燃油效率和重量的關(guān)系如下:

import numpy as np
#設(shè)置散點(diǎn)顏色
T = np.arctan2(cars['weight'],cars['mpg'])
plt.scatter(cars['weight'], cars['mpg'], c = T)
#alpha為設(shè)置透明度
plt.scatter(cars['weight'], cars['predictions'], c = 'grey', alpha = 0.5)
plt.show()
實(shí)際值 VS 預(yù)測(cè)值

可以看出來(lái),預(yù)測(cè)的燃油效率和重量的關(guān)系池摧,呈現(xiàn)出一元線性回歸方程y=α+βx的模式焦除,即一條直線。參數(shù)α和β的估計(jì)作彤,一般是通過(guò)最小二乘法確定的膘魄,其基本思想是使所有點(diǎn)到這條直線的距離的平方和最小乌逐。這里的距離也叫殘差(residual)或者訓(xùn)練誤差(training errors),所以訓(xùn)練模型的過(guò)程创葡,也是尋找最小殘差平方和(SSE浙踢,Sum of Squares for Error,經(jīng)濟(jì)學(xué)相關(guān)領(lǐng)域也把這個(gè)叫做Residual Sum of Squares灿渴,兩者是同一個(gè)概念)的過(guò)程洛波。

SSE 殘差平方和

其中yi是觀測(cè)值,f(xi)是預(yù)測(cè)值逻杖。

相關(guān)系數(shù)β的計(jì)算方式為:


相關(guān)系數(shù)

這里cov(x,y)為x和y的協(xié)方差奋岁,var(x)為x的方差。協(xié)方差是x和y總體誤差的期望值荸百,用來(lái)衡量x和y的總體誤差闻伶,如果x和y的變化趨勢(shì)一致,則協(xié)方差為正值够话,反之為負(fù)值蓝翰,如果協(xié)方差為0,表明x和y不相關(guān)女嘲。而方差是協(xié)方差的一種特殊情況畜份,即x和y是同一個(gè)變量的情況,方差衡量了樣本值的離散程度欣尼,即樣本值和樣本均值的偏離程度爆雹,方差越高,樣本值越離散愕鼓,方差越低,樣本值越集中册倒。

方差計(jì)算方式為(注意這里為樣本方差磺送,自由度為n-1驻子,不同于總體方差估灿,自由度為n):

方差

協(xié)方差計(jì)算方式為:


協(xié)方差

在Python中計(jì)算方差和協(xié)方差:

#計(jì)算方差
var = cars['weight'].var()
#計(jì)算協(xié)方差
cov = cars[['weight','mpg']].cov().iloc[0][1]

計(jì)算所得方差var(x) = 721484.7090075163,協(xié)方差cov(x,y) = -5517.44070411甲捏。
由此可得相關(guān)系數(shù) β = cov(x,y) / var(x) = -0.00764734253578演熟。

得到 β 之后,α 就可以通過(guò)以下方式計(jì)算出來(lái):


α = 46.216524549017578

這樣我們就得到了該模型的一元線性回歸方程: y = 46.22 - 0.008*x
帶入任何重量值x兄纺,都可以預(yù)測(cè)出相應(yīng)的燃油效率y化漆。

模型評(píng)估

得到模型參數(shù)之后,我們?nèi)绾卧u(píng)價(jià)模型在現(xiàn)實(shí)中的表現(xiàn)呢疙赠?因?yàn)榛貧w直線只是一個(gè)近似擬合朦拖,有很多點(diǎn)沒(méi)有落在直線上,那我們?nèi)绾闻卸ê丛溃貧w直線的擬合程度锣夹?

R^2 (Coefficient of Determination)

一般常用的判定指標(biāo)是R^2 (coefficient of determination)苏潜,又叫判定系數(shù)、擬合優(yōu)度贴唇,確定系數(shù)飞袋,或者決定系數(shù)。一元線性回歸中的R^2是皮爾遜積矩相關(guān)系數(shù)(Pearson product moment correlation coefficient或Pearson's r)的平方。

其中:

  • SST(Sum of Squares for Total):總偏差平方和是每個(gè)實(shí)際值y和其總體平均值之差的平方和蹄皱,描述的是總體的波動(dòng)情況巷折。例如在上面的實(shí)例中崖咨,燃油效率是隨著重量和其他特征而上下波動(dòng)的。
SST總偏差平方和
  • SSR(Sum of Squares for Regression):回歸平方和是每個(gè)y對(duì)應(yīng)的預(yù)測(cè)值f(x)和y的總體平均值之差的平方和婉宰,反映了y的總偏差中推穷,由于x和y的線性關(guān)系引起的y的變化部分,可以由回歸直線來(lái)解釋蟹腾。例如上面實(shí)例中娃殖,重量對(duì)燃油效率的影響议谷,就是通過(guò)回歸直線來(lái)解釋的。
SSR 回歸平方和
  • SSE(Sum of Squares for Error):殘差平方和描述的是,除了x對(duì)y的線性影響之外的其他因素對(duì)y變化的作用禀崖,是不能由回歸直線來(lái)解釋的波附。例如上面實(shí)例中,我們只是假設(shè)重量對(duì)燃油效率有影響封寞,但實(shí)際上馬力仅财、加速度等特征和燃油效率之間也呈現(xiàn)明顯的相關(guān)性盏求,對(duì)燃油效率也有影響,而這些特征對(duì)燃油效率的影響磅废,是不能通過(guò)我們擬合的“重量和燃油效率的線性回歸直線”來(lái)解釋的荆烈。
SSE殘差平方和

所以,SST(總偏差)=SSR(回歸線可以解釋的偏差)+SSE(回歸線不能解釋的偏差)

如下圖所示岔帽,3個(gè)藍(lán)色點(diǎn)為訓(xùn)練集樣本x和y之間的關(guān)系斗遏,綠色直線為擬合出來(lái)的回歸線诵次,水平黑色虛線代表了樣本中y的平均值。SST描述的是每個(gè)樣本y值和它自己的均值之間的差異關(guān)系铸本;SSR描述的是y的預(yù)測(cè)值(擬合出來(lái)的回歸線上的值)和樣本y的均值之間的差異關(guān)系箱玷;SSE描述的是每個(gè)樣本y值和y的預(yù)測(cè)值之間的差異關(guān)系陌宿。

一元線性回歸模型評(píng)估

R^2 = 1 - SSE/SST壳坪,取值介于0和1之間,越接近1沐批,說(shuō)明擬合程度越高蝎亚。如果SSE為0发框,代表所有點(diǎn)都落到擬合的直線上,則R^2 = 1顾患,說(shuō)明回歸直線能夠完全描述樣本中x和y的線性關(guān)系个唧,y的變化只受x的影響徙歼,沒(méi)有其他影響因素。反之如果SSE很大桨螺,R^2值接近于0酿秸,則說(shuō)明擬合直線不能很好的解釋x和y的關(guān)系辣苏,x和y之間可能不存在線性關(guān)系。

Python中可以直接用sklearn.metrics中的r2_score函數(shù)計(jì)算R^2 值煌张,LinearRegression中也提供了直接計(jì)算R^2 的函數(shù)score:

#用sklearn.metrics中的r2_score函數(shù)計(jì)算
from sklearn.metrics import r2_score
r2_score = r2_score(cars['mpg'],cars['predictions'])

#用LinearRegression中的score函數(shù)計(jì)算
score = lr_model.score(cars[['weight']],cars['mpg'])

計(jì)算所得r2_score = score = 0.69骏融,說(shuō)明擬合程度還可以萌狂,樣本中超過(guò)一半的數(shù)據(jù)可以用回歸直線來(lái)解釋茫藏,但不是很理想。

均方誤差MSE(Mean Squared Error)

我們可以用均方誤差(Mean Squared Error)來(lái)衡量模型的誤差冤留。均方誤差的定義為:

有沒(méi)有發(fā)現(xiàn)纤怒,這個(gè)其實(shí)就是殘差平方和的平均值泊窘。
Scikit-learn中提供了直接計(jì)算均方誤差的函數(shù):

from sklearn.metrics import mean_squared_error
mse = mean_squared_error(cars['mpg'], cars['predictions'])

計(jì)算所得mse = 18.68像寒。
但是MSE存在一個(gè)問(wèn)題,它是平方和的均值携悯,與樣本不是同一個(gè)量綱筷笨,也就是誤差是被平方擴(kuò)大了的誤差龟劲。
所以常用的是MSE的平方根RMSE(Root Mean Square Error)昌跌。

多元線性回歸

用【重量】預(yù)測(cè)【燃油效率】的效果并不顯著(R^2 = 0.69)照雁。那么如何改進(jìn)預(yù)測(cè)效果呢饺蚊?
我們看到,其實(shí)除了【重量】之外砂沛,其他特征值比如【馬力】和【排量】和【燃油效率】也呈現(xiàn)明顯的負(fù)相關(guān)性碍庵。就是說(shuō)悟狱,【燃油效率】除了受【重量】影響之外挤渐,也很可能受【馬力】和【排量】影響。為了更好的預(yù)測(cè)燃油效率得问,我們需要增加這些特征作為輸入變量软免,一元線性回歸模型已經(jīng)無(wú)法滿足我們的要求了膏萧,所以我們要用更具有一般性的模型來(lái)表示,即多元線性回歸模型蝌蹂。

假設(shè)我們?cè)黾印抉R力】和【排量】?jī)蓚€(gè)輸入變量孤个,那么我們的模型應(yīng)該是:

x1表示【重量】齐鲤,x2表示【馬力】,x3表示【排量】。
我們用Python重新預(yù)測(cè)【燃油效率】:

#初始化模型
mul_lr_model = LinearRegression()
#擬合模型
mul_lr_model.fit(cars[['weight','horsepower','displacement']], cars['mpg'])
#預(yù)測(cè)
cars['predictions_mul'] = mul_lr_model.predict(cars[['weight','horsepower','displacement']])
#顯示
cars.head(5)

直觀上來(lái)看,多元回歸的結(jié)果prediction_mul數(shù)值上更接近原【燃油效率】mpg凤壁。我們來(lái)計(jì)算一下多元回歸的R^2拧抖。

mul_score = mul_lr_model.score(cars[['weight','horsepower','displacement']], cars['mpg'])

所得mul_score = 0.71唧席,比一元回歸的score = 0.69更好一點(diǎn)。
我們通過(guò)散點(diǎn)圖來(lái)看一下多元回歸模型的預(yù)測(cè)值和各個(gè)特征值之間的關(guān)系:

fig = plt.figure(figsize = (8,12))
ax1 = fig.add_subplot(3,1,1)
ax2 = fig.add_subplot(3,1,2)
ax3 = fig.add_subplot(3,1,3)
ax1.scatter(cars[['weight']], cars['mpg'], c='blue', alpha=0.5)
ax1.scatter(cars[['weight']], cars['predictions_mul'], c='red', alpha=0.7)
ax1.set_title('weight')
ax2.scatter(cars[['horsepower']], cars['mpg'], c='blue', alpha=0.5)
ax2.scatter(cars[['horsepower']], cars['predictions_mul'], c='red', alpha=0.7)
ax2.set_title('horsepower')
ax3.scatter(cars[['displacement']], cars['mpg'], c='blue', alpha=0.5)
ax3.scatter(cars[['displacement']], cars['predictions_mul'], c='red', alpha=0.7)
ax3.set_title('displacement')
plt.show()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市腐碱,隨后出現(xiàn)的幾起案子掉弛,更是在濱河造成了極大的恐慌殃饿,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異秒咐,居然都是意外死亡携取,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)文兢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)焕檬,“玉大人实愚,你說(shuō)我怎么就攤上這事』魑梗” “怎么了碰辅?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵没宾,是天一觀的道長(zhǎng)榕吼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)原探,這世上最難降的妖魔是什么咽弦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任型型,我火速辦了婚禮全蝶,結(jié)果婚禮上抑淫,老公的妹妹穿的比我還像新娘。我一直安慰自己砌烁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著管呵,像睡著了一般捐下。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天啤握,我揣著相機(jī)與錄音排抬,去河邊找鬼授段。 笑死侵贵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卡睦。 我是一名探鬼主播表锻,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞬逊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼仪或!你這毒婦竟也來(lái)了溶其?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤束铭,失蹤者是張志新(化名)和其女友劉穎契沫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拴清,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡口予,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年沪停,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了木张。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片端三。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郊闯,死狀恐怖团赁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情至朗,我是刑警寧澤剧浸,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布嫌变,位于F島的核電站躬它,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏倘待。R本人自食惡果不足惜凸舵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一啊奄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琼富,春花似錦公黑、人聲如沸摄咆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暇仲。三九已至,卻和暖如春奈附,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背将鸵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工顶掉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痒筒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓移袍,卻偏偏與公主長(zhǎng)得像萎战,于是被迫代替她去往敵國(guó)和親蚂维。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虫啥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容