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

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

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

2. 公式推理

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

普通最小二乘法(OLS)

最小化殘差平方和:

Lasso回歸

在OLS的基礎(chǔ)上,加上一個  正則化項:

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

梯度下降法

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

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

計算梯度時,普通最小二乘項的梯度是:

正則化項的梯度稍微復(fù)雜一些,因為  范數(shù)的導(dǎo)數(shù)在零點不連續(xù)。其導(dǎo)數(shù)形式是:

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

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

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

3. 算法流程

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

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

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

4. 幾何解釋

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

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

完整案例

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

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

主要步驟

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

下面,咱們一步一步來實現(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 模型

使用交叉驗證和網(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. 模型評估

評估模型性能,并計算各項指標(biāo)。

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

# 評估
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é)果可視化

可視化實際值與預(yù)測值之間的關(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()

其中,有幾個點,需要大家注意下~

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

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

模型分析

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

優(yōu)點

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

缺點

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

與相似算法的對比

Ridge 回歸

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

Elastic Net 回歸

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

使用場景

適用場景

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

最后

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

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

上一篇:

講透一個強大算法模型,Ridge回歸!!

下一篇:

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

我們有何不同?

API服務(wù)商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

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

10個渠道
一鍵對比試用API 限時免費