監督學習 | 線性迴歸 之多元線性迴歸原理及Sklearn實現


相關文章:

機器學習 | 目錄

機器學習 | 迴歸評估指標

監督學習 | 非線性迴歸 之多項式迴歸原理及Sklearn實現

監督學習 | 線性迴歸 之正則線性模型原理及Sklearn實現

監督學習 | 線性分類 之Logistic迴歸原理及Sklearn實現

1. 線性迴歸

線性迴歸,又稱普通最小二乘法(Ordinary Least Squares, OLS),是迴歸問題最簡單也最經典的線性方法。線性迴歸需按照參數 w 和 b,使得對訓練集的預測值與真實的迴歸目標值 y 之間的均方誤差(MSE)最小。

均方誤差(Mean Squared Error)是預測值與真實值之差的平方和除以樣本數。

線性迴歸沒有參數,這是一個優點,但也因此無法控制模型的複雜度。

1.1 基本形式

線性迴歸預測模型:

(1)f(x)=w1x1+w2x2++wnxn+bf(x)=w_1 x_1 + w_2 x_2 + \cdot \cdot \cdot + w_n x_n + b \tag{1}

  • f(x)f(x) 是預測值

  • nn 是特徵的數量

  • xix_i 是第 ii 個特徵值

  • 偏置項 bb 以及特徵權重 w1,w2,,wnw_1, w_2,\cdot \cdot \cdot ,w_n

這可以用更爲簡介的向量化表示。

線性迴歸預測模型(向量化):

(2)f(x)=wTx+b=θTx \begin{aligned} f(x) &= w^T \cdot x + b \\ &= \theta^T \cdot x \\ \end{aligned}\tag{2}

  • w=(w1;w2;...;wn)w=(w_1;w_2;...;w_n)

  • wwbb 學習得到,模型就得以確定

  • θ=(w;b)\theta=(w;b)

1.2 成本函數

在線性迴歸中,我們選擇 MSE(均方誤差)作爲其成本函數(Cost Function),其原因在與:首先它是一個凸函數,其次是因爲它是可導的,這兩個條件決定了可以利用梯度下降法來求得 θ\theta 的最小值。

2. w 的計算方式

關於 ww 的計算,有兩種方法,一種是利用最小二乘法最小化 MSE 導出 ww 的計算公式(標準方程);另一種是利用梯度下降法找出 MSE 的最小值。

首先來看最小利用最小二乘法計算 ww 的公式。

利用最小二乘法最小化成本函數 ,可以得出 θ\theta 的計算方程(標準方程):[1]

(3)θ^=(XTX)(1)XTy\hat{\theta} = (X^T \cdot X)^{(-1)} \cdot X^T \cdot y \tag{3}

  • θ^\hat{\theta} 是使成本函數 MSE 最小化的 θ\theta

  • yy 是包含 y(1)y^{(1)}y(m)y^{(m)} 的目標值向量

則最終學得的多元線性迴歸模型爲:

(4)f(xˉi)=xˉiθT=xˉi(XTX)1XTy \begin{aligned} f(\bar{x}_i) &= \bar{x}_i \cdot \theta^T \\ &= \bar{x}_i\cdot(X^TX)^{-1}X^Ty\\ \end{aligned}\tag{4}

其中:xˉi=(xi;1)\bar{x}_i=(x_i;1)

推導過程如下:

2.1 標準方程法

2.1.1 普通形式

標準方程法,又稱標準最小二乘法,即通過最小二乘法求出 wwbb 或向量形式下的 θ\theta,由最小二乘法導出的 θ\theta 計算公式稱爲標準方程。

首先來推導普通形式下 wwbb 的計算公式。

線性迴歸試圖學得:

(5)f(xi)=wxi+b,使f(xi)yif(x_i)=wx_i+b, 使得 f(x_i)\simeq y_i \tag{5}

如何確定 wwbb 呢?關鍵在於如何衡量 f(x)f(x)yy 之間的差別。

回想一下,訓練模型就是設置模型參數知道模型最適應訓練集的過程。要達到這個目的,我們首先需要知道怎麼衡量模型對訓練數據的擬合程度是好還是差,在 機器學習 | 迴歸評估指標 裏,我們瞭解到迴歸模型最常見的性能指標有均方誤差(MSE)。因此以 MSE 爲線性迴歸模型的成本函數,在訓練線性迴歸模型時,我們需要找到最小化 MSE 的 wwww^*,即:

(6)(w,b)=argmin(w,b)i=1m(f(xi)yi)2=argmin(w,b)i=1m(yiwxib)2 \begin{aligned} (w^*,b^*) &= \mathop{\arg\min}\limits_{(w,b)}\sum_{i=1}^m(f(x_i)-y_i)^2 \\ &= \mathop{\arg\min}\limits_{(w,b)}\sum_{i=1}^m(y_i-wx_i-b)^2 \\ \end{aligned} \tag{6}

