[機器學習]迴歸--(Simple LR and Multiple LR)

線性迴歸是最貼近生活的數據模型之一node

簡單的線性迴歸

簡單的線性迴歸公式以下:python

figure 2.1

從公式中咱們能夠看出,簡單線性迴歸只有一個自變量x1,b1是自變量的係數,y是因變量。x1多是連續型或者離散型的數據,因此咱們須要經過x1找出最合適的係數b1從而獲得關於因變量y的曲線。ios

咱們下面用一個例子來講明,這是一個關於工做經驗與薪水之間關係的表格。分佈以下圖所示web


咱們很容易看出這是符合一個線性迴歸的模型,下面咱們就要作出迴歸的函數而且對將來數據進行預測。dom

# Importing the libraries
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('Salary_Data.csv')
X = dataset.iloc[:, :-1].values #除了最後一列的其餘列
y = dataset.iloc[:, 1].values   #第二列

# Splitting the dataset into the Training set and Test set
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)

下面咱們須要作的是經過訓練集的X_train與y_train 計算出符合訓練集的曲線,而後將測試集的X_test 帶入獲得的曲線中,獲得預測的結果y_pred,最後將預測結果y_pred與測試集中的y_test進行比較,看看是否符合分佈,從而肯定預測是否準確。函數

# Fitting Simple LinearRegression to the training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train,y_train) # 經過train集找到曲線

# 對測試集進行預測
y_pred = regressor.predict(X_test)

