
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
其中, 是第 個樣本的特征向量, 是對應的目標值, 是回歸系數向量。
在Lasso回歸中,我們在損失函數中添加一個 正則化項,這個項是所有系數的絕對值之和。Lasso回歸的優化目標變為:
其中, 是正則化參數,用于控制懲罰項的權重。
為了理解Lasso回歸的公式推理,我們需要從優化問題的角度來看。
普通最小二乘法(OLS):
最小化殘差平方和:
Lasso回歸:
在OLS的基礎上,加上一個 正則化項:
其中,?是正則化項,它通過增加非零系數的數量來懲罰模型的復雜性。
梯度下降法:
為了最小化這個目標函數,我們可以使用梯度下降法。梯度下降的更新規則如下:
其中, 是學習率, 是目標函數的梯度。
計算梯度時,普通最小二乘項的梯度是:
正則化項的梯度稍微復雜一些,因為 范數的導數在零點不連續。其導數形式是:
其中, 表示符號函數。
綜合以上兩部分,我們得到Lasso回歸的梯度:
注意:梯度下降法僅是解決這個優化問題的一種方法,也有其他方法如坐標下降法。
下面是Lasso回歸的算法流程,假設使用梯度下降法來優化:
通過上述流程,我們可以得到一個包含最重要特征的稀疏模型。
假設我們有兩個特征??和?,Lasso 回歸的懲罰項??的幾何形狀是一個菱形。而 OLS 的等值線是橢圓形。當我們在優化過程中縮小誤差平方和的同時約束?(即菱形內的區域),最終會導致優化解在菱形的頂點處。這些頂點對應于一些系數(如??或?)為零,從而實現特征選擇。
總之,通過Lasso回歸,我們不僅能得到一個適合數據的模型,還能自動篩選出對結果有重要影響的特征,使得模型更加簡潔和解釋性更強。
我們使用加利福尼亞房價數據集,該數據集包含了1990年美國加州各個區的房屋價格以及相關的地理和人口統計數據。
這個數據集可以通過 Scikit-learn 庫獲取,大家不需要額外去尋找~
主要步驟:
下面,咱們一步一步來實現,細節的地方大家可以看注釋部分。
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()
其中,有幾個點,需要大家注意下~
alpha
。通過上述整個的過程,大家基本可以全面了解如何使用 Lasso 回歸進行房價預測,并且理解原理和代碼的實現。最后,并通過優化提升模型性能。
先來聊聊Lasso回歸的優缺點~
優點
缺點
Ridge 回歸
Ridge回歸(嶺回歸)也是一種正則化的線性回歸方法,但它使用 范數(系數的平方和)作為正則化項。與Lasso回歸相比,Ridge回歸不會將特征系數縮減為零,因此不會進行特征選擇。
Elastic Net 回歸
Elastic Net回歸結合了Lasso和Ridge的正則化項,使用 和 范數的組合。
適用場景
其他算法優選場景
Lasso回歸,其實特別適用于高維數據和需要特征選擇的場景。然而,在多重共線性嚴重或需要保留所有特征的情況下,Ridge回歸或Elastic Net回歸可能是更好的選擇。
本文章轉載微信公眾號@深夜努力寫Python