其中, 是第  個(gè)樣本的特征向量, 是對(duì)應(yīng)的目標(biāo)值, 是回歸系數(shù)向量。

在Lasso回歸中,我們?cè)趽p失函數(shù)中添加一個(gè)  正則化項(xiàng),這個(gè)項(xiàng)是所有系數(shù)的絕對(duì)值之和。Lasso回歸的優(yōu)化目標(biāo)變?yōu)椋?/p>

其中, 是正則化參數(shù),用于控制懲罰項(xiàng)的權(quán)重。

2. 公式推理

為了理解Lasso回歸的公式推理,我們需要從優(yōu)化問題的角度來看。

普通最小二乘法(OLS)

最小化殘差平方和:

Lasso回歸

在OLS的基礎(chǔ)上,加上一個(gè)  正則化項(xiàng):

其中,?是正則化項(xiàng),它通過增加非零系數(shù)的數(shù)量來懲罰模型的復(fù)雜性。

梯度下降法

為了最小化這個(gè)目標(biāo)函數(shù),我們可以使用梯度下降法。梯度下降的更新規(guī)則如下:

其中, 是學(xué)習(xí)率, 是目標(biāo)函數(shù)的梯度。

計(jì)算梯度時(shí),普通最小二乘項(xiàng)的梯度是:

正則化項(xiàng)的梯度稍微復(fù)雜一些,因?yàn)?nbsp; 范數(shù)的導(dǎo)數(shù)在零點(diǎn)不連續(xù)。其導(dǎo)數(shù)形式是:

其中, 表示符號(hào)函數(shù)。

綜合以上兩部分,我們得到Lasso回歸的梯度:

注意:梯度下降法僅是解決這個(gè)優(yōu)化問題的一種方法,也有其他方法如坐標(biāo)下降法。

3. 算法流程

下面是Lasso回歸的算法流程,假設(shè)使用梯度下降法來優(yōu)化:

  1. 初始化參數(shù)
  2. 迭代更新
  3. 輸出結(jié)果

通過上述流程,我們可以得到一個(gè)包含最重要特征的稀疏模型。

4. 幾何解釋

假設(shè)我們有兩個(gè)特征??和?,Lasso 回歸的懲罰項(xiàng)??的幾何形狀是一個(gè)菱形。而 OLS 的等值線是橢圓形。當(dāng)我們?cè)趦?yōu)化過程中縮小誤差平方和的同時(shí)約束?(即菱形內(nèi)的區(qū)域),最終會(huì)導(dǎo)致優(yōu)化解在菱形的頂點(diǎn)處。這些頂點(diǎn)對(duì)應(yīng)于一些系數(shù)(如??或?)為零,從而實(shí)現(xiàn)特征選擇。

總之,通過Lasso回歸,我們不僅能得到一個(gè)適合數(shù)據(jù)的模型,還能自動(dòng)篩選出對(duì)結(jié)果有重要影響的特征,使得模型更加簡(jiǎn)潔和解釋性更強(qiáng)。

完整案例

我們使用加利福尼亞房?jī)r(jià)數(shù)據(jù)集,該數(shù)據(jù)集包含了1990年美國加州各個(gè)區(qū)的房屋價(jià)格以及相關(guān)的地理和人口統(tǒng)計(jì)數(shù)據(jù)。

這個(gè)數(shù)據(jù)集可以通過 Scikit-learn 庫獲取,大家不需要額外去尋找~

主要步驟

  1. 加載和探索數(shù)據(jù)
  2. 數(shù)據(jù)預(yù)處理
  3. 特征工程
  4. 建立和優(yōu)化 Lasso 模型
  5. 模型評(píng)估
  6. 結(jié)果可視化

下面,咱們一步一步來實(shí)現(xiàn),細(xì)節(jié)的地方大家可以看注釋部分。

1. 加載和探索數(shù)據(jù)

首先,我們加載數(shù)據(jù)并進(jìn)行初步探索。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import GridSearchCV

# 加載數(shù)據(jù)
from sklearn.datasets import fetch_california_housing
data = fetch_california_housing()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['MedHouseVal'] = data.target

# 初步查看數(shù)據(jù)
print(df.head())
print(df.describe())

2. 數(shù)據(jù)預(yù)處理

處理數(shù)據(jù)中的缺失值,并進(jìn)行特征縮放。

# 檢查缺失值
print(df.isnull().sum())

# 分離特征和目標(biāo)變量
X = df.drop('MedHouseVal', axis=1)
y = df['MedHouseVal']

# 數(shù)據(jù)分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 特征縮放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

3. 特征工程

可視化特征之間的關(guān)系以幫助理解數(shù)據(jù)。

# 特征相關(guān)性
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Feature Correlation Heatmap')
plt.show()

4. 建立和優(yōu)化 Lasso 模型

使用交叉驗(yàn)證和網(wǎng)格搜索優(yōu)化 Lasso 模型

# 建立 Lasso 模型
lasso = Lasso()

# 定義超參數(shù)網(wǎng)格
param_grid = {'alpha': np.logspace(-4, 4, 50)}