均方誤差有非常好的幾何意義,它對應了常用的歐幾里得距離(或簡稱歐氏距離,Euclidean distance),基於均方誤差最小化來進行模型求解的方法稱爲“最小二乘法”(least square method),在線性迴歸中,最小二乘法就是試圖找出一條直線,使得所有樣本到線上的歐氏距離之和最小。

求解 wwbb 使得 E(w,b)=i=1m(yiwxib)2E_{(w,b)}=\sum_{i=1}^m(y_i-wx_i-b)^2 最小化的過程,稱爲線性迴歸模型的最小二乘“參數估計”(parameter estimation),我們可以將E(w,b)E_{(w,b)} 分別對 wwbb 求偏導,得到:[2]

(7)E(w,b)w=2(wi=1mxi2i=1m(yib)xi)\frac{\partial E_{(w,b)}}{\partial w} = 2\bigg(w\sum_{i=1}^m x_i^2 - \sum_{i=1}^m(y_i-b)x_i \bigg) \tag{7}
(9)E(w,b)b=2(mbi=1m(yiwxi))\frac{\partial E_{(w,b)}}{\partial b} = 2\bigg(mb - \sum_{i=1}^m(y_i-wx_i)\bigg) \tag{9}

然後令公式 (8)、(9) 爲零可以得到 wwbb 最優解的閉式(closed-form)解:

(10)w=i=1myi(xixˉ)i=1mxi21m(i=1mxi)2w = \frac{\sum_{i=1}^my_i(x_i-\bar{x})}{\sum_{i=1}^mx_i^2 - \frac{1}{m}\big(\sum_{i=1}^m x^i\big)^2} \tag{10}
(11)b=1mi=1m(yiwxi)b = \frac{1}{m}\sum_{i=1}^m(y_i-wx_i) \tag{11}

2.1.2 向量形式

更一般的情形是對如有 nn 個屬性的數據集 DD ,這時我們試圖學得:

(12)f(xi)=wTxi+b,使f(xi)yif(x_i)=w^Tx_i+b, 使得 f(x_i)\simeq y_i \tag{12}

這稱爲多元線性迴歸(multivariate linear regression).

類似的,可利用最小二乘法對 wwbb 進行估計。爲便於討論,我們吧 wwbb 轉換爲向量形式 θ=(w;b)\theta = (w;b),即:

(13)f(xi)=wTxi+b=θTxi \begin{aligned} f(x_i) &= w^T \cdot x_i + b \\ &= \theta^T \cdot x_i \\ \end{aligned}\tag{13}

相應的,把數據集 DD 表示爲一個 m×(d+1)m \times (d+1) 大小的矩陣 XX,其中每行對應與一個示例,該行前 dd 個元素對應與示例的 dd 個屬性值,最後一個元素恆爲 1,即:

(14)X=(x11x12x1n1x21x22 x2n1 xm1xm2xmn1)=(x1nT1x2nT1xmT1) X = \left( \begin{array}{cc} x_{11} & x_{12} & \cdots& x_{1n} & 1\\ x_{21} & x_{22} & \cdots\ & x_{2n} & 1\\ \vdots & \vdots & \ddots\ & \vdots & \vdots\\ x_{m1} & x_{m2} & \cdots& x_{mn} & 1\\ \end{array} \right) =\left( \begin{array}{cc} x_{1n}^T & 1\\ x_{2n}^T & 1\\ \vdots & \vdots\\ x_{m}^T & 1\\ \end{array} \right)\tag{14}

再把標記也寫成向量形式 y=(y1;y2; ;ym)y=(y_1;y_2;\cdots;y_m),類似於公式 (7) ,有:

(15)θ^=argminθ(yXθ)T(yXθ)\hat{\theta} = \mathop{\arg\min}\limits_{\theta}(y-X\theta)^T(y-X\theta)\tag{15}

Eθ=(yXθ)T(yXθ)E_{\theta}=(y-X\theta)^T(y-X\theta) ,對 θ\theta 求導得到:

(16)dEθdθ=2XT(Xθy)\frac{dE_{\theta}}{d\theta}=2X^T(X\theta-y)\tag{16}

令上式爲零可得 θ\theta 的最優解的閉式接,但由於涉及矩陣逆的計算,比單變量情形要複雜一些,下面我們做一個簡單的討論。

XTXX^TX 爲滿秩矩陣(full-rank matrix)或正定矩陣(positive definite matrix)時,令公式 (15) 爲零可得標準方程

