線性回歸的正則化 ——嶺回歸與LASSO回歸

2021-02-15 Stata and Python數據分析

本文作者:王   歌

文字編輯:孫曉玲

在《基於廣義線性模型的機器學習算法——線性回歸》中我們介紹了如何使用線性回歸算法來擬合學習器,但有時使用線性回歸可能會產生過擬合的現象,此時我們通常有兩種途徑解決:一是對特徵進行選擇,減少特徵數量,二是使用正則化的方法,這樣可以保留所有的特徵,而在正則化時我們通常會採用嶺回歸或LASSO回歸,今天我們就來介紹一下這兩種正則化方法。

在介紹嶺回歸與LASSO回歸之前,首先我們考慮這樣一個問題。在線性回歸中我們求解使得損失函數即均方誤差最小的w和b作為回歸中參數的估計值,求解的過程在於對損失函數中的w求偏導,此時我們會得到:

由此可以得到w的值並且是唯一解。但當X的列數多於行數、不滿秩時,此時可以解出多個w,它們都能使損失函數最小,這是我們該如何選擇最優解呢?

在機器學習中通常會選擇正則化的方法來解決這一問題,即在損失函數中加入正則項(懲罰約束)來防止模型過擬合。其防止過擬合的原理,從本質上來說屬於數學上的特徵縮減(shrinkage),由於過擬合過分追求「小偏差」使模型過於複雜,導致擬合的數據分布與真實分布偏差很小但方差很大,此時擬合出的曲線斜率的絕對值大,也就是函數的偏導數大,因而要避免偏導數過大就要減小參數,即通過設置懲罰算子α,使得影響較小的特徵的係數衰減到0,只保留重要特徵從而減少模型複雜度進而達到避免過擬合的目的。這裡的模型複雜度並非是冪次上的數值大,而是模型空間中可選模型的數量多。所以上面問題中加入αI,此時滿秩可求逆。

正則化的優化目標函數一般為:

其中α≥0,對於線性回歸模型,當時的回歸稱為LASSO回歸,稱為L1正則化(或L1範數);當時的回歸稱為嶺回歸,稱為L2正則化(或L2範數)。

1.2嶺回歸

嶺回歸的求解與一般的線性回歸求解方法是類似的。加入了懲罰項後,在求解參數時仍然要求偏導,此時若採用最小二乘法,則

而若採用梯度下降法求解,則

其中,該式為w的一個迭代更新公式,β為步長(學習率)。嶺回歸保留了所有的變量,縮小了參數,所以也就沒有信息的損失,但相應的模型的變量過多解釋性會降低。

LASSO回歸的損失函數完整表達為

其中n為樣本量。由於L1範數為絕對值的形式,導致LASSO的損失函數不是連續可導的,所以最小二乘法,梯度下降法,牛頓法,擬牛頓法都不能用。通常我們可以使用坐標下降法、最小角回歸法或近端梯度下降法等方法,這幾種方法的具體推導過程就不再介紹了,大家感興趣可以進一步了解。當模型中變量較多需要壓縮時可以選擇LASSO回歸的方法。

 2 類參數介紹

在sklearn中進行嶺回歸和LASSO回歸的類分別是Ridge()和Lasso(),首先我們介紹一下這兩個類中用到的參數。

·alpha:即上面講到的正則化懲罰算子α,接受浮點型,默認為1.0。取值越大對共線性的魯棒性越強;

·copy_X:默認為True,表示是否複製X數組,為True時將複製X數組,否則將覆蓋原數組X;

·fit_intercept:默認為True,表示是否計算此模型的截距;

·max_iter:最大迭代次數,接受整型,默認為None;

·normalize:默認為False,表示是否先進行歸一化,當fit_intercept設置為False時,將忽略此參數;

·solver:選擇計算時的求解方法,默認為『auto』,主要有幾種選擇:(1)auto根據數據類型自動選擇求解器;(2)svd使用X的奇異值分解來計算Ridge係數;(3)cholesky使用標準的scipy.linalg.solve函數來獲得閉合形式的解;(4)sparse_cg使用在scipy.sparse.linalg.cg中找到的共軛梯度求解器;(5)lsqr使用正則化最小二乘常數scipy.sparse.linalg.lsqr;(6)sag使用隨機平均梯度下降;