# 網(wǎng)格搜索
grid_search = GridSearchCV(lasso, param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train_scaled, y_train)

# 最佳超參數(shù)
best_alpha = grid_search.best_params_['alpha']
print(f'Best alpha: {best_alpha}')

# 訓(xùn)練最終模型
lasso_opt = Lasso(alpha=best_alpha)
lasso_opt.fit(X_train_scaled, y_train)

5. 模型評(píng)估

評(píng)估模型性能,并計(jì)算各項(xiàng)指標(biāo)。

# 預(yù)測(cè)
y_pred_train = lasso_opt.predict(X_train_scaled)
y_pred_test = lasso_opt.predict(X_test_scaled)

# 評(píng)估
mse_train = mean_squared_error(y_train, y_pred_train)
mse_test = mean_squared_error(y_test, y_pred_test)
r2_train = r2_score(y_train, y_pred_train)
r2_test = r2_score(y_test, y_pred_test)

print(f'MSE (Train): {mse_train}')
print(f'MSE (Test): {mse_test}')
print(f'R^2 (Train): {r2_train}')
print(f'R^2 (Test): {r2_test}')

6. 結(jié)果可視化

可視化實(shí)際值與預(yù)測(cè)值之間的關(guān)系。

# 可視化
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred_test, alpha=0.6, color='b')
plt.plot([0, 5], [0, 5], 'r--')
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.title('Actual vs Predicted House Prices')
plt.show()

其中,有幾個(gè)點(diǎn),需要大家注意下~

  1. 數(shù)據(jù)預(yù)處理:確保所有特征進(jìn)行標(biāo)準(zhǔn)化,避免特征值差異過大對(duì)模型的影響。
  2. 參數(shù)調(diào)整:使用網(wǎng)格搜索找到最佳的正則化參數(shù) alpha。
  3. 模型評(píng)估:計(jì)算 MSE 和 R2 來評(píng)估模型性能,并通過可視化檢查預(yù)測(cè)效果。
  4. 特征重要性:可以查看哪些特征對(duì)模型的貢獻(xiàn)最大。Lasso 回歸會(huì)將不重要的特征系數(shù)壓縮為零,這也可以幫助我們理解特征的重要性。

通過上述整個(gè)的過程,大家基本可以全面了解如何使用 Lasso 回歸進(jìn)行房?jī)r(jià)預(yù)測(cè),并且理解原理和代碼的實(shí)現(xiàn)。最后,并通過優(yōu)化提升模型性能。

模型分析

先來聊聊Lasso回歸的優(yōu)缺點(diǎn)~

優(yōu)點(diǎn)

  1. 特征選擇:Lasso回歸會(huì)將一些不重要的特征的系數(shù)縮減為零,從而實(shí)現(xiàn)特征選擇。這使得模型更加簡(jiǎn)潔和易于解釋。
  2. 減少過擬合:通過引入正則化項(xiàng),Lasso回歸可以有效地減少過擬合,提高模型的泛化能力。
  3. 簡(jiǎn)單高效:Lasso回歸相對(duì)簡(jiǎn)單,計(jì)算效率高,適用于處理高維數(shù)據(jù)。

缺點(diǎn)

  1. 多重共線性問題:當(dāng)特征之間存在多重共線性時(shí),Lasso回歸可能無法正確選擇特征,導(dǎo)致模型性能下降。
  2. 計(jì)算復(fù)雜度:在大規(guī)模數(shù)據(jù)集上,Lasso回歸的計(jì)算復(fù)雜度可能較高,尤其是當(dāng)使用網(wǎng)格搜索優(yōu)化超參數(shù)時(shí)。
  3. 模型解釋性:雖然Lasso回歸能進(jìn)行特征選擇,但對(duì)結(jié)果的解釋性仍可能受到數(shù)據(jù)特性的影響,有時(shí)難以完全理解模型的行為。

與相似算法的對(duì)比

Ridge 回歸

Ridge回歸(嶺回歸)也是一種正則化的線性回歸方法,但它使用  范數(shù)(系數(shù)的平方和)作為正則化項(xiàng)。與Lasso回歸相比,Ridge回歸不會(huì)將特征系數(shù)縮減為零,因此不會(huì)進(jìn)行特征選擇。

Elastic Net 回歸

Elastic Net回歸結(jié)合了Lasso和Ridge的正則化項(xiàng),使用  和  范數(shù)的組合。

使用場(chǎng)景

適用場(chǎng)景

其他算法優(yōu)選場(chǎng)景

最后

Lasso回歸,其實(shí)特別適用于高維數(shù)據(jù)和需要特征選擇的場(chǎng)景。然而,在多重共線性嚴(yán)重或需要保留所有特征的情況下,Ridge回歸或Elastic Net回歸可能是更好的選擇。

本文章轉(zhuǎn)載微信公眾號(hào)@深夜努力寫Python

上一篇:

講透一個(gè)強(qiáng)大算法模型,Ridge回歸??!

下一篇:

機(jī)器學(xué)習(xí)中的數(shù)據(jù)歸一化:提升模型性能與收斂速度的關(guān)鍵步驟
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)