《兩日算法系列》之第一篇:線性迴歸



寫在前面的話

剛巧不巧,參加了DataWhale的四月學習計劃,然後就有了這個系列

兩天一個算法,是小組規定的時間計劃,不幸的是,只有5個算法計劃,而且還有兩個算法已經出現在我的大話系列中,大話系列目前已經懟完了這些算法:決策樹、貝葉斯、SVM、Adaboost。所以這個系列可能很快就結束了,回過頭我們在繼續大話系列,這個暫且當做一個學習筆記。

今天開始第一篇:線性迴歸


1.線性迴歸

1.1. 從方程說起

說起線性迴歸,你可能不太理解是什麼東西,但我要是說一元一次方程你瞬間就知道是啥。

一元一次方程 y=ax+b中,指的是未知數的個數(即x),指的是未知數的最大冪數(即x的幾次方)

那麼迴歸也就是針對輸入變量x和輸出變量y之間的一個映射,線性迴歸的映射呈線性分佈,相對的還有一個邏輯迴歸,下節再說它。

在線性迴歸中,如果只有一個自變量,我們稱之爲一元線性迴歸,如果有兩個及以上的自變量,我們稱之爲多元線性迴歸,就好比區分一元方程和多元方程 一樣。


1.2. 線性迴歸

根據方程我們可以直接寫出線性迴歸的一般公式:
H(θ0,θ1...θn)=θ0+θ1x1+...+θnxn H(\theta_0,\theta_1...\theta_n)=\theta_0+\theta_1x_1+...+\theta_nx_n
這個公式可以直接寫成向量的形式:
H(θ)=θTX H(\theta)=\theta^T\mathbf{X}
其中加粗的X表示向量,θ的轉置用θ^T表示,先記住上面這個公式,我們這會還用不到


1.3. 一元線性迴歸

通過上面的公式,我們可以直接寫出一元線性迴歸的一般公式:
H(θ0,θ1)=θ0+θ1x1 H(\theta_0,\theta_1)=\theta_0+\theta_1x_1
也就相當於一元一次方程y=ax+b。在一元一次方程中,求解關鍵是計算出a和b的值,同理在一元線性迴歸中我們也需要求解出θ的值(這裏包括θ0和θ1)

ok,相關的概念你都明白了,來看張圖:

文章首發:公衆號『知秋小一』

現在有許多藍色的數據點(每個點對應x,y),這個時候的線性迴歸方程如何求解?

我們知道,一元線性迴歸其實就是找到一條直線,但是這個圖中我們可以找到的不止一條直線,那麼對應的問題來了,如何找到最優的一條直線?

先假設我們已經找到了這條直線,那麼在上面圖中,針對橫座標x,縱座標y的每個點(xi,yi)最終形成了這樣一條直線 :

文章首發:公衆號『知秋小一』

每個點都會與最終的直線存在些許距離(誤差),同時這個距離是最小的距離,所以這個直線就是最優的直線

如何計算距離呢?

每個點和直線的距離應該這樣計算:
d=yi(axi+b) d = |y_i-(ax_i+b)|
爲了簡單方便我們可以直接將絕對值轉化爲平方,這個時候整體數據的誤差:
Loss=1Ni=1N(yi(axi+b))2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2
ok,這就是一元線性迴歸的誤差方程,我們的目的就是求得a和b,使得Loss最小。

怎麼求解這個a和b,我們等會再說,先來看看多元線性迴歸

1.4. 多元線性迴歸

