
快速介紹Python中的線性回歸
嗨,大家好!在簡要介紹Panads庫和NumPy庫之后,我想快速介紹一下在Python中構(gòu)建模型,還有什么比最基本的線性模型更好的開始呢?這將是關(guān)于機器學(xué)習(xí)的第一篇文章,我打算在將來寫一些更復(fù)雜的模型。敬請關(guān)注!但是現(xiàn)在,讓我們來關(guān)注線性回歸。
在這篇博文中,我想關(guān)注線性回歸的概念,主要是在Python中實現(xiàn)它。線性回歸是用于檢查兩個(簡單線性回歸)或更多(多重線性回歸)變量之間的線性關(guān)系的統(tǒng)計模型 - 一個因變量和自變量(s)。線性關(guān)系基本上意味著當(dāng)一個(或多個)自變量增加(或減少)時,因變量也增加(或減少):

正如你所見,線性關(guān)系可以是正的(自變量上升,因變量上升)或負(自變量上升,因變量下降)。就像我說的那樣,我將專注于Python中的回歸模型的實現(xiàn),所以我不想在回歸基礎(chǔ)的數(shù)學(xué)中深入研究,但我會寫一點。如果你想寫一篇博客文章,請不要猶豫,寫信給我答復(fù)!
一點關(guān)于數(shù)學(xué)的知識
變量Y和X之間的關(guān)系由下式表示:
Y'i = mX + b
在這個方程中,Y是因變量 - 或者我們試圖預(yù)測或估計的變量;X是自變量,我們用來做出預(yù)測的變量;m是回歸線的斜率 - 它代表X對Y的影響。換句話說,如果X增加1個單位,Y將正好增加m個單位。(“充分表達”:只有當(dāng)我們知道X和Y有線性關(guān)系時,這才成立,幾乎所有線性回歸的情況都不是這樣的?。゜是一個常數(shù),也稱為Y軸的截距。如果X等于0,則為Y將等于b(注意:請參閱前面的充分表達?。_@不一定適用于現(xiàn)實生活中 - 我們并不總是知道X和Y之間的確切關(guān)系,或者具有確切的線性關(guān)系。
這些注意事項引導(dǎo)我們進行簡單線性回歸(SLR)。在SLR模型中,我們基于數(shù)據(jù)建立一個模型 - 從數(shù)據(jù)中得出的斜率和Y軸截距;此外,我們不需要X和Y之間的關(guān)系是完全線性的。SLR模型還包括數(shù)據(jù)中的誤差(也稱為殘差)。我現(xiàn)在不會講太多,也許在后來的帖子中,但是殘差基本上是Y的真實值與Y的預(yù)測/估計值之間的差異。需要注意的是在線性回歸中,我們試圖預(yù)測一個連續(xù)變量。在回歸模型中,我們試圖通過找到“最合適的線”來最小化這些誤差 - 誤差的回歸線將是最小的。我們試圖將黑線的長度(或更準確地說,藍點的距離)從紅線上減到最小- 盡可能接近于零。它與(或等于)最小化均方誤差(MSE)或誤差平方和(SSE)相關(guān),也稱為“殘差平方和”(RSS),但這可能超出了這篇博文的范圍:-)

在大多數(shù)情況下,我們將有多個自變量 - 我們將有多個變量;它可以只有兩個自變量,最多可以有數(shù)百個(或理論上甚至數(shù)千個)的變量。在這些情況下,我們將使用多重線性回歸模型(MLR)?;貧w方程與簡單回歸方程差不多,只有更多的變量:
Y'i = b0 + b1X1i + b2X2i
這篇文章的數(shù)學(xué)部分到此結(jié)束:)準備好在Python中實現(xiàn)它了嗎?
在Python中實現(xiàn)線性回歸
在Python中執(zhí)行線性回歸有兩種主要方法 - 使用Statsmodels和scikit-learn。也可以使用Scipy庫,但我覺得這并不像我提到的另外兩個庫那么常見。我們來看兩個線性回歸:
Statsmodels中的線性回歸
Statsmodels是一個Python模塊,它提供用于估計許多不同統(tǒng)計模型的類和函數(shù),以及進行統(tǒng)計測試和統(tǒng)計數(shù)據(jù)探索。(從文檔中)
與Pandas和NumPy一樣,獲取或安裝Statsmodels的最簡單方法是通過Anaconda包。如果由于某種原因你有興趣以其他方式安裝,請查看此鏈接。安裝完成后,每次要使用它時都需要導(dǎo)入它:
import statsmodels.api as sm
讓我們來看看如何使用Statsmodels進行線性回歸。我將使用我在DC大會上所做的數(shù)據(jù)科學(xué)課程的一個例子:
首先,我們從sklearn(我提到的另一個庫)導(dǎo)入數(shù)據(jù)集:
from sklearn import datasets ## 從scikit-learn導(dǎo)入數(shù)據(jù)集
data = datasets.load_boston() ## 從數(shù)據(jù)集庫加載波士頓數(shù)據(jù)集
這是波士頓房價的數(shù)據(jù)集(鏈接到說明)。因為它是用于測試和學(xué)習(xí)機器學(xué)習(xí)工具的數(shù)據(jù)集,它附帶了對數(shù)據(jù)集的描述,我們可以通過使用命令print data.DESCR來看到它(這只適用于sklearn數(shù)據(jù)集,而不是每個數(shù)據(jù)集!雖然很酷...)我添加了描述的開頭,以便更好地了解變量:
Boston House Prices dataset
===========================
Notes
------
Data Set Characteristics:
:Number of Instances: 506
:Number of Attributes: 13 numeric/categorical predictive
:Median Value (attribute 14) is usually the target
:Attribute Information (in order):
- CRIM per capita crime rate by town
- ZN proportion of residential land zoned for lots over 25,000 sq.ft.
- INDUS proportion of non-retail business acres per town
- CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
- NOX nitric oxides concentration (parts per 10 million)
- RM average number of rooms per dwelling
- AGE proportion of owner-occupied units built prior to 1940
- DIS weighted distances to five Boston employment centres
- RAD index of accessibility to radial highways
- TAX full-value property-tax rate per $10,000
- PTRATIO pupil-teacher ratio by town
- B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
- LSTAT % lower status of the population
- MEDV Median value of owner-occupied homes in $1000's
:Missing Attribute Values: None
:Creator: Harrison, D. and Rubinfeld, D.L.
This is a copy of UCI ML housing dataset.
http://archive.ics.uci.edu/ml/datasets/Housing
This dataset was taken from the StatLib library which is maintained at Carnegie Mellon University.
運行data.feature_names和data.target將分別打印自變量和因變量的列名。意思是,Scikit學(xué)習(xí)已經(jīng)將房屋價值/價格數(shù)據(jù)設(shè)置為目標變量,并將13個其他變量設(shè)置為預(yù)測變量。我們來看看如何對這個數(shù)據(jù)集進行線性回歸。
首先,我們應(yīng)該將數(shù)據(jù)作為pandas數(shù)據(jù)框加載,以便于分析,并將住房價值中位數(shù)值設(shè)置為目標變量:
import numpy as np
import pandas as pd
# 將數(shù)據(jù)/預(yù)測變量定義為預(yù)設(shè)的特征名稱
df = pd.DataFrame(data.data, columns=data.feature_names)
# 將目標 (住房價值 -- MEDV) 放到另一個DataFrame
target = pd.DataFrame(data.target, columns=["MEDV"])
我們在這里做的是獲取數(shù)據(jù)集并將其作為pandas數(shù)據(jù)框加載;之后,我們設(shè)置預(yù)測變量(如df) - 在數(shù)據(jù)集中預(yù)先設(shè)置的自變量。我們還設(shè)定了目標 - 因變量,或者我們試圖預(yù)測/估計的變量。
接下來,我們將要擬合線性回歸模型。我們需要選擇我們認為對因變量有好的預(yù)測因子的變量 - 可以通過檢查變量之間的相關(guān)性來完成,通過繪制數(shù)據(jù)和可視化來完成,通過對什么變量進行初步研究是y的良好預(yù)測因子。對于第一個例子,讓我們來看RM - 平均房間數(shù)量和LSTAT - 居民人數(shù)降低的百分比。值得注意的是,Statsmodels在默認情況下不會添加常量。讓我們先看一下我們的回歸模型中沒有一個常數(shù):
## 沒有一個常數(shù)
import statsmodels.api as sm
X = df["RM"]
y = target["MEDV"]
# 注意參數(shù)順序的區(qū)別
model = sm.OLS(y, X).fit()
predictions = model.predict(X) # 通過模型進行預(yù)測
# 打印出統(tǒng)計模型
model.summary()
輸出:

解釋表 - 這是一張很長的表,對吧?首先,我們有什么是因變量,模型和方法。OLS代表普通最小二乘法,方法“最小二乘法”意味著我們試圖擬合一條回歸線,使回歸線距離的平方最小化(參閱本文前面部分)。日期和時間非常不言自明:)所以觀察數(shù)字。殘差和模型的Df與自由度 有關(guān)?- “最終計算的數(shù)值可以自由變化的統(tǒng)計量”。
3.634的系數(shù)意味著隨著RM變量增加1,MDEV的預(yù)測值增加了3.634。其他一些重要的值是R2 - 我們的模型解釋的方差百分比;標準誤差(是統(tǒng)計量的抽樣分布的標準偏差,最常見的均值);假設(shè)檢驗的t分數(shù)和p值,RM具有統(tǒng)計學(xué)顯著的p值;95%的置信區(qū)間RM(意思是我們預(yù)測95%的置信度RM的值在3.548至3.759之間)。
如果我們要在模型中添加一個常數(shù) - 我們必須使用命令來設(shè)置它,X = sm.add_constant(X)其中X是包含輸入(自)變量的數(shù)據(jù)框的名稱。
import statsmodels.api as sm # 導(dǎo)入statsmodels
X = df["RM"] ## X通常表示我們的輸入變量 (或自變量)
y = target["MEDV"] ## Y通常表示輸出/因變量
X = sm.add_constant(X) ## 我們添加一個截距(beta_0)到我們的模型
# 注意參數(shù)順序的區(qū)別
model = sm.OLS(y, X).fit() ## sm.OLS(輸出, 輸入)
predictions = model.predict(X)
# 打印出統(tǒng)計模型
model.summary()
輸出:

