鍵.png)
如何高效爬取全球新聞網(wǎng)站 – 整合Scrapy、Selenium與Mediastack API實現(xiàn)自動化新聞采集
Ridge 回歸通過在上述目標(biāo)函數(shù)中加入一個正則化項來限制回歸系數(shù)的大小:
其中, 是正則化參數(shù),控制懲罰項的權(quán)重。較大的 會更嚴(yán)格地限制 的大小,防止過擬合。
將目標(biāo)函數(shù)展開:
其中, 是的目標(biāo)值向量,是的輸入特征矩陣,是 的回歸系數(shù)向量。
展開并簡化:
為了找到使目標(biāo)函數(shù)最小化的?,我們對??求導(dǎo)并設(shè)置導(dǎo)數(shù)為零:
簡化上式:
整理上述方程:
其中, 是 的單位矩陣。
我們可以通過矩陣求逆來解這個方程:
例子
假設(shè)我們有以下數(shù)據(jù):
計算中間結(jié)果:
求解回歸系數(shù):
這個例子展示了 Ridge 回歸的實際計算過程。通過引入正則化項,Ridge 回歸能夠處理多重共線性問題,并提高模型的泛化能力。
數(shù)據(jù)集我們使用加利福尼亞房價數(shù)據(jù)集。使用 Ridge 回歸模型構(gòu)建、訓(xùn)練、預(yù)測、評估和優(yōu)化。
這里再簡單和大家介紹下加利福尼亞房價數(shù)據(jù)集,在學(xué)習(xí)階段,使用頻率非常的高~
加利福尼亞房價數(shù)據(jù)集(California Housing Dataset)包含了加利福尼亞州各個地區(qū)的房價以及相關(guān)的地理和人口統(tǒng)計特征。這個數(shù)據(jù)集是由加利福尼亞州1990年的人口普查數(shù)據(jù)構(gòu)建的。
MedHouseVal
)特征描述
MedInc
**:街區(qū)的中位收入HouseAge
**:街區(qū)中房屋的中位年齡AveRooms
**:每戶平均房間數(shù)AveBedrms
**:每戶平均臥室數(shù)Population
**:街區(qū)的人口總數(shù)AveOccup
**:每戶平均居住人數(shù)Latitude
**:街區(qū)的緯度Longitude
**:街區(qū)的經(jīng)度目標(biāo)變量
MedHouseVal
**:街區(qū)房價的中位數(shù)(以美元計)大家可以使用?fetch_california_housing
?函數(shù)從?sklearn.datasets
?模塊中加載該數(shù)據(jù)集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import GridSearchCV
# 加利福尼亞房價數(shù)據(jù)集
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target
# 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 為訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 正則化參數(shù)的候選值
alphas = np.logspace(-4, 4, 50)
# 通過網(wǎng)格搜索和交叉驗證來選擇最佳正則化參數(shù)
ridge = Ridge()
grid_search = GridSearchCV(estimator=ridge, param_grid={'alpha': alphas}, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
# 獲取最佳模型
best_ridge = grid_search.best_estimator_
print(f"最佳正則化參數(shù): {grid_search.best_params_['alpha']}")
# 預(yù)測訓(xùn)練集和測試集
y_train_pred = best_ridge.predict(X_train)
y_test_pred = best_ridge.predict(X_test)
# 計算均方誤差和R^2分?jǐn)?shù)
train_mse = mean_squared_error(y_train, y_train_pred)
test_mse = mean_squared_error(y_test, y_test_pred)
train_r2 = r2_score(y_train, y_train_pred)
test_r2 = r2_score(y_test, y_test_pred)
print(f"訓(xùn)練集均方誤差: {train_mse}")
print(f"測試集均方誤差: {test_mse}")
print(f"訓(xùn)練集 R^2 分?jǐn)?shù): {train_r2}")
print(f"測試集 R^2 分?jǐn)?shù): {test_r2}")
# 繪制實際值與預(yù)測值對比圖
plt.figure(figsize=(10, 6))
plt.scatter(y_train, y_train_pred, label='train dataset', alpha=0.7)
plt.scatter(y_test, y_test_pred, label='test dataset', alpha=0.7)
plt.plot([min(y), max(y)], [min(y), max(y)], 'r--', lw=2)
plt.xlabel('actual')
plt.ylabel('predict')
plt.title('actual vs. predict')
plt.legend()
plt.show()
# 分析特征的重要性
coefs = pd.Series(best_ridge.coef_, index=california.feature_names)
coefs.sort_values().plot(kind='barh', figsize=(10, 6))
plt.title('Ridge 回歸的特征重要性')
plt.show()
# 比較其他回歸模型
# Lasso 回歸
grid_search_lasso = GridSearchCV(estimator=Lasso(), param_grid={'alpha': alphas}, cv=5, scoring='neg_mean_squared_error')
grid_search_lasso.fit(X_train, y_train)
best_lasso = grid_search_lasso.best_estimator_
# ElasticNet 回歸
param_grid = {'alpha': alphas, 'l1_ratio': np.linspace(0, 1, 10)}
grid_search_en = GridSearchCV(estimator=ElasticNet(), param_grid=param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search_en.fit(X_train, y_train)
best_elasticnet = grid_search_en.best_estimator_
# 評估所有模型
models = {'Ridge': best_ridge, 'Lasso': best_lasso, 'ElasticNet': best_elasticnet}
for name, model in models.items():
y_test_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_test_pred)
r2 = r2_score(y_test, y_test_pred)
print(f"{name} 回歸 - 測試集均方誤差: {mse}, R^2 分?jǐn)?shù): {r2}")
整個代碼,偏向于實戰(zhàn),包括數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓(xùn)練、評估和優(yōu)化。我們還通過與其他回歸模型進行比較,評估了 Ridge 回歸的性能。通過特征重要性分析,可以進一步理解哪些特征對預(yù)測最重要。
這一系列步驟和分析希望可以幫助到大家,在實際應(yīng)用中更好地理解和使用 Ridge 回歸。
優(yōu)點
缺點
Lasso 回歸
Lasso 回歸(Least Absolute Shrinkage and Selection Operator)也是一種線性回歸模型,但其正則化項是?范數(shù):
優(yōu)點:
缺點:
ElasticNet 回歸
ElasticNet 回歸結(jié)合了 Ridge 回歸和 Lasso 回歸的特點,通過引入??和??正則化項:
優(yōu)點:
缺點:
適合使用 Ridge 回歸的場景
考慮其他算法的場景
總結(jié)一下,Ridge 通過引入??正則化項,可以有效地解決多重共線性問題,并防止過擬合。它在特征之間存在高度相關(guān)性、數(shù)據(jù)集較小且易過擬合的情況下表現(xiàn)良好。然而,對于需要特征選擇或處理非線性關(guān)系的場景,可以考慮使用 Lasso 回歸、ElasticNet 回歸或其他非線性模型。通過結(jié)合不同算法的優(yōu)缺點,實驗中大家需要選擇最適合特定問題的回歸模型,提升模型的預(yù)測性能和解釋性。
本文章轉(zhuǎn)載微信公眾號@深夜努力寫Python