前面我們已經寫出了線性迴歸的表達式:
H(θ)=θTX H(\theta)=\theta^T\mathbf{X}
假如現在是一個三元線性迴歸,相應的:
X=[x11x12x13x21x22x23x31x32x33],  y=[y1y2x3] X = \begin {bmatrix}x_{11} & x_{12} & x_{13} \\ x_{21} & x_{22} & x_{23}\\ x_{31} & x_{32} & x_{33}\\ \end{bmatrix}, \,\, y=\begin {bmatrix}y_1\\y_2\\x_3\\ \end{bmatrix}
同時,迴歸係數θ:
θ=[θ1θ2θ3] \theta=\begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix}
對於給定的數據x1,也就是就成真的第一列數據,預測結果u1:
u1=[x11x21x31]T[θ1θ2θ3] u_1 = \begin {bmatrix}x_{11} \\ x_{21}\\ x_{31}\\ \end{bmatrix}^T * \begin {bmatrix}\theta_1\\\theta_2\\\theta_3\\ \end{bmatrix}
所以,我們多元線性迴歸的誤差也可以寫成:
Loss=1Ni=1N(yixiTθ)2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2


2. 線性迴歸學習策略

在線性迴歸的模型建立過程中,有一些學習策略需要學習,但是這個學習策略不光是線性迴歸獨有的,在其他迴歸模型上同樣適用。

提前說兩個名詞,大家瞭解一下

經驗風險:通過歷史數據(訓練集)得知模型對單個樣本點的預測,並計算關於訓練集的平均損失稱作經驗風險

結構風險:當經驗風險越小的時候,也就是模型對訓練數據完美擬合的時候(過擬合),我們需要增加一些懲罰機制避免過擬合現象,即經驗風險+正則懲罰,這個時候稱爲結構風險

ok,可能你看的雲裏霧裏,來一張圖醒醒神

文章首發:公衆號『知秋小一』

上面三個圖的函數依次爲f1(x),f2(x),f3(x)f_1(x),f_2(x),f_3(x),真實Price記爲YY

給定一個xx,三個函數都會輸出一個f(x)f(x),但是輸出的結果不一定就與真實值相等,於是我們就需要一個函數去度量擬合的好壞,比如:
L(Y,f(x))=(Yf(x))2 L(Y,f(x)) = (Y-f(x))^2
這個函數稱爲損失函數,當損失函數越小,代表模型擬合的越好。

同時,根據上面的經驗風險的概念,此時的經驗風險爲:
1Ni=1N(L(yi,f(xi))) \frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i)))
經驗風險是針對整個模型數據集的,所以此時我們的目標就變成了如果使得經驗風險最小化。

問題來了,上面圖三經驗風險最小,但是我們卻不會用它

因爲它的模型結構太複雜,產生了過擬合,我們需要增加一個函數來度量模型的複雜度——正則化

根據上面的概念,此時結構風險=經驗風險+正則懲罰,即:
1Ni=1N(L(yi,f(xi)))+λJ(θ) \frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)
經驗風險和結構風險都是針對整個數據集的,此時我們的目標變成了結構風險最小化+結構風險最小化,對應目標函數:
min1Ni=1N(L(yi,f(xi)))+λJ(θ) min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)

完事,總結一下

2.1 損失函數

損失函數:度量單樣本預測的錯誤程度。損失函數越小,模型越好

常用的損失函數包括:絕對損失函數、平方損失函數、對數損失函數等

2.2. 代價函數

代價函數:度量全部樣本集的平局誤差。

常見的代價函數包括:均方誤差、平均絕對誤差、均方根誤差等

2.3. 目標函數

目標函數:代價函數+正則化函數,有時候只有前半部分

模型最終的目標一定是:不僅要經驗風險最小化,還要結構風險最小化


3. 算法求解

我們已經知道最終的優化目標:目標函數最小化。

通過求解目標函數計算出相應的參數值,從而最終得到我們的最優模型。

現在我們的目標函數是:
min1Ni=1N(L(yi,f(xi)))+λJ(θ) min\frac{1}{N}\sum_{i=1}^N(L(y_i,f(x_i))) + \lambda J(\theta)
拋開後面的正則化先不說,我們需要計算前半部分,先將前半部分寫成我們能看懂的形式:
Loss=1Ni=1N(yixiTθ)2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2
這不就是求解一個方程的極小值問題嘛,ok,來搞

3.1 最小二乘法

最小二乘法又叫最小平方法,主要思想就是選擇未知參數,使得理論值與觀測值之差的平方和達到最小

