機器學習(二):線性迴歸(simple and multiple)

寫以前先聲明一下,https://steveli90.github.io 是個人我的github page,因此一樣的文章我會在這上邊先發。
原本我想機器學習系列用四到五篇文章結束,可是這一篇介紹迴歸的文章寫了剛寫了簡單線性迴歸和多元線性迴歸就已經很長了爲了讀者閱讀方便,我會分幾篇文章來介紹。
關於數據集(data set)我不會在這裏放出來,由於這個系列是介紹性質,主要是但願你們可以從總體理解什麼是機器學習以及機器學習的目的。之後我想建立一個實踐系列,放出一些好的例子來供你們練習。
大概還有兩週時間會結束這個系列,同時在其中我也會穿插偏向人工智能的深度學習(Deep Learning)中的迴歸與分類的內容,做爲深度學習系列的預先學習。node

好啦,言歸正傳,開始主要的內容。python

迴歸分析是一種預測性的建模技術,它研究的是因變量(目標)和自變量(預測器)之間的關係。這種技術一般用於預測分析,時間序列模型以及發現變量之間的因果關係。例如,司機的魯莽駕駛與道路交通事故數量之間的關係,最好的研究方法就是迴歸。
迴歸分析是建模和分析數據的重要工具。在這裏,咱們使用曲線/線來擬合這些數據點,在這種方式下,從曲線或線到數據點的距離差別最小。ios

有關線性迴歸的研究及代碼實現請參考個人另外一篇文章。git

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

簡單的線性迴歸

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

figure 2.1

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

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

figure 2.2

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

咱們用上一節寫過的模板來處理數據:工具

# 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 = 0.2, random_state = 0)

通常Python的library會自動進行feature scaling,因此咱們不須要本身動手。

咱們將數據按照4:1分爲訓練組和測試組兩部分。每一組分別包含自變量和因變量

figure 2.3

下面咱們須要作的是經過訓練集的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()

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

figure 2.4

下面咱們導入測試數據

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()

figure 2.5

這裏須要注意兩點,第一,在導入測試集時咱們依然使用訓練集獲得的曲線,因此咱們的plot函數中參數不便,固然若是你用測試集的數據應該也會獲得相同的曲線。
第二有的人以爲既然須要預測數據應該將y_test 替換成 y_pred。 其實不須要這樣的。由於咱們y_pred 上的點應該都是和曲線高度重合的,如圖:

figure 2.6

這樣一個簡單線性迴歸的機器學習功能就完成啦~~最後我貼出R語言實現的步驟。

# Simple Linear Regression

# Importing the dataset
dataset = read.csv('Salary_Data.csv')

# Splitting the dataset into the Training set and Test set
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Salary, SplitRatio = 2/3)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# Feature Scaling
# training_set = scale(training_set)
# test_set = scale(test_set)

# Fitting Simple Linear Regression to the Training set
regressor = lm(formula = Salary ~ YearsExperience,
               data = training_set)

# Predicting the Test set results
y_pred = predict(regressor, newdata = test_set)

# Visualising the Training set results
library(ggplot2)
ggplot() +
  geom_point(aes(x = training_set$YearsExperience, y = training_set$Salary),
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),
            colour = 'blue') +
  ggtitle('Salary vs Experience (Training set)') +
  xlab('Years of experience') +
  ylab('Salary')

# Visualising the Test set results
library(ggplot2)
ggplot() +
  geom_point(aes(x = test_set$YearsExperience, y = test_set$Salary),
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),
            colour = 'blue') +
  ggtitle('Salary vs Experience (Test set)') +
  xlab('Years of experience') +
  ylab('Salary')

多重線性迴歸(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和R進行操做

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

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

figure 2.9

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

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()
#爲了不虛擬變量陷阱
X = X[:, 1:] #從1 開始,並不是0

figure 2.10

將數據集分爲訓練集和測試集,咱們選擇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

plt.scatter(np.arange(10),y_test, color = 'red',label='y_test')
plt.scatter(np.arange(10),y_pred, color = 'blue',label='y_pred')
plt.legend(loc=2);
plt.show()

figure 2.12

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

這樣咱們就完成了多元線性迴歸的建模過程。其實咱們與簡單線性迴歸比較一下,代碼徹底相同,因此在sklearn的線性迴歸庫中沒有簡單或者多元的區分。可是多元線性迴歸很難用圖像表示,由於包含多個自變量。

下面是R的代碼,方法是同樣的,可是有些地方須要說明一下的:
首先建模代碼不難我就很少解釋了,其中咱們須要用到 caTools的庫,須要提早導入一下,

# 導入數據
dataset = read.csv('50_Startups.csv')

# 虛擬變量
dataset$State = factor(dataset$State,
                       levels = c('New York', 'California', 'Florida'),
                       labels = c(1, 2, 3))

# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Profit, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE) # 多自變量
test_set = subset(dataset, split == FALSE) # 單因變量

# 多重線性迴歸
regressor = lm(formula = Profit ~ .,
               data = training_set)

# 預測結果
y_pred = predict(regressor, newdata = test_set)

咱們執行一下summary(regressor) 來看看這個factor的結構:

figure 2.13

首先,R語言自動對虛擬變量進行了優化,因此咱們不須要擔憂虛擬變量陷阱的問題。

從圖中咱們能夠看出,RD Speed對結果影響很大,注意P值,只有RD Speed 是小於0.05的,其餘的都挺大的。因此RD Speed對結果貢獻很大。以後咱們就能夠移除其餘的保留這個。

Signif. codes 表示此變量對結果的significance level,也就是重要性有多大。

至此多元線性迴歸就結束了。

cite works:

陳常中:線性迴歸分析(http://www.empowerstats.com/m...

相關文章
相關標籤/搜索