(16)θ^=(XTX)1XTy\hat{\theta}=(X^TX)^{-1}X^Ty \tag{16}

其中 (XTX)1(X^TX)^{-1} 是矩陣 (XTX)(X^TX) 的逆矩陣,令 xˉi=(xi,1)\bar{x}_i=(x_i,1) ,則最終學得的多元線性迴歸模型爲:

KaTeX parse error: No such environment: align* at position 9: \begin{̲a̲l̲i̲g̲n̲*̲}̲ f(\bar{x}…

2.1.3 Python 實現

我們利用 Python 簡單實現一下 θ\theta 以及迴歸方程的計算,首先方程 y=4+3×xy=4+3\times x生成 100 個數據點並可視化:

import numpy as np
import matplotlib.pyplot as plt

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

plt.plot(X, y, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.show()
<Figure size 640x480 with 1 Axes>

接着我們利用公式 (16) 來計算 θ\theta

X_b = np.c_[np.ones((100, 1)), X]  # 向量形式下 x 的輸入爲 (x, 1)
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
theta
array([[4.10499602],
       [2.78527083]])

我們用區間的首尾兩個點(x=0 和 x=2)來畫出擬合直線。計算出 θ\theta 之後就可以利用公式 (17) 來計算兩個點的的預測數據 y_predict :

X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]  # add x0 = 1 to each instance
y_predict = X_new_b.dot(theta)
y_predict

plt.plot(X_new, y_predict, "r-")
plt.plot(X, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()

2.1.4 計算複雜度

標準方程需對矩陣 (XTX)(X^TX) 求逆,這是一個 n×nn \times n的矩陣( nn 是特徵數量)。對這種矩陣求逆計算複雜度通常爲 O(n2.4)O(n^{2.4})O(n3)O(n^{3}) 之間(取決於計算實現)。換句話說,如果將特徵數量翻倍,那麼計算時間將乘以大約 22.4=5.32^{2.4}=5.3 倍到 23=82^{3}=8 倍之間。[3]

特徵數量較大時(例如 100 000)時,標準方程的計算將極其緩慢

好的一面是,相對於訓練集中的實例數量 O(m)O(m) 來說,方程式線性的,所以能夠有效的處理大量的訓練集,只要內存足夠。

同樣,線性迴歸模型一經訓練(不論是標準方程還是其他算法),預測就非常快速,因爲計算複雜度相對於想要預測的實例數量和特徵數量來說,都是線性的。換句話說,對兩倍的實例(或者是兩倍的特徵數)進行預測,大概需要兩倍的時間。因此,我們來看看其他的優化算法:梯度下降算法。

2.2 梯度下降法

2.2.1 梯度下降原理

關於梯度下降法的推導及 Python 實現,請參考我的另一片文章:機器學習 | 梯度下降原理及Python實現

2.2.2 Python 實現

機器學習 | 梯度下降原理及Python實現

3. Sklearn 實現

我們將使用線性迴歸根據體質指數 (BMI) 預測預期壽命。

對於線性模型,我們將使用 sklearn.linear_model.LinearRegression 類(Sklearn 官方文檔)。

我們將使用線性迴歸模型對數據進行擬合併畫出擬合直線。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

bmi_life_data = pd.read_csv("data/bmi_and_life_expectancy.csv")

bmi_life_model = LinearRegression()
bmi_life_model.fit(bmi_life_data[['BMI']], bmi_life_data[['BMI']])

y_1 = bmi_life_model.predict(np.array(min(bmi_life_data['BMI'])).reshape(-1,1))
y_2 = bmi_life_model.predict(np.array(max(bmi_life_data['BMI'])).reshape(-1,1))

y_1 = y_1.tolist()
y_1 = [y for x in y_1 for y in x]

y_2 = y_2.tolist()
y_2 = [y for x in y_2 for y in x]

plt.plot(bmi_life_data['BMI'], bmi_life_data['BMI'], 'b.')
plt.plot([min(bmi_life_data['BMI']), max(bmi_life_data['BMI'])], [y_1, y_2], "r-")
plt.xlabel("BMI")
plt.ylabel('life_expectancy')
plt.show()

參考資料

[1] 周志華. 機器學習[M]. 北京: 清華大學出版社, 2016: 53-56

[2] Aurelien Geron, 王靜源, 賈瑋, 邊蕤, 邱俊濤. 機器學習實戰:基於 Scikit-Learn 和 TensorFlow[M]. 北京: 機械工業出版社, 2018: 103-106.

[3] Aurelien Geron, 王靜源, 賈瑋, 邊蕤, 邱俊濤. 機器學習實戰:基於 Scikit-Learn 和 TensorFlow[M]. 北京: 機械工業出版社, 2018: 106-107.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章