學習了「數據預處理」以後,讓咱們一塊兒來實現第一個預測模型——簡單線性迴歸模型。html
簡單線性迴歸是咱們接觸最先,最多見的統計學分析模型之一。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 來講,咱們能夠不關注具體實現的方式而直接去利用封裝好的模型。時間和精力有限的同窗跟着往下走就好。函數
考慮到計算機可以進行大量重複計算,實際上咱們一般使用迭代的方法來求得參數。所謂迭代,即按照必定的步長逐個取參數值,並按某種原則(如最小二乘)評估用這些值進行擬合的合理性,最終選取最合適的參數值。學習
梯度降低法是一種常見的迭代方法,解決了當有多個自變量(特徵)時往什麼方向(選取什麼方向的特徵向量)迭代可以使函數值最終收斂到最小值的問題。
實際上,在輸入特徵較多的狀況下,使用迭代法所需的計算量將遠遠小於解析法。
關於如何理解梯度降低法及其數學原理,參見個人文章「如何理解梯度降低法」。
以前,咱們搭建好了進行數據分析所需的 Python 環境(尚未搭建好的同窗能夠參考個人文章「機器學習入坑指南(一):Python 環境搭建」), 接下來,咱們將實現簡單線性迴歸模型。 建議你們和我同樣使用 Jupyter Notebook,在後面你會更深入地感覺到它的魅力。
第一步固然就是上一篇文章講解的數據預處理啦,代碼以下:
# 導入須要的庫 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
對這個過程不熟悉的,參考「機器學習入坑指南(二):數據預處理」
sklearn 庫爲咱們提供了許多經常使用的數學模型,極大地簡化了咱們進行數據分析的步驟。咱們首先導入線性迴歸模型:
from sklearn.linear_model import LinearRegression
而後,用訓練集的數據去訓練(擬合)模型
regressor = LinearRegression() regressor = regressor.fit(X_train, Y_train)
通過訓練後,regressor
便獲得了擬合的結果,也就是直線的斜率和截距。
接下來,咱們使用擬合完的模型,根據測試集中的 X 值獲得預測的 Y 值,這一步也很是簡潔:
Y_pred = regressor.predict(X_test)
爲了直觀地表達模型擬合的效果,咱們對上面的數據分析結果進行可視化。
還記得第一步中咱們導入的 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 的博客