2. Ridge 回歸的目標(biāo)函數(shù)

Ridge 回歸通過(guò)在上述目標(biāo)函數(shù)中加入一個(gè)正則化項(xiàng)來(lái)限制回歸系數(shù)的大小:

其中, 是正則化參數(shù),控制懲罰項(xiàng)的權(quán)重。較大的  會(huì)更嚴(yán)格地限制  的大小,防止過(guò)擬合。

3. 目標(biāo)函數(shù)的推導(dǎo)

將目標(biāo)函數(shù)展開(kāi):

其中, 是的目標(biāo)值向量,是的輸入特征矩陣,是 的回歸系數(shù)向量。

展開(kāi)并簡(jiǎn)化:

4. 梯度計(jì)算

為了找到使目標(biāo)函數(shù)最小化的?,我們對(duì)??求導(dǎo)并設(shè)置導(dǎo)數(shù)為零:

簡(jiǎn)化上式:

5. 解方程

整理上述方程:

其中,  是  的單位矩陣。

我們可以通過(guò)矩陣求逆來(lái)解這個(gè)方程:

6. 算法流程

  1. 準(zhǔn)備數(shù)據(jù):獲取特征矩陣??和目標(biāo)值向量?。
  2. 選擇正則化參數(shù):選擇合適的  值。
  3. 構(gòu)建矩陣:計(jì)算  和 。
  4. 添加正則化項(xiàng):計(jì)算 。
  5. 求解回歸系數(shù):通過(guò)矩陣求逆計(jì)算 。
  6. 模型預(yù)測(cè):使用回歸系數(shù)  進(jìn)行預(yù)測(cè)。

例子

假設(shè)我們有以下數(shù)據(jù):

計(jì)算中間結(jié)果:

求解回歸系數(shù):

這個(gè)例子展示了 Ridge 回歸的實(shí)際計(jì)算過(guò)程。通過(guò)引入正則化項(xiàng),Ridge 回歸能夠處理多重共線(xiàn)性問(wèn)題,并提高模型的泛化能力。

完整案例

數(shù)據(jù)集我們使用加利福尼亞房?jī)r(jià)數(shù)據(jù)集。使用 Ridge 回歸模型構(gòu)建、訓(xùn)練、預(yù)測(cè)、評(píng)估和優(yōu)化。

這里再簡(jiǎn)單和大家介紹下加利福尼亞房?jī)r(jià)數(shù)據(jù)集,在學(xué)習(xí)階段,使用頻率非常的高~

加利福尼亞房?jī)r(jià)數(shù)據(jù)集(California Housing Dataset)包含了加利福尼亞州各個(gè)地區(qū)的房?jī)r(jià)以及相關(guān)的地理和人口統(tǒng)計(jì)特征。這個(gè)數(shù)據(jù)集是由加利福尼亞州1990年的人口普查數(shù)據(jù)構(gòu)建的。

特征描述

  1. **MedInc**:街區(qū)的中位收入
  2. **HouseAge**:街區(qū)中房屋的中位年齡
  3. **AveRooms**:每戶(hù)平均房間數(shù)
  4. **AveBedrms**:每戶(hù)平均臥室數(shù)
  5. **Population**:街區(qū)的人口總數(shù)
  6. **AveOccup**:每戶(hù)平均居住人數(shù)
  7. **Latitude**:街區(qū)的緯度
  8. **Longitude**:街區(qū)的經(jīng)度

目標(biāo)變量

大家可以使用?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

# 加利福尼亞房?jī)r(jià)數(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)練集和測(cè)試集
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)

# 通過(guò)網(wǎng)格搜索和交叉驗(yàn)證來(lái)選擇最佳正則化參數(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ù)測(cè)訓(xùn)練集和測(cè)試集
y_train_pred = best_ridge.predict(X_train)
y_test_pred = best_ridge.predict(X_test)

# 計(jì)算均方誤差和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"測(cè)試集均方誤差: {test_mse}")
print(f"訓(xùn)練集 R^2 分?jǐn)?shù): {train_r2}")
print(f"測(cè)試集 R^2 分?jǐn)?shù): {test_r2}")

# 繪制實(shí)際值與預(yù)測(cè)值對(duì)比圖
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_

# 評(píng)估所有模型
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} 回歸 - 測(cè)試集均方誤差: {mse}, R^2 分?jǐn)?shù): {r2}")

整個(gè)代碼,偏向于實(shí)戰(zhàn),包括數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓(xùn)練、評(píng)估和優(yōu)化。我們還通過(guò)與其他回歸模型進(jìn)行比較,評(píng)估了 Ridge 回歸的性能。通過(guò)特征重要性分析,可以進(jìn)一步理解哪些特征對(duì)預(yù)測(cè)最重要。

這一系列步驟和分析希望可以幫助到大家,在實(shí)際應(yīng)用中更好地理解和使用 Ridge 回歸。

模型分析