# visualising the Traning set results
plt.scatter(X_train, y_train, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience(Traning set)')
plt.xlabel('Year of Experience')
plt.ylabel('Salary')
plt.show()

經過學習咱們能夠獲得訓練曲線學習


下面咱們導入測試數據測試

plt.scatter(X_test, y_test, color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Salary vs Experience(Traning set)')
plt.xlabel('Year of Experience')
plt.ylabel('Salary')
plt.show()


這裏須要注意兩點spa

第一,在導入測試集時咱們依然使用訓練集獲得的曲線,因此咱們的plot函數中參數不便,固然若是你用測試集的數據應該也會獲得相同的曲線。3d

第二有的人以爲既然須要預測數據應該將y_test 替換成 y_pred。 其實不須要這樣的。由於咱們y_pred 上的點應該都是和曲線高度重合的


多重線性迴歸(Multiple Linear Regression)

多重線性迴歸將會不僅有一個自變量,而且每一個自變量擁有本身的係數且符合線性迴歸。

figure 2.7

在創建多重線性迴歸以前,有這麼幾個前提必需要注意一下,這些有助於你判斷數據是否適合使用多重線性迴歸:
1, 線性(linearity)
2, 同方差(Homoscedasticity)

3, 多元正態性(Multivariate normality)  

      多因素共同影響分佈結果

4, 錯誤的獨立性(independence of errors)

      每個變量產生的錯誤將會獨立的影響預測結果,不會對其餘變量產生影響

5, 多重共線性的缺少(lack of multicollinearity)

      變量之間存在高度相關關係而使得迴歸估算不許確,如接下來要提到的虛擬變量陷阱(dummy variable trap)有可能觸發多重共線性的問題


虛擬變量陷阱(Dummy variable trap)

在迴歸預測中咱們須要全部的數據都是numeric的,可是會有一些非numeric的數據,好比國家,省,部門,性別。這時候咱們須要設置虛擬變量(Dummy variable)。作法是將此變量中的每個值,衍生成爲新的變量,是設爲1,否設爲0.舉個例子,「性別"這個變量,咱們能夠虛擬出「男」和"女"兩虛擬變量,男性的話「男」值爲1,"女"值爲,;女性的話「男」值爲0,"女"值爲1。

可是要注意,這時候虛擬變量陷阱就出現了。就拿性別來講,其實一個虛擬變量就夠了,好比 1 的時候是「男」, 0 的時候是"非男",即爲女。若是設置兩個虛擬變量「男」和「女」,語義上來講沒有問題,能夠理解,可是在迴歸預測中會多出一個變量,多出的這個變量將會對迴歸預測結果產生影響。通常來講,若是虛擬變量要比實際變量的種類少一個。

因此在多重線性迴歸中,變量不是越多越好,而是選擇適合的變量。這樣纔會對結果準確預測。

創建模型

咱們能夠經過如下五個步驟創建迴歸模型:(stepwise Regression)

1, 確立全部的可能(變量all in)
創建全部的個模型包含全部可能的變量

2, 逆向消除(backward elimination)
(1)選擇一個差別等級(significance level)好比SL=0.05, 0.05 意味着此變量對結果有95%的貢獻。 P(A|B) = 0.05
(2)將全部的變量放進你的模型中。
(3)選擇P值最高的變量,若是P>SL。到第四步,不然結束,完成建模。關於變量P值,統計軟件能夠計算出並選擇最高P值的變量
(4)移除此變量,並從新進行第三步。


有關逆向消除和逐步迴歸的方法,能夠參考一下兩個連接:

Backward elimination and stepwise regression
Variable Selection

3, 正向選擇(forward selection)
(1)選擇一個差別等級(significance level)好比SL=0.05
(2)創建全部的簡單迴歸的模型,並找到最小的P值
(3)確立一個簡單模型,並將擁有最小P值的變量加入此模型
(4)若是P>SL,模型創建成功,不然在進行第三步

4,雙向消除(bidirectionnal elimination)
同時進行逆向消除和正向選擇。

*全部可能的模型:意思是全部變量排列組合成的模型,若是有N個變量,那麼一共會有2的N次方個模型(2^N-1)
在R語言中,每個變量後面會用星號表示此變量對迴歸模型的影響,星號越多越重要。

Stepwise Regression 這是賓夕法尼亞州立大學的講解。我以爲挺不錯的
另外,其實這幾步不是很難,關鍵的一點是SL值的肯定。還有就是P值的生成。

如何計算P值(p-value)

figure 2.8

假定有兩組人羣,一組x=0,另外一組x=1。從兩組中各隨機抽取2個個體,測量Y
的值,如圖所示,看看這兩組的Y是否相同?
如今各組再多抽取若干個體,數據如圖所示,能夠計算各組的均數,這兩個均
數不在同一條線上,這是從所抽取的樣本中估計出來的。從樣本中獲得的兩個
均數不等於兩組整體的均數,從樣本中獲得的兩均數距離不等於兩個整體均數
的差,t 檢驗是根據兩樣本均數及兩樣本的標準差,計算若是兩整體均數相同的
話,抽樣獲得兩樣本均數差達如此之大或更大的可能性多大,就是p 值,p值
<0.05,表示二者之間的距離顯著。
如今看回歸分析,創建迴歸方程如上所示。從方程中看,當x=0時,Y=β0;當x=1
時,Y=β0 + β1。所以,β0表示X=0組Y的均數,β1表示X=1組Y的均數與X=0組Y的均
數的差,ei是每一個個體與其所在組均數的差。所以迴歸方程對β1= 0 的檢驗等同
於t檢驗兩組均數的比較。

用Python進行操做

咱們可使用以前創建的模板,將數據導入。

今天咱們使用一個多變量對商業profit影響的數據集。


在此數據集中,咱們肯定前四個變量 X(R&D Speed, Administration, Marketing Speed, State)爲自變量。

最後一個profit爲因變量 y。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values

因爲數據中包含state變量,咱們用虛擬變量代替

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder = LabelEncoder()
X[:, 3] = labelencoder.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()

figure 2.10

#爲了不虛擬變量陷阱
X = X[:, 1:] #從1 開始,並不是0


將數據集分爲訓練集和測試集,咱們選擇test size爲0.2(4:1)

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

多重線性迴歸:

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

獲得預測結果:

y_pred = regressor.predict(X_test)

咱們比較一下預測結果(y_pred)和實際結果(y_test)中的差別

figure 2.11

 


其實不少結果仍是很接近的。

這樣咱們就完成了多元線性迴歸的建模過程。其實咱們與簡單線性迴歸比較一下,代碼徹底相同.

因此在sklearn的線性迴歸庫中沒有簡單或者多元的區分。可是多元線性迴歸很難用圖像表示,由於包含多個自變量。

相關文章
相關標籤/搜索