特征选择:Lasso和Ridge算法结合的弹性网络回归实现

弹性计算机器学习关系型数据库

picture.image

背景

弹性网络是一种结合岭回归(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)
      

picture.image

通过弹性网络交叉验证自动选择最佳超参数,并筛选出在最佳模型中具有显著贡献的特征

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()
      

picture.image

通过绘制水平条形图展示了弹性网络特征选择的结果,其中横轴为特征系数的大小,纵轴为被选择的特征,图中显示了模型认为重要的特征及其相对影响力,特征 X_9 对模型贡献最大

弹性网络系数路径图的绘制

picture.image

系数路径图展示了弹性网络在不同正则化强度(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)
      

picture.image

使用之前通过ElasticNetCV获得的最佳参数 (alpha 和 l1_ratio) 构建 ElasticNet 模型,可以看到模型的系数路径图与先前的结果完全一致,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

🎁 赠书活动来啦! 🎁

picture.image

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需

点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《R语言数据可视化:科技图表绘制》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

SCI图表复现:如何直观展示机器学习模型预测结果的准确性和一致性

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论