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

學習了「數據預處理」以後,讓咱們一塊兒來實現第一個預測模型——簡單線性迴歸模型。html

1、理解原理

簡單線性迴歸是咱們接觸最先,最多見的統計學分析模型之一。python

假定自變量 $x$與因變量 $y$ 線性相關,咱們能夠根據一系列已知的 $(x,y)$ 數據,經過某種方法,擬合出一條直線 $ y = b_0 + b_1x$,並利用這條直線預測 $y$ 的值 。這種方法就叫做簡單線性迴歸。git

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

經常使用的方法是最小二乘法編程

最小二乘法

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

沿用這個名稱能夠理解,算是一種情懷或是傳承,可是我想說一個事物的名稱真的很重要,一個不恰當的名字會徒增不少理解上的負擔。(好比區塊鏈,取這麼個名字就沒想讓通常羣衆理解,我第一次看見這個名字時的感受就是不知所云)機器學習

不吐槽了,最小二乘法,或者按個人翻譯——平方和最小法,就是使得咱們經過觀測獲得的,已知的 $y_i$ 值與經過線性模型預測獲得的 $y_p$ 之間的差值的平方之和
$$ Sum(y_i - y_p)^2 $$
最小。$\sqrt{Sum}$能夠看作是 $(x_i,y_i)$ 與 $(x_i,y_p)$之間的距離之和。以 $Sum$ 最小做爲評判依據顯然是比較科學的。ide

根據這個條件,咱們能夠求出直線的截距 $b_0$ 和斜率 $b_1$,獲得咱們所需的線性模型。對求解過程有興趣的同窗能夠參考 CSDN - 普通最小二乘法的推導證實,固然,對 Python 來講,咱們能夠不關注具體實現的方式而直接去利用封裝好的模型。時間和精力有限的同窗跟着往下走就好。函數

梯度降低法 *

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

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

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

關於如何理解梯度降低法及其數學原理,參見個人文章「如何理解梯度降低法」

2、代碼實現

以前,咱們搭建好了進行數據分析所需的 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)

示例數據地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasets

對這個過程不熟悉的,參考「機器學習入坑指南(二):數據預處理」

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

結果如圖

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

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

歡迎關注 Evan 的博客

相關文章
相關標籤/搜索