解釋表? - 用常數(shù)項,系數(shù)是不同的。沒有一個常數(shù),我們就會強迫我們的模型通過原點,但現(xiàn)在我們在-34.67有一個y截距。我們還將RM預(yù)測因子的斜率從3.634改為9.1021。
現(xiàn)在讓我們嘗試用一個以上變量來訓(xùn)練回歸模型,我們將使用之前提到的RM和LSTAT。模型擬合是一樣的:
X = df[[“RM”, “LSTAT”]]
y = target[“MEDV”]
model = sm.OLS(y, X).fit()
predictions = model.predict(X)
model.summary()
輸出:

解釋輸出? - 我們可以看到這個模型具有更高的R2 - 0.948,這意味著這個模型解釋了我們的因變量的94.8%的方差。每當(dāng)我們將變量添加到回歸模型中時,R2將更高,但這是相當(dāng)高的R2。我們可以看出,RM和LSTAT在預(yù)測(或估計)房屋價值中位數(shù)時具有統(tǒng)計學(xué)意義;毫不奇怪,我們看到,隨著RM增加1,MEDV將增加4.9069,當(dāng)LSTAT增加1時,MEDV將下降 -0.6557。你可能記得,LSTAT是人口下降的百分比,不幸的是我們可以預(yù)期它會降低房屋的中位數(shù)。同樣的邏輯,房子里的房間越多,它的價值就越高。
這是Statsmodels中單一和多元線性回歸的例子。我們可以在我們的回歸模型中使用盡可能少或盡可能多的的變量,直到所有的13個變量!接下來,我將演示如何在SKLearn中運行線性回歸模型。
SKLearn中的線性回歸
在Python中的機器學(xué)習(xí)方面,SKLearn幾乎是黃金標準。它有許多學(xué)習(xí)算法,用于回歸,分類,聚類和降維。查看我在關(guān)于KNN算法的文章,了解不同算法的映射以及與SKLearn的更多鏈接。為了使用線性回歸,我們需要導(dǎo)入它:
from sklearn import linear_model
我們使用之前使用的數(shù)據(jù)集,波士頓房價。開始的過程是一樣的 - 從SKLearn導(dǎo)入數(shù)據(jù)集并加載到波士頓數(shù)據(jù)集:
from sklearn import datasets ## 從scikit-learn導(dǎo)入數(shù)據(jù)集
data = datasets.load_boston() ## 從數(shù)據(jù)集庫中加載波士頓數(shù)據(jù)集
接下來,我們將把數(shù)據(jù)加載到Pandas(和之前一樣):
# 將數(shù)據(jù)/預(yù)測變量定義為預(yù)設(shè)的特征名稱
df = pd.DataFrame(data.data, columns=data.feature_names)
# 將目標 (住房價值 -- MEDV) 放到另一個DataFrame
target = pd.DataFrame(data.target, columns=["MEDV"])
所以現(xiàn)在,像以前一樣,我們擁有包含自變量(標記為“df”)的數(shù)據(jù)框和帶有因變量(標記為“target”)的數(shù)據(jù)框。我們使用SKLearn擬合一個回歸模型。首先我們定義我們的X和y - 這一次我將使用數(shù)據(jù)框中的所有變量來預(yù)測房價:
X = df
y = target[“MEDV”]
然后我們擬合一個模型:
lm = linear_model.LinearRegression()
model = lm.fit(X,y)
lm.fit()函數(shù)來擬合線性模型。我們想使用這個模型做出預(yù)測(這就是我們在這里的目的!),所以我們使用lm.predict():
predictions = lm.predict(X)
print(predictions)[0:5]
譯者注:print(predictions)[0:5]應(yīng)該為print(predictions[0:5])
打印函數(shù)將打印出對y的前5個預(yù)測值(我沒有把整個列表打印出來,以“節(jié)省空間”)。刪除[0:5]將打印整個列表):
[ 30.00821269 25.0298606 30.5702317 28.60814055 27.94288232]
記住,lm.predict()使用我們擬合的線性模型預(yù)測y(因變量)。你們必須注意到,當(dāng)我們使用SKLearn進行線性回歸時,我們沒有得到一個漂亮的表(好吧,這并不是那么漂亮...但它很有用)像在Statsmodels。我們可以做的是使用內(nèi)置函數(shù)來返回分數(shù)、系數(shù)和估計的截距。讓我們看看它是如何工作的:
lm.score(X,y)
會給出這個輸出:
0.7406077428649428
這是我們模型的R2得分。你可能記得,這是預(yù)測方差的百分比。如果你有興趣,閱讀這里了解更多內(nèi)容。接下來,我們來看看預(yù)測因子的系數(shù):
lm.coef_
會給出這個輸出:
array([ -1.07170557e-01, 4.63952195e-02, 2.08602395e-02,
2.68856140e+00, -1.77957587e+01, 3.80475246e+00,
7.51061703e-04, -1.47575880e+00, 3.05655038e-01,
-1.23293463e-02, -9.53463555e-01, 9.39251272e-03,
-5.25466633e-01])
和截距:
lm.intercept_
這將給出這個輸出:
36.491103280363134
這些都是我之前提到的多元回歸方程的(估計/預(yù)測)部分。查看文檔了解更多關(guān)于coef_和intercept_的更多信息。
所以,這是一個關(guān)于如何在Python中進行線性回歸的快速(但很長的?。┑慕榻B。實際上,你不會使用整個數(shù)據(jù)集,但是你會將數(shù)據(jù)分成訓(xùn)練數(shù)據(jù)來訓(xùn)練你的模型和測試數(shù)據(jù),你猜對了,測試你的模型/預(yù)測。如果你想閱讀它,請查看我的下一篇博文。同時,我希望你喜歡這篇文章,我會在下一篇文章“看到”你。
謝謝閱讀!
機器學(xué)習(xí) 數(shù)據(jù)科學(xué) 線性回歸 統(tǒng)計
原文地址:https://medium.com/towards-data-science/simple-and-multiple-linear-regression-in-python-c928425168f9