其中, 是第  個樣本的特征向量, 是對應的目標值, 是回歸系數向量。

在Lasso回歸中,我們在損失函數中添加一個  正則化項,這個項是所有系數的絕對值之和。Lasso回歸的優化目標變為:

其中, 是正則化參數,用于控制懲罰項的權重。

2. 公式推理

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

普通最小二乘法(OLS)

最小化殘差平方和:

Lasso回歸

在OLS的基礎上,加上一個  正則化項:

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

梯度下降法

為了最小化這個目標函數,我們可以使用梯度下降法。梯度下降的更新規則如下:

其中, 是學習率, 是目標函數的梯度。

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

正則化項的梯度稍微復雜一些,因為  范數的導數在零點不連續。其導數形式是:

其中, 表示符號函數。

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

注意:梯度下降法僅是解決這個優化問題的一種方法,也有其他方法如坐標下降法。

3. 算法流程

下面是Lasso回歸的算法流程,假設使用梯度下降法來優化:

  1. 初始化參數
  2. 迭代更新
  3. 輸出結果

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

4. 幾何解釋

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

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

完整案例

我們使用加利福尼亞房價數據集,該數據集包含了1990年美國加州各個區的房屋價格以及相關的地理和人口統計數據。

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

主要步驟

  1. 加載和探索數據
  2. 數據預處理
  3. 特征工程
  4. 建立和優化 Lasso 模型
  5. 模型評估
  6. 結果可視化

下面,咱們一步一步來實現,細節的地方大家可以看注釋部分。

1. 加載和探索數據

首先,我們加載數據并進行初步探索。

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

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

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

2. 數據預處理

處理數據中的缺失值,并進行特征縮放。

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

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

# 數據分割
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. 特征工程

可視化特征之間的關系以幫助理解數據。

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

4. 建立和優化 Lasso 模型

使用交叉驗證和網格搜索優化 Lasso 模型

# 建立 Lasso 模型
lasso = Lasso()

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

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

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

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

5. 模型評估

評估模型性能,并計算各項指標。

# 預測
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. 結果可視化

可視化實際值與預測值之間的關系。

# 可視化
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. 數據預處理:確保所有特征進行標準化,避免特征值差異過大對模型的影響。
  2. 參數調整:使用網格搜索找到最佳的正則化參數 alpha
  3. 模型評估:計算 MSE 和 R2 來評估模型性能,并通過可視化檢查預測效果。
  4. 特征重要性:可以查看哪些特征對模型的貢獻最大。Lasso 回歸會將不重要的特征系數壓縮為零,這也可以幫助我們理解特征的重要性。

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

模型分析

先來聊聊Lasso回歸的優缺點~

優點

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

缺點

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

與相似算法的對比

Ridge 回歸

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

Elastic Net 回歸

Elastic Net回歸結合了Lasso和Ridge的正則化項,使用  和  范數的組合。

使用場景

適用場景

其他算法優選場景

最后

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

本文章轉載微信公眾號@深夜努力寫Python

上一篇:

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

下一篇:

機器學習中的數據歸一化:提升模型性能與收斂速度的關鍵步驟
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

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

#AI深度推理大模型API

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

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