·tol:接受浮點型,用於選擇解的精度;

·random_state:默認為None,用於設置種子,接受整型。

2.2 LASSO()

這個類中有部分參數用法是與Ridge()類相同的,即alpha、fit_intercept 、normalize、copy_X、max_iter、random_state。除此之外,還有以下參數:

·precompute:默認=False ,表示是否使用預計算的Gram矩陣(特徵間未減去均值的協方差陣)來加速計算;

·warm_start : 選擇為 True 時,重複使用上一次學習作為初始化,否則直接清除上次方案;

·positive : 選擇為 True 時,強制使係數為正;

·tol:優化容忍度,接受浮點型;

·selection :默認為'cyclic',若設置為'random',表示每次循環隨機更新參數,按照默認設置則會依次更新。

3 算法實例

這裡我們使用的數據仍然是上次介紹過的sklearn庫中自帶的波士頓房價數據。首先我們分別使用嶺回歸和LASSO回歸進行擬合,並輸出回歸係數和截距,程序如下:
from sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import Ridge, Lassoboston_sample = load_boston()x_train, x_test, y_train, y_test = train_test_split(   boston_sample.data, boston_sample.target, test_size=0.25,random_state=123)ridge = Ridge()ridge.fit(x_train, y_train)print('嶺回歸係數:', ridge.coef_)print('嶺回歸截距:', ridge.intercept_)y_ridge_pre = ridge.predict(x_test)lasso = Lasso()lasso.fit(x_train, y_train)print('LASSO回歸係數:', lasso.coef_)print('LASSO回歸係數:', lasso.intercept_)y_lasso_pre = lasso.predict(x_test)

輸出結果如下:

而後我們分別輸出兩個模型回歸的擬合優度和均方誤差,程序如下:

from sklearn.metrics import mean_squared_error,r2_scoreprint('嶺回歸的r2為:', r2_score(y_test, y_ridge_pre))print('嶺回歸的均方誤差為:', mean_squared_error(y_test,y_ridge_pre))print('LASSO回歸的r2為:', r2_score(y_test, y_lasso_pre))print('LASSO回歸的均方誤差為:', mean_squared_error(y_test,y_lasso_pre))

結果如下:

我們將線性回歸、嶺回歸和LASSO的預測結果與真實值畫在一張圖上對比一下,程序如下:

import matplotlib.pyplot as pltplt.plot(y_test, label='True')plt.plot(y, label='linear')plt.plot(y_ridge_pre, label='Ridge')plt.plot(y_lasso_pre, label='LASSO')plt.legend()plt.show()

結果如下圖:

可以看到在這個例子中用這三種回歸方法得到的結果差別不太大,當然,這裡由於篇幅所限,我們在嶺回歸和LASSO回歸中使用了默認的α值,其實還可以通過調參對模型進行優化。同時,我們也要注意,嶺回歸和LASSO都是使用特徵縮減的思想,因此得到的結果是有偏的,所以在選擇方法時要注意自己的需求。以上就是我們對線性回歸進一步的延伸,大家快去練習一下吧!

對我們的推文累計打賞超過1000元,我們即可給您開具發票,發票類別為「諮詢費」。用心做事,不負您的支持!

微信公眾號「Stata and Python數據分析」分享實用的stata、python等軟體的數據處理知識,歡迎轉載、打賞。我們是由李春濤教授領導下的研究生及本科生組成的大數據處理和分析團隊。

此外,歡迎大家踴躍投稿,介紹一些關於stata和python的數據處理和分析技巧。投稿郵箱:statatraining@163.com投稿要求:
1)必須原創,禁止抄襲;
2)必須準確,詳細,有例子,有截圖;
注意事項:
1)所有投稿都會經過本公眾號運營團隊成員的審核,審核通過才可錄用,一經錄用,會在該推文裡為作者署名,並有賞金分成。
2)郵件請註明投稿,郵件名稱為「投稿+推文名稱」。
3)應廣大讀者要求,現開通有償問答服務,如果大家遇到有關數據處理、分析等問題,可以在公眾號中提出,只需支付少量賞金,我們會在後期的推文裡給予解答。

