機(jī)器學(xué)習(xí)A-Z~多元線性回歸

之前的文章已經(jīng)講述了簡(jiǎn)單線性回歸的概念和代碼實(shí)現(xiàn),現(xiàn)在來繼續(xù)看看多元線性回歸谭网。所謂多元線性回歸其實(shí)就是自變量的個(gè)數(shù)變多了汪厨,之前的簡(jiǎn)單線性回歸方程可以表示為:y=b_0 +bx,那么在多元中則是y=b_0+b_1x_1+b_2x_2+...+b_nx_n

線性回歸的幾個(gè)前置條件

在正式使用多元線性回歸之前愉择,我們先談?wù)勱P(guān)于線性回歸的幾個(gè)前置條件劫乱,首先,在線性回歸中有幾個(gè)重要的假設(shè)如下所示:

  1. Linearity 線性 (數(shù)據(jù)呈線性關(guān)系)
  2. Homoscedasticity 同方差性(數(shù)據(jù)要有相同的方差)
  3. Multivariate normality 多元正態(tài)分布 (數(shù)據(jù)要呈現(xiàn)多元正態(tài)分布)
  4. Independence of errors 誤差獨(dú)立 (各個(gè)維度上的誤差相互獨(dú)立)
  5. Lack of multicollinearity 無多重共線性 (沒有一個(gè)自變量和另外的自變量存在線性關(guān)系)

也就是說我們?cè)谑褂镁€性回歸時(shí)锥涕,要考慮到實(shí)際情況是否吻合上述的幾種假設(shè)衷戈,否則可能會(huì)導(dǎo)致擬合的模型不準(zhǔn)確。

除此之外层坠,之前數(shù)據(jù)預(yù)處理的時(shí)候也提到過一個(gè)叫做虛擬變量的概念殖妇,現(xiàn)在對(duì)其進(jìn)行詳細(xì)的講解。來看下面的數(shù)據(jù)集(同樣由于篇幅問題只提供部分):

R&D Spend Administration Marketing Spend State Profit
165349.2 136897.8 471784.1 New York 192261.83
162597.7 151377.59 443898.53 California 191792.06
153441.51 101145.55 407934.54 Florida 191050.39
144372.41 118671.85 383199.62 New York 182901.99

這組數(shù)據(jù)集反映的是公司的研發(fā)投入破花,行政支出谦趣,市場(chǎng)支出以及所在地點(diǎn)對(duì)于公司的收益的影響。其中所在地點(diǎn)這個(gè)變量是個(gè)分類變量座每,沒有數(shù)值的概念前鹅,因此無法對(duì)其進(jìn)行排序或者帶入方程。數(shù)據(jù)預(yù)處理中峭梳,我們使用了虛擬變量對(duì)其進(jìn)行重新編碼舰绘,那么對(duì)于這組數(shù)據(jù)我們也可以做同樣的操作,也就是說State這列數(shù)據(jù)可以拆分成三列:

New York California Florida
1 0 0
0 1 0
0 0 1
1 0 0

假設(shè)R&D Spend對(duì)應(yīng)的自變量為x_1葱椭,Administration對(duì)應(yīng)的是x_2除盏,Marketing Spend對(duì)應(yīng)的是x_3,虛擬編碼對(duì)應(yīng)的是D_1,D_2,D_3挫以。但是對(duì)于虛擬編碼,任意一個(gè)編碼都能用另外兩個(gè)來表示窃祝,比如是否是Florida掐松,那么如果New York和California如果存在1,則肯定不是Florida粪小,否則就是Florida大磺。那么可以定義其多元線性回歸方程為:
y = b_0 + b_1*x_1 + b_2*x_2 + b_3*x_3 + b_4*D_1 + b_5*D_2
這里順便一提,我們這里給予虛擬變量的值是0和1探膊,那么如果是(100杠愧,0)或者(-1,1)可以嗎逞壁?答案是肯定的流济,比如說(100锐锣,0),那我們?cè)诜匠讨袑⑶懊娴膮?shù)D縮小一百倍绳瘟,達(dá)到的效果其實(shí)是一樣的雕憔。

接下來想想,如果把我們刪掉的b_6*D_3加上那么這個(gè)方程對(duì)不對(duì)呢糖声?其實(shí)這里就是虛擬變量的一個(gè)陷阱斤彼。回過頭看看上面所說的關(guān)于回歸問題的幾個(gè)假設(shè)蘸泻,第五條琉苇,無多重共線性這個(gè)性質(zhì)我們是否滿足了?任意一個(gè)變量實(shí)際上都可以用其他的變量來表示悦施,比如D_3=1-D_1-D_2并扇,那么就不符合無多重共線性這個(gè)要求了。因此歼争,在使用虛擬變量的時(shí)候一定要注意實(shí)際上使用的虛擬變量的數(shù)量應(yīng)該是始終都要忽略掉一個(gè)的拜马。

