鍵.png)
如何高效爬取全球新聞網(wǎng)站 – 整合Scrapy、Selenium與Mediastack API實現(xiàn)自動化新聞采集
其中, 是第 個樣本的特征向量, 是對應(yīng)的目標(biāo)值, 是回歸系數(shù)向量。
在Lasso回歸中,我們在損失函數(shù)中添加一個 正則化項,這個項是所有系數(shù)的絕對值之和。Lasso回歸的優(yōu)化目標(biāo)變?yōu)椋?/p>
其中, 是正則化參數(shù),用于控制懲罰項的權(quán)重。
為了理解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)下降法。
下面是Lasso回歸的算法流程,假設(shè)使用梯度下降法來優(yōu)化:
通過上述流程,我們可以得到一個包含最重要特征的稀疏模型。
假設(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 庫獲取,大家不需要額外去尋找~
主要步驟:
下面,咱們一步一步來實現(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()
其中,有幾個點,需要大家注意下~
alpha
。通過上述整個的過程,大家基本可以全面了解如何使用 Lasso 回歸進(jìn)行房價預(yù)測,并且理解原理和代碼的實現(xiàn)。最后,并通過優(yōu)化提升模型性能。
先來聊聊Lasso回歸的優(yōu)缺點~
優(yōu)點
缺點
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