全文共6200字,預計學習時長30分鐘或更長
有沒有想過擁有預測未來的能力?
也許你想要根據偶然獲得的信息來評估股票的表現如何。或者你想要得知洗澡頻次、養貓的數量多少和你的壽命長短是否存在關聯。
你還有可能想要弄清一天之內給母親打電話超過三次的人是誰,一個對他人稱呼為「哥們」的人和一個從未自己做過家務的人與高於平均離婚率之間是否有聯繫。
如果你確實想要得知這些問題,那麼多元回歸分析正可以幫助到你。
多元回歸分析由於分析多種信息之間存在的聯繫而十分有趣。它不只是簡單地分析事物和另外一件事物的關聯——就像簡單線性回歸那樣,而是可以幫助你處理許多不同事物和你想要預測事物之間的關係。
線性回歸模型是一種數據模型,經常適用於數據科學,也是機器學習中的一個基礎構建塊。多元回歸分析(MLR)是一種數據技術,可以使用一些變量來預測不同變量的結果。其旨在建造自變量和因變量之間的線性關係。它展現了多種自變量如何與一種因變量相關聯。
簡單線性回歸用於只有一個自變量和一個因變量的情況下。而多元回歸分析適用於具有多種不同的自變量的情況。
多元回歸分析有以下三大主要用途:
· 查看自變量對因變量的影響強度。
· 檢測當自變量發生變化時因變量會發生何種程度的改變。
· 推測趨勢和未來值。
讓我們先來做一個試驗吧。
我們將把事物極度簡化以便理解多元線性回歸存在意義。當然真實世界中情況可能會更加複雜。
如何開始?
假設你正在為風險投資家工作。
若現在你擁有五十家公司的信息資料庫和五列數據,其中包含了公司在管理、研發、市場、各公司所在的州位置和今年利潤的有關信息。由於資料庫是匿名的,我們無法從中得知這些公司的名稱以及其它識別信息。
而你需要去分析這些數據並且建立模型,告知老闆哪家公司最值得在未來進行投資。簡而言之,老闆需要根據公司去年的利潤來做出決策。也就是說,利潤是因變量,其他的因素就是自變量。
所以你需要根據現有的其他數據去研究因變量(利潤)。
然而老闆並不是真正想要投資這些公司。事實上,他想要把資料庫中包含的信息作為樣本,在含有相同信息前提下,來幫助理解哪家公司在未來會表現更佳。
他是想要在研發上投資呢還是在市場上投資?他想要投資位於伊利諾斯州的公司嗎?你的職責是幫助他建立一套指南,讓他可以說出類似於以下的話:「我有興趣投資紐約州的那家公司,因為它在管理上的開銷很少,而在研發上的開銷則比較大。」
你需要建立一個模型,從而讓他可以評估在哪裡投資哪些公司可以最大化其利潤。
需要記住的是,因果關係和相關性不可混為一談。不能說一方引起了另一方的發生,而是自變量和因變量息息相關。
以下假定都必須驗證正確:
· 自變量和因變量之間存在線性關係。
· 自變量之間聯繫不緊密。
· 因變量的觀察是獨立且任意的。
· 回歸殘差通常是分布的。
在運行建立模型之前,你需要查看這些假定是否正確。我們完全跳過了這一步。但是在現實世界中請確保這樣做,不要盲目地跟隨本教程。建立回歸時,這些假定要正確。
虛擬變量
如果你對虛擬變量的概念不甚了解,請查看有關數據清理和數據預處理的文章。其中含有的代碼比較簡單,我們可以進行複製粘貼操作。
之前已經確定因變量(y)是「利潤」,而其他影響因素都成為了自變量(X)。同時,我們需要搭建一個線性回歸模型。那麼如何處理狀態列呢?「狀態」是分類變量,而不是數值變量,而我們需要的是數值變量絕非是一些單詞。如何處理這些情況呢?
創建虛擬變量吧!
查看位置欄中的信息,你可能會發現所有檢視的公司都處於兩種狀態。為了解釋得更加清楚,我們可以說資料庫中的所有公司不是位於紐約就是在明尼蘇達州。也就是說我們需要把這一欄信息分成分別含有許多1和許多0的兩列信息。
那麼該如何自動添加這些數據欄呢?一般來說,我們會將每一個狀態變為其自身的欄。如果一個公司坐落於紐約,它就會在「紐約「這欄上有一個1,而在」明尼蘇達州」這欄填寫0。如果你使用了更多種狀態,你會在「紐約」這欄有一個1,而在「加利福尼亞州」、「伊利諾斯州」、「阿肯色州「 等其它州所在欄裡標註為0。我們不會再使用原來的」地址「欄,因為我們不會再需要它了。
這些1和0就像燈的開關:1意味著「開「或者」好「;0意味著「關」或者「不好」。
留心虛擬變量陷阱
你永遠不會希望在同一時間包括這兩種變量。
為什麼呢?
你會複製變量。第一個變量(d1)等於1減去第二變量(d2)。(d1=1-d2)當用一個變量去預測另一個變量時,就叫做多重共線性。結果就是你搭建起來的模型不會區分d1和d2分析所得結果。你不可能同時得到常量和兩個虛擬變量。如果你有九個變量,請包含八個變量。(如果你有兩組虛擬變量,你需要為每一組變量做這樣的操作。)
什麼是假定值(P-value)?
熟知假定值的概念是遲早的事。
假定值就是在原假設為真的前提下,得到與數據相同或者更為極端的可能性的值。假定值為含有奇怪的數據的樣本的提供了了價值。如果你有一個很大的假定值,也許不會產生和原假定不同的想法。如果假設為真,那麼一個很大的假定值也就意味著得到像你這樣的樣本就不足為奇了。當假定值開始變小,你需要捫心自問,重新思考自己的想法甚至否定原假設。
原假設是對於處於試驗中假設的一個官方稱號。它處於默認位置,與測試組之間沒有聯繫。在每一個實驗中,你都在尋找測試組間的效果。不幸的是,這些組之間總有可能沒有效果(或者說沒有不同)。而沒有不同點就被叫做原假設。
這就像你在試驗一種無效的藥物一樣。在試驗中,服用該藥物的人和其他人群所差無幾,那麼將沒有差異。
你總是假設原假設為真,直到你有證據證明它不是。
讓我們繼續!
我們需要找出想要保留和想要丟棄的列。如果你只是把一些數據胡亂塞進模型,這樣做不太好。這也不值得信賴!
多元線性回歸
以下是建立多元線性回歸模型的五個方法:
1. 利用所有數據建模,並期待得到最佳結果。
2. 後向消除。
3. 向前選擇變量法。
4. 雙向消除。
5. 成績比較。
你一定也有聽說過回歸分析。回歸分析常是雙向消除(方法四)的另一種說法。有時人們也用它來指代方法二、三、四的結合體。(這也是雙向消除的深層意思)
方法一(投擲數據法):
這當然不是官方給定的方法名(但應該可以這麼說。)有時候你需要搭建一個模型用於投擲所有變量。你可能有一些先驗經驗,也有可能有需要使用的特定模型。你可能是被老闆指派這樣做的,也有可能只是為後向消除做鋪墊。這的確是一個選擇, 所以我將它囊括於此。
方法二(後向消除):
基本步驟:
1. 首先,你需要為數據設置一個顯著水平,比如說你可能會想要設定一個5%的顯著性水平(SL=0.05)。這很重要,並且會帶來真實的影響,因此設置時需要慎重思考。
2. 然後,使用所有可能的預測變量來擬合整個模型。
3. 你需要考慮最高假定值的預測變量。如果最高假定值大於顯著性水平,轉至第四步。否則,結束預測。
4. 移出所有最高假定值的預測變量。
5. 在沒有預測變量的情況下擬合模型。如果只刪除了變量,你需要重新構建和擬合模型。係數和常數不盡相同,當你刪除其中一個則會影響其他變量。
6. 回到步驟3,重複執行此操作直到最高假定值小於SL。此時,模型完成。所有剩餘變量都小於顯著性水平.
(在我們理解完這些概念後,本文將介紹一個向後消除的例子,從而方便你們看到其實際效果!這的確令人感到困惑,但如果你切身看到其發生,你就會明白。)
方法三(向前選擇變量法):
這比起簡單反向消除更為複雜。
1. 選擇你的顯著性水平。(SL=0.05)
2. 擬合所有可能的簡單回歸模型,並且選擇最低假定值模型。
3. 保持此變量並擬合所有可能模型,在已有模型中添加一個額外預測變量。如果我們選擇一個帶有一個變量的簡單線性回歸量,現在我們需要選擇帶有兩個變量的。也就是所有可能的兩種變量線性回歸。
4. 找到具有最低假定值的預測變量。如果P<SL,回到第三步。如果沒有,那就結束。
當P不再小於SL,或者沒有更多的假定值小於顯著性水平時,我們可以停止。因為這意味著該變量不再顯著。我們不需要保留當前的模型,而是保留前一個,因為在最終模型中,變量無關緊要。
方法四(雙向消除):
這一方法是前面兩種的結合!
1.選擇輸入的顯著性水平和保留的顯著性水平。(SLENTER=0.05, SLSTAY=0.05)
2. 在添加新變量的位置執行向前選擇變量法的下一步。需要讓假定值小於SLENTER。
3. 現在執行反向消除的所有步驟。變量必須具有小於SLSTAY的假定值才能保持不變。
4. 現在回到第二步,然後繼續前進到第3步,依此類推,直到沒有可以輸入的新變量,並且沒有新變量輸出。
任務完成。
方法五(得分比較):
下面我們分析所有可能的方法,並對他們的得分進行比較,這絕對是最費資源的方法!
1. 選擇衡量擬合優良性的標準(例如,赤池信息量準則)
2. 建立所有可能的回歸模型
3. 選擇擬合優良性最好的那一個
一個有趣的事實:如果有10列數據,你將會有1023個模型。如果要繼續下去,你最好全身心投入!
如果你剛開始機器學習、統計或者數據科學的學習,那這似乎需要編寫大量的代碼。但其實不是!
你需要完成的很多事情都會由機器學習模型中的那些神奇的庫來實現。你只需要完成那些困難的部分,其中包括決定哪些是重要信息以及你想使用的模型是什麼。你還需要解釋產生的結果,並與他人交流你的成果。然而,代碼本身是非常可行的。
向後消元法是最快也是最好的方法,本文將展示建立了快速簡單的多元線性回歸模型之後的成果。
首先,準備好數據集。假設有一個叫做「startups.csv」的CSV文件,裡面包含了之前談到的信息。總共有50個公司,列名有研發支出、行政支出、營銷支出以及公司所在的州(比如紐約州、明尼蘇達州和加利福尼亞州),還有一列是去年的利潤。
導入庫是很好的選擇。
# Importing the librariesimport numpy as npimport matplotlib.pyplot as pltimport pandas as pd
毫無疑問,我們想把數據集的名字改成自己的。把它命名為『startups.csv』,還將調整一些其他的小細節。利潤(y)仍是最後一列,所以將繼續用[:,:-1]刪除這一列的利潤。我們將做一些調整,用[:,4]獲取自變量。現在有一個因變量(y)的向量和一個自變量矩陣,它包含除了利潤(X)之外的所有信息。我們想看看這兩者之間是否存在線性依賴關係!
dataset = pd.read_csv('startups.csv')X = dataset.iloc[:, :-1].valuesy = dataset.iloc[:, 4].values
現在我們需要對分類變量進行編碼。可以使用標籤編碼器和一個熱編碼器來創建虛擬變量。你將再次在[:,3]和[:,3]兩個位置更改列的指數,並在熱編碼器中替換指數。
from sklearn.preprocessing import LabelEncoder, OneHotEncoderlabelencoder = LabelEncoder()X[:, 3] = labelencoder.fit_transform(X[:, 3])onehotencoder = OneHotEncoder(categorical_features = [3])X = onehotencoder.fit_transform(X).toarray()
完成了!之前的一列信息現在變成了三列,每一列對應一個州!
如何避免虛擬變量陷阱?實際上,有了我們的庫,你不需要這樣做。我們選擇使用的庫會為你解決。如果你想要或需要運行該代碼,也很簡單,在對數據進行編碼之後,用一行代碼便可實現。
X=X[:, 1:]
這是用來幹什麼的?它可以從X中移除第一列。1意味著我們要選取從指數1開始到末尾的所有列。你不會選第一列。對於某些庫,需要手動刪除一列,以確保數據集不會包含冗餘。
現在我們可以將數據分成訓練數據和測試數據。最常見的分割方法是80/20分割,即80%的數據用於訓練模型,20%的數據用於測試。讓我們開始吧!
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
如何進行特徵縮放呢?
在這裡不需要進行特徵縮放,庫會為我們解決。
多元線性回歸時間!
從Scikit-Learn中輸入線性回歸。
from sklearn.linear_model import LinearRegression
現在要引入回歸量。創建一個類別為LinearRegression的對象,並將該對象與訓練集相匹配。我們想要把它應用到X_train和y_train中。
regressor = LinearRegression()regressor.fit(X_train, y_train)
現在來測試多元線性回歸量的表現吧!
(在這裡不會繪製圖表,因為我們需要五個維度來進行繪製。如果你對用一個簡單線性回歸量繪製圖表感興趣,可閱讀這篇關於構建一個簡單線性回歸量的文章。)
創建預測向量(y_pred),可以使用回歸量和預測方法來預測測試集(X_test)的觀測值。
y_pred = regressor.predict(X_test)
完成了!四行代碼便構建了一個多元線性回歸量!
現在可以看到十個預測的利潤!只需要輸入print(y_pred)就可以隨時列印它們。通過觀察預測值,並將它們與實際結果進行比較,可以很容易地比較它們。仔細觀察會發現有些預測極其準確,其餘的也相當不錯。做得很好!
因變量和自變量之間肯定存在某種線性關係。這兩者之間有很強的線性關係也顯而易見。
恭喜!現在你知道如何用Python構建一個多元線性回歸量了!
想繼續嗎?
事情將變得更具挑戰性!
有些變量對因變量有很大影響,而如果有些變量造成的影響在統計上不顯著呢?我們可以確定哪些變量對因變量的影響最大。我們要找一組有明顯影響的變量,無論影響是正面的還是負面的。
讓我們使用向後消元法吧!
向後消元法
我們需要為向後消元法做一些特定的準備。我們想要一個庫統計模型,因此輸入statsmodel .formula.api。這有點長,必須多次輸入,所以使用簡寫sm。
import statsmodels.formula.api as sm
我們需要在自變量的特徵矩陣中加上一列1,這是因為它和常數之間的作用方式。(模型需要考慮常數b0。大多數庫都包含它,但使用的統計模型中沒有。我們將添加一列1,以便統計模型正確理解公式。)
這很簡單。我們將使用.append。
有特徵矩陣X。多值參數對我們來說是完美的,因為它是一個數組。我們將輸入一個由50行和1列組成的矩陣,其中1列是1。可以用Numpy的np.ones創建它。我們需要指定想要的行數和列數(50,1)。為此需要將數組轉換為整數類型,因此使用.astype(int)。然後需要決定是添加一行還是一列(line = 0, column = 1),因此在一列中寫入axis = 1 !
若希望這一列位於數據集的開頭,要如何實現呢?把矩陣X加到有50個1的列上,而不是反過來。可以用values= X來做到。
X = np.append(arr = np.ones((50, 1)).astype(int), values = X, axis = 1)
一起來做吧!
我們想要創建一個最佳特徵的新矩陣(X_opt)。這些特徵在統計上是顯著的,並且對利潤有很大影響。這個矩陣將包含一組最佳特徵,且特徵對利潤影響很大。
對矩陣進行初始化,將統計上不顯著的變量逐一剔除。我們將通過在每一步刪除指數來做到這一點。首先取X中所有列的指數,用逗號分隔[0,1,2,3,4,5]。
回顧前面的方法,你將知道首先需要選擇前面談到的顯著性級別。然後需要符合模型。
我們不打算用自己構建的回歸量,正在使用一個新的庫,所以現在我們需要符合未來的最優矩陣。創建一個新的回歸量(最後一個來自線性回歸庫)。新類別將是普通最小二乘法(OLS)。我們需要調用該類別並指定一些參數。(你可以在這裡查看官方文件。)對於參數,我們需要一個endog(我們的因變量)和一個exog(我們的X_opt,它只是帶有截距的特徵矩陣(X),默認情況下不包括它)。為了符合矩陣,我們將使用.fit().
X_opt = X[:, [0, 1, 2, 3, 4, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
現在我們完成了X_opt的初始化。
現在來看看P值!如何尋找P值最高的預測指標?將使用回歸量對象並調用.summary()函數。
regressor_OLS.summary()
我們可以看到一個表,其中包含一些與模型相關的有用信息!可以看到調整後的R平方值和P值。P值越低,自變量相對於因變量來說就越重要。這裡,要找的是P值最高的。這很容易找到。
現在要刪除它!
可以從上面複製粘貼代碼並刪除指數2。就像這樣:
X_opt = X[:, [0, 1, 3, 4, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()
重複操作,直到沒有任何P值高於你選擇的SL值為止。要記得你總想查看原始矩陣,以便選擇正確的指數!你使用的是原始矩陣(X)中的列,而不是X_opt中的列。
你可能會得到一個P值,它非常接近你選擇的SL值。例如,我們選擇的是0.050,這裡的P值是0.060。
這是一個艱難的情況,因為你選擇的值可以是任何值。如果你想完全遵循準則,你需要刪除該指數。但是,還有其他度量標準可以幫助我們更好地理解是否想這樣做。我們可以添加其他度量標準,來幫助我們決定是否真的想做出那個選擇。這的總結中也還有很多信息,例如R平方值可以幫助我們做決定。
可以說我們一直向後消元,最後只剩下研發支出列的指數。
X_opt = X[:, [0, 1, 3, 4, 5]]regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 1, 3, 5]]regressor_OLS = sm.OLS(endog = y, exog =X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 3, 5]]regressor_OLS = sm.OLS(endog = y, exog =X_opt).fit()regressor_OLS.summary()X_opt = X[:, [0, 3]]regressor_OLS = sm.OLS(endog = y, exog =X_opt).fit()regressor_OLS.summary()
如果我們一直認真地遵循模型,現在就會知道,研發支出是因變量的一個重要預測指標!結論是,數據中能夠預測利潤且影響最大的只有一類:研發支出。
你做到了!你使用了多元線性回歸和向後消元,你可以發現,研究開發支出會讓你更好地預測一家公司的利潤。
留言 點讚 發個朋友圈
我們一起分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」