1. 程式人生 > >機器學習入坑指南(三):簡單線性迴歸

機器學習入坑指南(三):簡單線性迴歸

學習了「資料預處理」之後,讓我們一起來實現第一個預測模型——簡單線性迴歸模型。

一、理解原理

簡單線性迴歸是我們接觸最早,最常見的統計學分析模型之一。

假定自變數 xx與因變數 yy 線性相關,我們可以根據一系列已知的 (x,y)(x,y) 資料,通過某種方法,擬合出一條直線 $ y = b_0 + b_1x$,並利用這條直線預測 yy 的值 。這種方法就叫作簡單線性迴歸。

那麼我們該如何去擬合出這條直線,才能使預測的結果最準確呢?

常用的方法是最小二乘法

最小二乘法

課本上關於最小二乘法的概念困擾了我許久,後來無意中看到了它的英文——
Least Squares Method(LSM),平方…二乘…嗯,沒毛病。

沿用這個名稱可以理解,算是一種情懷或是傳承,但是我想說一個事物的名稱真的很重要,一個不恰當的名字會徒增很多理解上的負擔。(比如區塊鏈,取這麼個名字就沒想讓一般群眾理解,我第一次看見這個名字時的感覺就是不知所云)

不吐槽了,最小二乘法,或者按我的翻譯——平方和最小法,就是使得已知的 yiy_i 值與通過模型預測得到的 ypy_p 之間的差值的平方之和
Sum(yiyp)2 Sum(y_i - y_p)^2
最小。一般我們取Sum\sqrt{Sum}來表示 (xi,yi)(x_i,y_i)(xi,yp)(x_i,y_p)

xi,yp)之間的距離之和。

根據這個條件,我們可以求出直線的截距 b0b_0 和斜率 b1b_1,得到我們所需的線性模型。對求解過程有興趣的同學可以參考 CSDN - 普通最小二乘法的推導證明,當然,對 Python 來說,我們可以不關注具體實現的方式而直接去利用封裝好的模型。時間和精力有限的同學跟著往下走就好。

梯度下降法 *

對於簡單線性迴歸,我們可以使用解析的方法求出引數,但對於廣義的、多元的線性迴歸以及非線性的問題,使用解析法是低效的甚至是無效的。

考慮到計算機能夠進行大量重複計算,實際上我們通常使用迭代的方法來求得引數。所謂迭代,即按照一定的步長逐個取引數值,並按某種原則(如最小二乘)評估用這些值進行擬合的合理性,最終選取最合適的引數值。

梯度下降法是一種常見的迭代方法,解決了當有多個自變數(特徵)時往什麼方向(選取什麼方向的特徵向量)迭代能夠使函式值最終收斂到最小值的問題。

實際上,在輸入特徵較多的情況下,使用迭代法所需的計算量將遠遠小於解析法。

關於如何理解梯度下降法及其數學原理,參見我的文章「如何理解梯度下降法」

二、程式碼實現

之前,我們搭建好了進行資料分析所需的 Python 環境(還沒有搭建好的同學可以參考我的文章「機器學習入坑指南(一):Python 環境搭建」), 接下來,我們將實現簡單線性迴歸模型。 建議大家和我一樣使用 Jupyter Notebook,在後面你會更深刻地感受到它的魅力。

1 資料預處理

第一步當然就是上一篇文章講解的資料預處理啦,程式碼如下:

# 匯入需要的庫
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 讀取資料
dataset = pd.read_csv('studentscores.csv')
X = dataset.iloc[ : ,   : 1 ].values
Y = dataset.iloc[ : , 1 ].values
# 分割資料
from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X, Y, test_size = 1/4, random_state = 0)

2 用訓練集擬合簡單線性迴歸模型

sklearn 庫為我們提供了許多常用的數學模型,極大地簡化了我們進行資料分析的步驟。我們首先匯入線性迴歸模型:

from sklearn.linear_model import LinearRegression

然後,用訓練集的資料去訓練(擬合)模型

regressor = LinearRegression()
regressor = regressor.fit(X_train, Y_train)

經過訓練後,regressor 便得到了擬合的結果,也就是直線的斜率和截距。

3 預測結果

接下來,我們使用擬合完的模型,根據測試集中的 X 值得到預測的 Y 值,這一步也非常簡潔:

Y_pred = regressor.predict(X_test)

4 視覺化

為了直觀地表達模型擬合的效果,我們對上面的資料分析結果進行視覺化。

還記得第一步中我們匯入的 matplotlib.pyplot 嗎?這是專門提供視覺化的一個模組,提供了 Matlab 風格的程式設計介面(呃,我並不擅長 Matlab)。

這裡我們使用它提供的兩個方法,一個是 scatter,用來畫點,另一個是 plot ,用來畫線。當然這只是簡單的用法,想進一步瞭解,參考 gitbooks - Pyplot 教程

訓練集視覺化

# 繪出資料點,用紅色表示
plt.scatter(X_train , Y_train, color = 'red')
# 繪出擬合的直線,用藍色表示
plt.plot(X_train , regressor.predict(X_train), color ='blue')
plt.show()

在 Jupyter Notebook 中輸入上面的程式碼,視覺化的結果如圖

測試集視覺化

同理,視覺化測試集,輸入以下程式碼

plt.scatter(X_test , Y_test, color = 'red')
plt.plot(X_test , regressor.predict(X_test), color ='blue')
plt.show()

結果如圖

注意雖然繪製直線時使用的引數不一樣,但直線是同一條直線,只是選取了不同的點。可以看出,預測的結果與實際的結果具有一定的一致性。

簡單線性迴歸適用於使用一元特徵來預測數值的情形。在下一篇文章裡,我們將討論多元線性迴歸