相關焦點

  • 線性回歸進階——嶺回歸和lasso回歸
    詳細可以看之前的一篇推送:    而我們今天要分享大家的是:lasso 回歸和嶺回歸(ridge regression),這兩種回歸方式其實就是在標準線性回歸的基礎上分別加入不同的正則化矯正而已(regularization)。    對於普通線性模型:    它的損失函數是:
  • 機器學習算法之嶺回歸、Lasso回歸和ElasticNet回歸
    當數據集中的特徵之間有較強的線性相關性時,即特徵之間出現嚴重的多重共線性時,用普通最小二乘法估計模型參數,往往參數估計的方差太大,此時,求解出來的模型就很不穩定。在具體取值上與真值有較大的偏差,有時會出現與實際意義不符的正負號。在線性回歸中如果參數
  • 從零開始學Python【25】--嶺回歸及LASSO回歸(實戰部分)
    >從零開始學Python【23】--線性回歸診斷(第二部分)從零開始學Python【22】--線性回歸診斷(第一部分)從零開始學Python【21】--線性回歸(實戰部分)從零開始學Python【20】--線性回歸(理論部分)前言      在《從零開始學Python【24】--嶺回歸及LASSO回歸(理論部分)
  • 各種線性回歸
    一.sklearn中的各種線性回歸1,普通線性回歸
  • Python 機器學習算法實踐:嶺回歸和LASSO
    , 本文主要介紹兩種線性回歸的縮減(shrinkage)方法的基礎知識: 嶺回歸(Ridge Regression)和LASSO(Least Absolute Shrinkage and Selection Operator)並對其進行了Python實現。
  • 從零開始學Python數據分析【25】--嶺回歸及LASSO回歸(實戰部分)
    【13】-- matplotlib(直方圖)從零開始學Python數據分析【14】-- matplotlib(折線圖)從零開始學Python數據分析【15】-- matplotlib(散點圖)從零開始學Python數據分析【16】-- matplotlib(雷達圖)從零開始學Python數據分析【17】-- matplotlib(面積圖
  • Ridge 回歸和 Lasso 回歸的完整教程
    所以,我們一般都會加上一些正則化技術,在本文中我們會介紹一些最基礎的正則化技術,Ridge 回歸和 Lasso 回歸。這兩種回歸技術總體的思路是不變的。1. 簡要概述Ridge 和 Lasso 回歸是通常用於在存在大量特徵的情況下創建簡約模型的強大技術。
  • 線性模型(二)正則化的回歸
    正則化的回歸正則化的回歸是在普通回歸經驗風險中加入正則項構成的回歸,如式(9-10)所示:正則化原理最常見的正則化方法是使用Lp正則化項,即Lp範數,其數學表達式為式(9-11):最小𝛽周圍不斷擴展的等高線與上述幾何圖形相切的點,即為𝛽的滿足限制條件的取值,L1的限制下該等高線會和Y軸相切得到X軸上係數為0的𝛽,而與L2得到的是非零的兩個𝛽Lasso和Ridge回歸L1的回歸稱為Lasso(套索)回歸,L2的回歸稱為Ridge(嶺)回歸
  • 手把手帶你畫高大上的lasso回歸模型圖
    首先我們先來幾篇文獻,看一下lasso最近發的兩篇文章,如下:                            這兩篇文章均是採用了lasso回歸的範文。感興趣的可以自行下載學習,當然今天我們主要是和大家探討lasso回歸的細枝末節,具體體會這個算法的精妙和思想。
  • Stata: 拉索回歸和嶺回歸 (Ridge, Lasso) 簡介
    當某項的懲罰係數足夠大時,那麼它將無法進入模型(變量選擇),只有那些回歸係數非0的變量才會被選入模型。在 Stata 中,我們可以安裝 lassopack 命令來實現 Lasso 回歸,Lassopack 包含三個與 Lasso 相關的子命令(輸入 help lassopack 可以查看詳情):3.
  • 通過正則化擴展回歸庫
    這個GitHub存儲庫包含你自己運行分析所需的一切:https://github.com/PaulHiemstra/lasso_tsfresh_article/blob/master/lasso_tsfresh_article.ipynb介紹對於許多數據科學家來說,最基本的模型是多元線性回歸。
  • 二.線性回歸(二)
    2.APIsklearn.linear_model.SGDRegressor(loss="squared_loss", fit_intercept=True, learning_rate ='invscaling', eta0=0.01) 支持不同的loss函數和正則化懲罰項來擬合線性回歸模型參數 loss
  • 數學推導+純Python實現機器學習算法:Lasso回歸
    本節我們要介紹的是基於L1正則化的Lasso模型,下一節介紹基於L2正則化的Ridge模型。在正式介紹這兩種模型之前,筆者還是想帶大家複習一下過擬合和正則化等機器學習關鍵問題。係數 λ 說完了,然後就是正則化項,正則化項形式有很多,但常見的也就是 L1 和 L2 正則化。本節我們先來看L1。在說常見的 L1 和 L2 之前,先來看一下 L0 正則化。L0 正則化也就是 L0 範數,即矩陣中所有非 0 元素的個數。如何我們在正則化過程中選擇了 L0 範數,那該如何理解這個 L0 呢?
  • python機器學習:嶺回歸介紹
    接著上節討論,嶺回歸也是一種用於回歸的線性模型,因此它的預測公式與普通的最小二乘法相同。但在嶺回歸中,對係數(w)的選擇不僅要在訓練數據上得到好的預測結果,而且要擬合附加約束。同時我們還希望係數儘量小(w的所有元素儘量接近於0),同時仍給出很好的預測結果,這種約束就是所謂的正則化的一個例子。正則化是指對模型做顯示的約束,避免過擬合現象。
  • 線性回歸-如何對數據進行回歸分析
    通常,我們的模型是通過多個特徵值來預測一個目標值,那麼線性回歸模型的數學公式為:其中:線性回歸模型與數學中的解方程不同,後者的結果是精確解,而前者則是一個近似解。因此在公式中存在一個 ε 。,之前的文章中,已經多次使用過,這次我們對其使用線性回歸模型進行分析。
  • 拉索回歸:拉索開心讀懂-Lasso入門
    其中,嶺回歸的約束集為圓形,最優解通常不在坐標軸上,得不到稀疏解,即無法通過約束使得某些變量係數為 0 來簡化模型。而 Lasso 約束集為菱形,恰好可以彌補這一缺點。簡單來講,先採用 Lasso 回歸篩選模型自變量,再採用無懲罰項的模型進行回歸,這種方法的結果會作為各種模型結果對比的參照,且此方法也可簡單用於變量的篩選。2.2 從 Lasso 到彈性網回歸Lasso 回歸與嶺回歸回歸相比雖然達到了變量選擇的目的,但是也有一定的局限性。
  • 機器學習測試筆記(12)——線性回歸方法(下)
    4.嶺回歸嶺回歸(英文名:Ridgeregression, Tikhonov regularization)是一種專用於共線性數據分析的有偏估計回歸方法,實質上是一種改良的最小二乘估計法,通過放棄最小二乘法的無偏性,以損失部分信息、降低精度為代價獲得回歸係數更為符合實際、更可靠的回歸方法,對病態數據的擬合要強於最小二乘法。
  • 前沿: Lasso, 嶺回歸, 彈性網估計在軟體中的實現流程和示例解讀
    回歸方法深度剖析(OLS, RIDGE, ENET, LASSO, SCAD, MCP, QR),2.高維回歸方法: Ridge, Lasso, Elastic Net用了嗎,3.共線性、過度/不能識別問題的Solutions,4.
  • 獨家 | 為你介紹7種流行的線性回歸收縮與選擇方法(附代碼)
    本文討論了幾種子集和收縮方法:最佳子集回歸, 嶺回歸, LASSO, 彈性網, 最小角度回歸, 主成分回歸和偏最小二乘。本文討論了七種流行的收縮和選擇方法的數學屬性和實際的Python應用。在本文中,我們將介紹七種流行的子集選擇和線性回歸收縮方法。
  • 推薦 :為你介紹7種流行的線性回歸收縮與選擇方法(附代碼)
    本文討論了幾種子集和收縮方法:最佳子集回歸, 嶺回歸, LASSO, 彈性網, 最小角度回歸, 主成分回歸和偏最小二乘。本文討論了七種流行的收縮和選擇方法的數學屬性和實際的Python應用。在本文中,我們將介紹七種流行的子集選擇和線性回歸收縮方法。