目錄
寫在前面的話
剛巧不巧,參加了DataWhale的四月學習計劃,然後就有了這個系列
兩天一個算法,是小組規定的時間計劃,不幸的是,只有5個算法計劃,而且還有兩個算法已經出現在我的大話系列中,大話系列目前已經懟完了這些算法:決策樹、貝葉斯、SVM、Adaboost。所以這個系列可能很快就結束了,回過頭我們在繼續大話系列,這個暫且當做一個學習筆記。
今天開始第一篇:線性迴歸
1.線性迴歸
1.1. 從方程說起
說起線性迴歸,你可能不太理解是什麼東西,但我要是說一元一次方程你瞬間就知道是啥。
一元一次方程 y=ax+b中,元
指的是未知數的個數(即x),次
指的是未知數的最大冪數(即x的幾次方)
那麼迴歸也就是針對輸入變量x和輸出變量y之間的一個映射,線性迴歸的映射呈線性分佈,相對的還有一個邏輯迴歸,下節再說它。
在線性迴歸中,如果只有一個自變量,我們稱之爲一元線性迴歸,如果有兩個及以上的自變量,我們稱之爲多元線性迴歸,就好比區分一元方程和多元方程 一樣。
1.2. 線性迴歸
根據方程我們可以直接寫出線性迴歸的一般公式:
這個公式可以直接寫成向量的形式:
其中加粗的X表示向量,θ的轉置用θ^T表示,先記住上面這個公式,我們這會還用不到
1.3. 一元線性迴歸
通過上面的公式,我們可以直接寫出一元線性迴歸的一般公式:
也就相當於一元一次方程y=ax+b。在一元一次方程中,求解關鍵是計算出a和b的值,同理在一元線性迴歸中我們也需要求解出θ的值(這裏包括θ0和θ1)
ok,相關的概念你都明白了,來看張圖:
現在有許多藍色的數據點(每個點對應x,y),這個時候的線性迴歸方程如何求解?
我們知道,一元線性迴歸其實就是找到一條直線,但是這個圖中我們可以找到的不止一條直線,那麼對應的問題來了,如何找到最優的一條直線?
先假設我們已經找到了這條直線,那麼在上面圖中,針對橫座標x,縱座標y的每個點(xi,yi)最終形成了這樣一條直線 :
每個點都會與最終的直線存在些許距離(誤差),同時這個距離是最小的距離,所以這個直線就是最優的直線
如何計算距離呢?
每個點和直線的距離應該這樣計算:
爲了簡單方便我們可以直接將絕對值轉化爲平方,這個時候整體數據的誤差:
ok,這就是一元線性迴歸的誤差方程,我們的目的就是求得a和b,使得Loss最小。
怎麼求解這個a和b,我們等會再說,先來看看多元線性迴歸
1.4. 多元線性迴歸
前面我們已經寫出了線性迴歸的表達式:
假如現在是一個三元線性迴歸,相應的:
同時,迴歸係數θ:
對於給定的數據x1,也就是就成真的第一列數據,預測結果u1:
所以,我們多元線性迴歸的誤差也可以寫成:
2. 線性迴歸學習策略
在線性迴歸的模型建立過程中,有一些學習策略需要學習,但是這個學習策略不光是線性迴歸獨有的,在其他迴歸模型上同樣適用。
提前說兩個名詞,大家瞭解一下
經驗風險:
通過歷史數據(訓練集)得知模型對單個樣本點的預測,並計算關於訓練集的平均損失稱作經驗風險
結構風險:
當經驗風險越小的時候,也就是模型對訓練數據完美擬合的時候(過擬合),我們需要增加一些懲罰機制避免過擬合現象,即經驗風險+正則懲罰,這個時候稱爲結構風險
ok,可能你看的雲裏霧裏,來一張圖醒醒神
上面三個圖的函數依次爲,真實Price記爲
給定一個,三個函數都會輸出一個,但是輸出的結果不一定就與真實值相等,於是我們就需要一個函數去度量擬合的好壞,比如:
這個函數稱爲損失函數,當損失函數越小,代表模型擬合的越好。
同時,根據上面的經驗風險的概念,此時的經驗風險爲:
經驗風險是針對整個模型數據集的,所以此時我們的目標就變成了如果使得經驗風險最小化。
問題來了,上面圖三經驗風險最小,但是我們卻不會用它
因爲它的模型結構太複雜,產生了過擬合,我們需要增加一個函數來度量模型的複雜度——正則化
根據上面的概念,此時結構風險=經驗風險+正則懲罰,即:
經驗風險和結構風險都是針對整個數據集的,此時我們的目標變成了結構風險最小化+結構風險最小化,對應目標函數:
完事,總結一下
2.1 損失函數
損失函數:度量單樣本預測的錯誤程度。損失函數越小,模型越好
常用的損失函數包括:絕對損失函數、平方損失函數、對數損失函數等
2.2. 代價函數
代價函數:度量全部樣本集的平局誤差。
常見的代價函數包括:均方誤差、平均絕對誤差、均方根誤差等
2.3. 目標函數
目標函數:代價函數+正則化函數,有時候只有前半部分
模型最終的目標一定是:不僅要經驗風險最小化,還要結構風險最小化
3. 算法求解
我們已經知道最終的優化目標:目標函數最小化。
通過求解目標函數計算出相應的參數值,從而最終得到我們的最優模型。
現在我們的目標函數是:
拋開後面的正則化先不說,我們需要計算前半部分,先將前半部分寫成我們能看懂的形式:
這不就是求解一個方程的極小值問題嘛,ok,來搞
3.1 最小二乘法
最小二乘法又叫最小平方法,主要思想就是選擇未知參數,使得理論值與觀測值之差的平方和達到最小
就像在上面定義的損失函數一樣,就是通過最小二乘思想使得誤差最小。
問題來了,如何求解最小誤差對應的未知參數?
從單變量和多變量分別來說一下吧:
先來看單變量的最小二乘法求解
單變量下,我們的假設函數是y=ax+b,此時對應的損失函數爲:
我們的目標是通過找出合適的a、b使得Loss 最小(常數N可以先不考慮),這個時候可以直接用求極值的方法。
將Loss函數對a、b分別求偏導,並使得偏導結果爲0,解出此時a、b的值,即爲我們的參數目標值:
通過上面的方程組我們可以解得a、b的值,帶入到原方程中即可求解
再來看多變量的最小二乘法求解
此時我們的損失函數變成了:
這個可以寫成矩陣的形式:
同樣的我們求參數θ(此時的θ是個向量,常數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取偏導的結果
在梯度下降法中,我們需要計算在某一點對a、b的偏導,也就是,同樣的在該點會存在一個參數 α,它表示在梯度方向前進的步長,綜合一下,在某一點參數a、b的更新爲
所以梯度下降的更新可以表示成這樣一個表達式:
至於每一個點對a、b求偏導,在最小二乘法裏面已經計算過了,不妨回過頭去看一眼。
另外:往深的想一下,梯度下降法認爲每一步的最優解合併起來就是最終的最優解,這樣會導致最終結果可能並不是全局最優解
再來看多變量的梯度下降法求解
由於在多變量中我們的目標函數發生了變化,相應的對於梯度下降的更新也會發生變化
KaTeX parse error: No such environment: equation at position 8:
\begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲\begin{split}&L…
忽略掉常數,我們可以得到:
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
MSE的值越小,說明預測模型的精確度越高
4.2. 均方根誤差RMSE
相當於對MSE開根號,同越小越好
4.3. 平均絕對值誤差MAE
效果同上
4.4. R Squared誤差
不同的是,這個的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. 實戰項目
下節更新
寫在後面的話
稍稍總結一下,迴歸模型的目的是預測數值型的目標值,像諸如房價預測,年齡預測等等都可以通過迴歸模型去解決。
當然了你要說分類模型可以解決嗎?也可以的。不過各有所長,各有所短,醫生診斷病情都得對症下藥,我們解決問題也是要同樣的道理的
本想着把線性迴歸涉及到的內容都統統列出來,畢竟是迴歸模型的開篇,後面學習其他高級的模型也會簡單很多。
無奈坑實在太多(文中好多內容一筆帶過),而且恰好是周內工作日,時間有點倉促,就只能放在下一篇了。
後面還有邏輯迴歸,也想着趁機理一理,寫一寫,等做完線性迴歸的項目就開搞
我是小一,第一步的一,下節見!