就像在上面定義的損失函數一樣,就是通過最小二乘思想使得誤差最小。

問題來了,如何求解最小誤差對應的未知參數?

從單變量和多變量分別來說一下吧:

先來看單變量的最小二乘法求解

單變量下,我們的假設函數是y=ax+b,此時對應的損失函數爲:
Loss=1Ni=1N(yi(axi+b))2) Loss = \frac{1}{N}\sum_{i=1}^N(y_i-(ax_i+b))^2)
我們的目標是通過找出合適的a、b使得Loss 最小(常數N可以先不考慮),這個時候可以直接用求極值的方法。

將Loss函數對a、b分別求偏導,並使得偏導結果爲0,解出此時a、b的值,即爲我們的參數目標值:
{La=2i=1N(yi(axi+b))(xi)Lb=2i=1N(yi(axi+b))(1)La=Lb=0 \begin{cases}\frac{\partial L}{\partial a}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-x_i) \\\frac{\partial L}{\partial b}= 2 \sum_{i=1}^N(y_i-(ax_i+b))(-1) \\\frac{\partial L}{\partial a} = \frac{\partial L}{\partial b} = 0\end{cases}
通過上面的方程組我們可以解得a、b的值,帶入到原方程中即可求解

再來看多變量的最小二乘法求解

此時我們的損失函數變成了:
Loss=1Ni=1N(yixiTθ)2 Loss = \frac{1}{N}\sum_{i=1}^N(y_i-x_i^T\theta)^2
這個可以寫成矩陣的形式:
Loss=1N(YXθ)T(YXθ) Loss = \frac{1}{N}(Y-X\theta)^T(Y-X\theta)
同樣的我們求參數θ(此時的θ是個向量,常數N暫不考慮)求偏導,並使得偏導結果爲0
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split} \…
在這裏插入圖片描述
這樣我們也通過矩陣運算求解出θ的值,對應的損失函數也就確定了。


3.2. 梯度下降法

梯度的本意是一個向量,表示某一函數在該點處的方向導數沿着該方向取得最大值。也就是函數在該點處沿着該方向變化最快。

從數學上的角度來看,梯度的方向是函數增長速度最快的方向,那麼梯度的反方向就是函數減少最快的方向。那麼,如果想計算一個函數的最小值,就可以使用梯度下降法的思想來做。

應用在我們的目標函數中,我們需要算出每個點下降最快的方向,然後使其在該方向上下降到下一個點,然後更新下降最快的方向,重複步驟直到下降到底

考慮一個問題,某一點的梯度怎麼算?

對該點進行求偏導,算出該點的梯度的值。

同樣的,我們從單變量和多變量分別來說一下吧:

先來看單變量的梯度下降法求解

在最下二乘法中,我們通過求偏導計算出a、b取偏導的結果La, Lb\frac{\partial L}{\partial a} , \ \frac{\partial L}{\partial b}

在梯度下降法中,我們需要計算在某一點對a、b的偏導,也就是Lai, Lbi\frac{\partial L}{\partial a_i} , \ \frac{\partial L}{\partial b_i},同樣的在該點會存在一個參數 α,它表示在梯度方向前進的步長,綜合一下,在某一點參數a、b的更新爲
{ai=aiαLaibi=biαLbi \begin{cases}a_i = a_i-\alpha \frac{\partial L}{\partial a_i}\\b_i = b_i-\alpha \frac{\partial L}{\partial b_i}\\\end{cases}
所以梯度下降的更新可以表示成這樣一個表達式:
θi=θiαL(θ)θi \theta_i = \theta_i-\alpha \frac{\partial L(\theta)}{\partial \theta_i}
至於每一個點對a、b求偏導,在最小二乘法裏面已經計算過了,不妨回過頭去看一眼。

另外:往深的想一下,梯度下降法認爲每一步的最優解合併起來就是最終的最優解,這樣會導致最終結果可能並不是全局最優解

再來看多變量的梯度下降法求解

由於在多變量中我們的目標函數發生了變化,相應的對於梯度下降的更新也會發生變化
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split}&L…