如何構(gòu)建一個(gè)多元線性回歸模型

接下來我們?cè)僬務(wù)勅绾我徊揭徊降厝?gòu)建一個(gè)多元線性回歸模型。在實(shí)際應(yīng)用中沐绒,往往會(huì)遇到對(duì)于一個(gè)因變量y俩莽,有很多的自變量x1,x2等等乔遮,但這些自變量不是所有的都是對(duì)這個(gè)y的預(yù)測(cè)很有幫助因素扮超,我們需要從其中剔除掉無用的元素來得到最合適的模型,那么此時(shí)就有一個(gè)問題蹋肮,如何來選擇這些自變量呢出刷?這里有五種方法來建立模型:

  1. All-in
  2. Backward Elimination 反向淘汰
  3. Forward Selection 順向選擇
  4. Bidirectional Elimination 雙向淘汰
  5. Score Comparison 信息量比較

其中的2,3坯辩,4三種方式馁龟,也是我們最常用的,叫做Step Regression也就是逐步回歸漆魔,它們的算法是類似的坷檩,只是應(yīng)用的順序有點(diǎn)不同。接下來一種種的介紹這幾種方法改抡。

All-in

所謂All-in矢炼,就是把所有我們認(rèn)為的自變量全扔進(jìn)去,一般有這幾種情況使用:

  • Prior Knowledge 我們已經(jīng)提前知道了所有的信息阿纤,知道這些所有自變量都會(huì)對(duì)模型結(jié)果有影響
  • You have to 上級(jí)需要你必須使用這些自變量
  • Preparing for Backward Elimination 為反向淘汰做準(zhǔn)備

All-in這個(gè)方法很簡(jiǎn)單句灌,但一般都是一些特殊情況下或者一些外力干涉時(shí)才會(huì)使用,這種方法不作推薦欠拾。

Backward Elimination

反向淘汰這個(gè)算法的精髓在于對(duì)于每一個(gè)這個(gè)模型的自變量來說胰锌,他對(duì)我們的模型的預(yù)測(cè)結(jié)果其實(shí)是有影響力的骗绕,用統(tǒng)計(jì)學(xué)上的一個(gè)概念叫做P-value來形容它的影響力。在這里我們先定義它的這個(gè)影響力是否顯著的一個(gè)門檻也就是一個(gè)significance level(SL)匕荸,先定義為0.05爹谭。接著第二步使用所有的自變量來擬合出一個(gè)模型。第三步榛搔,對(duì)于這個(gè)模型當(dāng)中的每一個(gè)自變量都來計(jì)算它的P值(P-value),來顯示它對(duì)我們模型有多大的影響力诺凡,然后我們?nèi)∵@個(gè)最高的P值,假設(shè)這個(gè)P>SL,就繼續(xù)往第四步践惑,否則就算法結(jié)束腹泌。那么第四步,最高的P值對(duì)應(yīng)的那個(gè)自變量我們就要將它從我們的模型中去除尔觉。第五步凉袱,去除了一個(gè)自變量后,在用剩下的自變量重新對(duì)模型進(jìn)行擬合侦铜,因此這里就是一個(gè)第三步到第五步的一個(gè)循環(huán)专甩,直到所有剩下的P值都比SL要小,這樣就說明模型已經(jīng)擬合好了钉稍。步驟詳情如下:

Backward Elimination

Forward Selection

順向選擇和反向淘汰的算法思想很接近涤躲,只是順序有了個(gè)顛倒。這里第一步還是先定一個(gè)顯著性的門檻SL=0.05.第二步贡未,我們?cè)谶@邊對(duì)每個(gè)自變量x_n都進(jìn)行簡(jiǎn)單線性回歸擬合种樱,分別得到它們的P值,然后取得它們中最低的俊卤。第三步對(duì)于這個(gè)最低的P值嫩挤,我們的結(jié)論就是這個(gè)自變量它對(duì)我們將要擬合的模型的影響是最大的,所以說消恍,我們會(huì)保留這個(gè)自變量岂昭。接下來第四步我們?cè)倏词O碌淖宰兞慨?dāng)中加上哪一個(gè)會(huì)給我們帶來最小的P值,假如說新的P值比我們之前定義的SL小狠怨,那就重新回到第三步佩抹,也就是第三步又加入了一個(gè)新的變量然后在接下來剩下的變量當(dāng)中,重新找最大的P值取董,然后繼續(xù)加到模型當(dāng)中,以此類推无宿,直到剩下來的還沒有被加入模型當(dāng)中的變量它們的P值全部大于SL茵汰,也就是說剩下的變量對(duì)于模型有可能產(chǎn)生的影響不夠顯著,那對(duì)這些就不予采納孽鸡,這個(gè)時(shí)候模型就擬合好了蹂午。步驟詳情如下:

Forward Selection

Bidirectional Elimination

所謂雙向淘汰栏豺,其實(shí)就是對(duì)之前的兩種算法的結(jié)合。在第一步中豆胸,我們需要選擇兩個(gè)顯著性門檻:一個(gè)舊的變量是否應(yīng)該被剔除和一個(gè)新的還沒有被采納的變量是否應(yīng)當(dāng)進(jìn)入我們的模型奥洼。在第二步中,我們要進(jìn)行順向選擇晚胡,來決定是否采納一個(gè)新的自變量灵奖。第三步要進(jìn)行反向淘汰,也就是我們可能要剔除舊的變量估盘,然后在第二第三步之間進(jìn)行循環(huán),由于已經(jīng)定義了兩個(gè)門檻,但出現(xiàn)新的出不去积仗,舊的進(jìn)不來時(shí)谈跛,就說明模型已經(jīng)擬合好了。步驟詳情如下:

Bidirectional Elimination

Score Comparison

最后一種箫踩,信息量比較爱态。所謂信息量,就是對(duì)于一個(gè)多元線性回歸模型的一個(gè)評(píng)價(jià)方式境钟。比如說給它進(jìn)行打分锦担。那么就有很多種打分方式。比如最常見的一種吱韭,叫做Akaike criterion.對(duì)于所有可能的模型吆豹,我們對(duì)它們進(jìn)行逐一的打分,對(duì)于多元線性回歸理盆,如果有N個(gè)自變量痘煤,那么就有2^N-1個(gè)不同的模型,對(duì)這些模型打分后選擇分?jǐn)?shù)最高的模型猿规。那這里就會(huì)有一個(gè)問題衷快,如果N很大的時(shí)候,模型的數(shù)量就會(huì)非常龐大姨俩。所以說這個(gè)方法雖然直覺上很好理解蘸拔,但自變量數(shù)量很大時(shí)就不適合使用這種方法。

Score Comparison

Coding

接下來就要進(jìn)行代碼編寫了环葵,首先還是老樣子调窍,先進(jìn)行數(shù)據(jù)預(yù)處理,將數(shù)據(jù)導(dǎo)入并對(duì)分類數(shù)據(jù)進(jìn)行虛擬編碼张遭,然后將數(shù)據(jù)集劃分成訓(xùn)練集和測(cè)試集邓萨。上面有提及過虛擬編碼的陷阱,實(shí)際上我們使用的包中已經(jīng)避開了這個(gè)陷阱,但為了強(qiáng)調(diào)這個(gè)問題缔恳,這里也對(duì)其進(jìn)行處理一下:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.linear_model import LinearRegression
import statsmodels.formula.api as sm
import numpy as np

data_path = '../data/50_Startups.csv'

dataset = pd.read_csv(data_path)
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

labelencoder_X = LabelEncoder()
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features=[3])
X = onehotencoder.fit_transform(X).toarray()

# Avoiding the Dummy Variable Trap
X = X[:, 1:]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

預(yù)處理結(jié)束后宝剖,就來進(jìn)行擬合線性回歸模型,這里第一步擬合線性回歸模型的方式和之前的簡(jiǎn)單線性回歸是一樣的歉甚。

# Fitting Multiple Linear Regression to the Training set
regressor = LinearRegression()
regressor.fit(X_train, y_train)

# Predicting the Test set results
y_pred = regressor.predict(X_test)

目前我們擬合的模型使用的方法是上述提到的All-in方法万细,但這個(gè)方法并不是最好的,這里我們使用Backward Elimination來對(duì)回歸器進(jìn)行優(yōu)化纸泄,使用的工具是statsmodels.formula.api赖钞。再然后我們還要做一件事情,在多元線性回歸時(shí)刃滓,很多時(shí)候模型里面都會(huì)有一個(gè)常數(shù)b_0仁烹,相當(dāng)于b_0*1。但在用到的標(biāo)準(zhǔn)庫(kù)的函數(shù)里面是不包含這個(gè)常數(shù)項(xiàng)的咧虎,因此我們需要在包含自變量的矩陣中加上一列卓缰,這一列全部都是1,b_0就是它的系數(shù)砰诵。代碼如下:

X_train = np.append(arr=np.ones((40, 1)), values=X_train, axis=1)

接下來要真正開始反向淘汰了征唬,首先創(chuàng)建一個(gè)矩陣X_opt,包含了最佳的自變量選擇茁彭,第一步實(shí)際上是所有的自變量总寒,之后的不斷循環(huán)后會(huì)漸漸淘汰其中的自變量。

X_opt = X_train[:, [0, 1, 2, 3, 4, 5]]

這里為什么用X_train[:, [0, 1, 2, 3, 4, 5]]而不是直接X_train呢理肺?這是因?yàn)楹竺鏁?huì)進(jìn)行不斷的淘汰摄闸,會(huì)不斷刪除其中的列,后續(xù)的代碼就能看出來了妹萨。

創(chuàng)建完X_opt后年枕,接下來就要用它來擬合新的回歸器regressor_OLS。這里用的sm.OLS方法的參數(shù)解釋一下:endog對(duì)應(yīng)的是因變量乎完,這里就是y_train熏兄,exog指的是自變量,因此這里就是X_opt树姨。

regressor_OLS = sm.OLS(endog=y_train, exog=X_opt).fit()
regressor_OLS.summary()

然后使用summary()方法摩桶,這個(gè)方法能給我們提供很多回歸器的信息,執(zhí)行后得到結(jié)果如下:

image

這里能看到所有自變量對(duì)用的P值帽揪,其中最大的是x_2硝清,就是這個(gè)公司是否在加利福利亞洲,然后我們剔除x_2转晰,再繼續(xù)擬合芦拿,得到summary砾肺,根據(jù)結(jié)果不斷剔除自變量直到最終的P值都小于我們定義的SL=0.05.代碼如下:

X_opt = X_train[:, [0, 1, 3, 4, 5]]
regressor_OLS = sm.OLS(endog=y_train, exog=X_opt).fit()
regressor_OLS.summary()

X_opt = X_train[:, [0, 3, 4, 5]]
regressor_OLS = sm.OLS(endog=y_train, exog=X_opt).fit()
regressor_OLS.summary()

X_opt = X_train[:, [0, 3, 5]]
regressor_OLS = sm.OLS(endog=y_train, exog=X_opt).fit()
regressor_OLS.summary()

X_opt = X_train[:, [0, 3]]
regressor_OLS = sm.OLS(endog=y_train, exog=X_opt).fit()
regressor_OLS.summary()

最終得到的結(jié)果是:

image

那么根據(jù)這個(gè)結(jié)果可以得到的結(jié)論就是一家公司的收益主要跟公司的研發(fā)投入有關(guān)。當(dāng)然其實(shí)其中也有其他的自變量對(duì)應(yīng)了很低的P值防嗡,如果自己一步步運(yùn)行這段代碼會(huì)發(fā)現(xiàn)行政的投入對(duì)應(yīng)的P值也只有0.07不算很高,如何更好的判斷線性回歸模型的優(yōu)劣后面還會(huì)有其他的方法來判斷侠坎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚁趁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子实胸,更是在濱河造成了極大的恐慌他嫡,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庐完,死亡現(xiàn)場(chǎng)離奇詭異钢属,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)门躯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門淆党,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讶凉,你說我怎么就攤上這事染乌。” “怎么了懂讯?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荷憋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我褐望,道長(zhǎng)勒庄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任瘫里,我火速辦了婚禮实蔽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘减宣。我一直安慰自己盐须,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布漆腌。 她就那樣靜靜地躺著贼邓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闷尿。 梳的紋絲不亂的頭發(fā)上塑径,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音填具,去河邊找鬼统舀。 笑死匆骗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的誉简。 我是一名探鬼主播碉就,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼闷串!你這毒婦竟也來了瓮钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤烹吵,失蹤者是張志新(化名)和其女友劉穎碉熄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋拔,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锈津,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凉蜂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琼梆。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跃惫,靈堂內(nèi)的尸體忽然破棺而出叮叹,到底是詐尸還是另有隱情,我是刑警寧澤爆存,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布蛉顽,位于F島的核電站,受9級(jí)特大地震影響先较,放射性物質(zhì)發(fā)生泄漏携冤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一闲勺、第九天 我趴在偏房一處隱蔽的房頂上張望曾棕。 院中可真熱鬧,春花似錦菜循、人聲如沸翘地。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衙耕。三九已至,卻和暖如春勺远,著一層夾襖步出監(jiān)牢的瞬間橙喘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工胶逢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厅瞎,地道東北人饰潜。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像和簸,于是被迫代替她去往敵國(guó)和親彭雾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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