其中, 是目標變量, 是輸入特征矩陣, 是模型的回歸系數, 是正則化強度的調節參數(控制正則化項的影響), 是L1和L2正則化之間的平衡參數(當 時等價于Lasso,當 時等價于嶺回歸),彈性網絡本質上是一個回歸模型,通常用于連續目標變量的預測,因此,它默認情況下不適用于分類任務,因為它優化的是最小二乘誤差而不是分類損失.

實現方法

ElasticNetCV和 ElasticNet都是scikit-learn中用于實現彈性網絡(Elastic Net)回歸的類,但它們有一些顯著的區別。

ElasticNetCV: 自動化的交叉驗證模型

ElasticNetCV 是一種帶有 交叉驗證 的彈性網絡回歸模型。它的主要優點是能夠在訓練過程中自動選擇最佳的正則化參數(alpha)和 l1_ratio(L1 和 L2 正則化的比例),因此適用于模型調參不多、希望自動找到最佳超參數的場景。

ElasticNet: 固定參數的彈性網絡模型

ElasticNet是一個固定超參數的彈性網絡模型,要求用戶自己設置 alpha 和l1_ratio參數,因此,它適合那些已經知道最佳參數值或不需要自動調參的情況。

代碼實現

數據讀取整理

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
# 讀取數據
df = pd.read_excel('2024-11-11公眾號Python機器學習AI.xlsx')
# 劃分特征和目標變量
X = df.drop(['y'], axis=1)
y = df['y']
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)

讀取數據,分離特征和目標變量 y,然后將數據集分為訓練集和測試集,對特征數據進行標準化處理,以確保所有特征具有相似的尺度

ElasticNetCV實現

利用彈性網絡交叉驗證選擇最佳超參數并篩選重要特征

from sklearn.linear_model import ElasticNetCV
# 設定彈性網絡模型并進行交叉驗證以選擇最佳超參數
elastic_net = ElasticNetCV(l1_ratio=np.linspace(0.1, 1, 10), # 設定 l1_ratio 范圍為非零值
alphas=np.logspace(-4, 4, 100),
cv=5,
max_iter=10000, # 增加最大迭代次數
random_state=42)
elastic_net.fit(X_train_scaled, y_train)
# 輸出最佳的 alpha 和 l1_ratio 值
print("Best alpha:", elastic_net.alpha_)
print("Best l1_ratio:", elastic_net.l1_ratio_)
# 獲取特征系數
feature_coef = elastic_net.coef_
# 篩選出非零特征
selected_features = X.columns[feature_coef != 0]
print("Selected features:", selected_features)

通過彈性網絡交叉驗證自動選擇最佳超參數,并篩選出在最佳模型中具有顯著貢獻的特征。

l1_ratio是影響模型更接近Lasso回歸或嶺回歸的關鍵參數:

彈性網絡特征選擇結果的可視化

plt.figure(figsize=(10, 6), dpi=1200)
plt.barh(selected_features, feature_coef[feature_coef != 0])
plt.xlabel('Feature Coefficients')
plt.ylabel('Features')
plt.title('Elastic Net Feature Selection Results')
plt.gca().xaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f'))
plt.savefig('1.pdf', format='pdf', bbox_inches='tight')
plt.show()

通過繪制水平條形圖展示了彈性網絡特征選擇的結果,其中橫軸為特征系數的大小,縱軸為被選擇的特征,圖中顯示了模型認為重要的特征及其相對影響力,特征 X_9 對模型貢獻最大

彈性網絡系數路徑圖的繪制

系數路徑圖展示了彈性網絡在不同正則化強度(alpha)下各特征系數的變化情況。隨著 alpha 增加,大部分特征的系數逐漸趨于零,說明強正則化會抑制不重要的特征。紅色虛線表示模型自動選擇的最佳 alpha 值,此時模型在擬合效果與正則化之間達到了最佳平衡,保留的非零系數特征對模型預測最有貢獻。

ElasticNet實現

from sklearn.linear_model import ElasticNet

# Best alpha 和 Best l1_ratio
best_alpha = 0.06734150657750829
best_l1_ratio = 0.5

# 定義 alpha 范圍以繪制路徑圖
alphas = np.logspace(-4, 4, 100)
coefs = []
non_zero_features = []

# 逐個 alpha 值訓練模型并存儲系數
for a in alphas:
model = ElasticNet(alpha=a, l1_ratio=best_l1_ratio, max_iter=10000, random_state=42)
model.fit(X_train_scaled, y_train)
coefs.append(model.coef_)

# 當 alpha 等于最佳 alpha 時,記錄非零特征
if np.isclose(a, best_alpha, atol=1e-6):
non_zero_features = X.columns[model.coef_ != 0]

# 輸出非零特征
print("Selected features at Best Alpha:", non_zero_features)

使用之前通過ElasticNetCV獲得的最佳參數 (alpha 和 l1_ratio) 構建 ElasticNet 模型,可以看到模型的系數路徑圖與先前的結果完全一致。

文章轉自微信公眾號@Python機器學習AI

上一篇:

回歸預測模型訓練集與測試集的進階可視化

下一篇:

基于VMD分解的VMD-LSTM時間序列預測模型實現,大力提升預測精度!

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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