在這裏插入圖片描述
忽略掉常數,我們可以得到:
θ=θα(yixiTθ)xi \theta = \theta-\alpha ·(y_i-x_i^T\theta)· x_i
ok,求解出未知參數的值,我們的目標函數也就確定了

3.3. 正則項

上面我們留了一個問題:正則項

正則項的目的是通過對最小二乘估計加入懲罰約束,使某些係數的估計非常小或爲0,可以有效的解決函數的過擬合問題

在線性迴歸中,一般有這兩種正則化:

  • L1正則化(Lasso迴歸):稀疏化模型參數
  • L2正則化(Rideg/嶺迴歸):縮小模型參數

(好像又挖了個坑,後面再填吧,這個瞭解一下就行了)


4. 線性迴歸的評估指標

通過前面的內容,我們成功的對數據進行了預測,那到底預測的準不準?有多準?就需要用到這些評估指標了

在線性迴歸中常用的的評估指標有四種,分別是:

  • 均方誤差MSE(Mean Squared Error)
  • 均方根誤差RMSE(Root Mean Squared Error)
  • 平均絕對值誤差MAE(Mean Absolute Error)
  • R Squared

四種評估指標中最常用的第四種,每種的計算方式分別如下:

4.1. 均方誤差MSE

1mi=1m(yiy^i)2 \frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2

MSE的值越小,說明預測模型的精確度越高

4.2. 均方根誤差RMSE

1mi=1m(yiy^i)2 \sqrt{\frac{1}{m}\sum_{i=1}^m(y^{i}-\hat y^{i})^2}

相當於對MSE開根號,同越小越好

4.3. 平均絕對值誤差MAE

1mi=1myiy^i \frac{1}{m}\sum_{i=1}^m|y^{i}-\hat y^{i}|

效果同上

4.4. R Squared誤差

R2=1i=1m(yiy^i)2i=1m(yy^i)2 R^2 = 1- \frac{\sum_{i=1}^m(y^{i}-\hat y^{i})^2}{\sum_{i=1}^m(\overline y-\hat y^{i})^2}

不同的是,這個的R^2越大越好,最大值爲1,表示模型準確率最高;當<0是,說明數據可能不存在線性關係,需要注意

在sklearnz中最常用的方法是R Squared方法。


4.5. 代碼實現
def mean_squared_error(y_true, y_predict):
    """計算y_true和y_predict之間的MSE"""
    assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
 
    return np.sum((y_true - y_predict)**2) / len(y_true)
 
 
def root_mean_squared_error(y_true, y_predict):
    """計算y_true和y_predict之間的RMSE"""
 
    return sqrt(mean_squared_error(y_true, y_predict))
 
 
def mean_absolute_error(y_true, y_predict):
    """計算y_true和y_predict之間的RMSE"""
    assert len(y_true) == len(y_predict), "the size of y_true must be equal to the size of y_predict"
 
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)
 
 
def r2_score(y_true, y_predict):
    """計算y_true和y_predict之間的R Square"""
 
    return 1 - mean_squared_error(y_true, y_predict)/np.var(y_true)

5. 實戰項目

下節更新


寫在後面的話

稍稍總結一下,迴歸模型的目的是預測數值型的目標值,像諸如房價預測,年齡預測等等都可以通過迴歸模型去解決。

當然了你要說分類模型可以解決嗎?也可以的。不過各有所長,各有所短,醫生診斷病情都得對症下藥,我們解決問題也是要同樣的道理的


本想着把線性迴歸涉及到的內容都統統列出來,畢竟是迴歸模型的開篇,後面學習其他高級的模型也會簡單很多。

無奈坑實在太多(文中好多內容一筆帶過),而且恰好是周內工作日,時間有點倉促,就只能放在下一篇了。

後面還有邏輯迴歸,也想着趁機理一理,寫一寫,等做完線性迴歸的項目就開搞


我是小一,第一步的一,下節見!

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