背景
弹性网络是一种结合岭回归(L2正则化)和Lasso回归(L1正则化)优点的线性回归模型,它在目标函数中引入了两种正则化的权重参数,使得模型既具有Lasso的特性(可以将某些不重要的特征系数缩为零,实现特征选择),又具有岭回归的特性(通过对特征系数进行惩罚,避免过拟合和共线性问题),弹性网络的目标函数可以表示为:
其中, 是目标变量, 是输入特征矩阵, 是模型的回归系数, 是正则化强度的调节参数(控制正则化项的影响), 是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回归或岭回归的关键参数:
- 当 l1_ratio=1时:模型完全采用 Lasso 回归(L1 正则化)
- 当l1_ratio =0时:模型完全采用岭回归(L2 正则化)
- 当 0<l1_ratio<1时:模型结合了 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 模型,可以看到模型的系数路径图与先前的结果完全一致,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
🎁 赠书活动来啦! 🎁
支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需
点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《R语言数据可视化:科技图表绘制》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考