Ridge 回歸模型的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  1. 解決多重共線(xiàn)性問(wèn)題:Ridge 回歸通過(guò)引入  正則化項(xiàng),可以有效地解決自變量之間存在多重共線(xiàn)性的問(wèn)題,從而提高模型的穩(wěn)定性和預(yù)測(cè)性能。
  2. 防止過(guò)擬合:正則化項(xiàng)限制了回歸系數(shù)的大小,防止模型過(guò)擬合訓(xùn)練數(shù)據(jù),提升對(duì)新數(shù)據(jù)的泛化能力。
  3. 計(jì)算效率高:相比于某些復(fù)雜的非線(xiàn)性回歸模型,Ridge 回歸的計(jì)算效率較高,適用于大規(guī)模數(shù)據(jù)集
  4. 參數(shù)調(diào)整靈活:通過(guò)調(diào)整正則化參數(shù) ,可以在偏差和方差之間找到最佳平衡,從而優(yōu)化模型性能。

缺點(diǎn)

  1. 不適用于特征選擇:Ridge 回歸不會(huì)將不相關(guān)的特征系數(shù)縮減到零,因此不適用于需要進(jìn)行特征選擇的場(chǎng)景。
  2. 無(wú)法處理非線(xiàn)性關(guān)系:Ridge 回歸是線(xiàn)性模型,如果數(shù)據(jù)中存在復(fù)雜的非線(xiàn)性關(guān)系,Ridge 回歸的表現(xiàn)可能不如非線(xiàn)性模型。
  3. 解釋性較差:由于引入了正則化項(xiàng),Ridge 回歸模型的解釋性可能較差,不易于解釋每個(gè)特征對(duì)目標(biāo)值的具體影響。

與相似算法的對(duì)比

Lasso 回歸

Lasso 回歸(Least Absolute Shrinkage and Selection Operator)也是一種線(xiàn)性回歸模型,但其正則化項(xiàng)是?范數(shù):

優(yōu)點(diǎn)

缺點(diǎn)

ElasticNet 回歸

ElasticNet 回歸結(jié)合了 Ridge 回歸和 Lasso 回歸的特點(diǎn),通過(guò)引入??和??正則化項(xiàng):

優(yōu)點(diǎn)

缺點(diǎn)

使用場(chǎng)景分析

適合使用 Ridge 回歸的場(chǎng)景

  1. 特征之間存在多重共線(xiàn)性:當(dāng)特征之間存在高度相關(guān)性時(shí),Ridge 回歸可以通過(guò)  正則化項(xiàng)有效地穩(wěn)定回歸系數(shù),提升模型的穩(wěn)定性和預(yù)測(cè)性能。
  2. 防止過(guò)擬合:如果數(shù)據(jù)集較小且存在過(guò)擬合的風(fēng)險(xiǎn),Ridge 回歸可以通過(guò)限制回歸系數(shù)的大小,防止模型過(guò)擬合。
  3. 模型解釋性不重要:在某些情況下,模型的預(yù)測(cè)性能比解釋性更重要,此時(shí)可以選擇 Ridge 回歸。

考慮其他算法的場(chǎng)景

  1. 需要特征選擇:如果需要選擇最相關(guān)的特征,Lasso 回歸或 ElasticNet 回歸更為適合,因?yàn)樗鼈兛梢詫⒉幌嚓P(guān)特征的系數(shù)縮減為零。
  2. 存在非線(xiàn)性關(guān)系:如果數(shù)據(jù)中存在復(fù)雜的非線(xiàn)性關(guān)系,可以考慮使用決策樹(shù)、隨機(jī)森林、支持向量機(jī)或神經(jīng)網(wǎng)絡(luò)等非線(xiàn)性模型。
  3. 高維數(shù)據(jù)集:對(duì)于特征數(shù)量遠(yuǎn)大于樣本數(shù)量的高維數(shù)據(jù)集,Lasso 回歸或 ElasticNet 回歸可能表現(xiàn)更好,因?yàn)樗鼈兡軌虍a(chǎn)生更加稀疏的模型。

最后

總結(jié)一下,Ridge 通過(guò)引入??正則化項(xiàng),可以有效地解決多重共線(xiàn)性問(wèn)題,并防止過(guò)擬合。它在特征之間存在高度相關(guān)性、數(shù)據(jù)集較小且易過(guò)擬合的情況下表現(xiàn)良好。然而,對(duì)于需要特征選擇或處理非線(xiàn)性關(guān)系的場(chǎng)景,可以考慮使用 Lasso 回歸、ElasticNet 回歸或其他非線(xiàn)性模型。通過(guò)結(jié)合不同算法的優(yōu)缺點(diǎn),實(shí)驗(yàn)中大家需要選擇最適合特定問(wèn)題的回歸模型,提升模型的預(yù)測(cè)性能和解釋性。

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

上一篇:

快速突破PyTorch,構(gòu)建CNN圖像分類(lèi)模型?。?/h5>

下一篇:

講透一個(gè)強(qiáng)大算法模型,Lasso回歸 ?。?/h5>
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

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

查看全部API→
??

熱門(mén)場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

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

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

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

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)