弹性网络回归(Elastic Net Regression)详解与实践
创作时间:
作者:
@小白创作中心
弹性网络回归(Elastic Net Regression)详解与实践
引用
CSDN
1.
https://blog.csdn.net/qq_44133607/article/details/140480408
弹性网络回归(Elastic Net Regression)是一种结合了岭回归(Ridge Regression)和Lasso回归(Lasso Regression)优点的线性回归方法。它通过引入两个正则化参数,既能实现特征选择,又能保持模型稳定性。本文将详细介绍弹性网络回归的理论知识、数学公式推导、实施步骤以及参数解读,并通过实际代码示例展示其应用效果。
理论背景
弹性网络回归结合了岭回归(Ridge Regression)和Lasso回归(Lasso Regression)的优点,通过引入两个正则化参数来实现特征选择和模型稳定性。它解决了Lasso在处理高相关特征时的缺陷,并且在处理高维数据时表现优异。
数学公式
Elastic Net回归的损失函数如下:
目标函数:Elastic Net的目标函数是均方误差(MSE)和两个正则化项的加权和。
梯度下降:通过梯度下降法求解目标函数的最小值,更新回归系数。
特征选择:L1正则化项可以将一些回归系数缩小为零,从而实现特征选择。
模型稳定性:L2正则化项增加了模型的稳定性,减少过拟合。
实施步骤
数据预处理:标准化或归一化数据。
拆分数据集:将数据集拆分为训练集和测试集。
模型训练:使用Elastic Net回归模型进行训练。
模型评估:使用测试集评估模型性能。
参数解读
未优化模型实例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 生成示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1) * 0.5
# 数据分割为训练集和测试集
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_train 和 y_test 为一维数组
y_train = y_train.ravel()
y_test = y_test.ravel()
# 创建Elastic Net回归模型
elastic_net = ElasticNet(alpha=1.0, l1_ratio=0.5)
elastic_net.fit(X_train_scaled, y_train)
# 进行预测
y_pred = elastic_net.predict(X_test_scaled)
# 模型评估
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
print(f"R^2 Score: {r2}")
print(f"Intercept: {elastic_net.intercept_}")
print(f"Coefficients: {elastic_net.coef_}")
# 可视化结果
plt.scatter(X_test, y_test, color='blue', label='Actual')
plt.plot(X_test, y_pred, color='red', label='Predicted')
plt.xlabel("X")
plt.ylabel("y")
plt.title("Elastic Net Regression")
plt.legend()
plt.show()
结果解释
- Mean Squared Error (MSE): 表示预测值与实际值之间的平均平方误差。值越小,模型性能越好。
- R^2 Score: 决定系数,度量模型的拟合优度。值越接近1,模型解释力越强。
- Intercept: 截距,表示回归方程在y轴上的截距。
- Coefficients: 回归系数,表示自变量对因变量的影响。
优化后的模型实例
from sklearn.linear_model import ElasticNetCV
# 创建带交叉验证的Elastic Net回归模型
elastic_net_cv = ElasticNetCV(alphas=np.logspace(-6, 6, 13), l1_ratio=np.linspace(0.1, 1.0, 10), cv=5)
elastic_net_cv.fit(X_train_scaled, y_train)
# 进行预测
y_pred_cv = elastic_net_cv.predict(X_test_scaled)
# 模型评估
mse_cv = mean_squared_error(y_test, y_pred_cv)
r2_cv = r2_score(y_test, y_pred_cv)
print(f"Best Alpha: {elastic_net_cv.alpha_}")
print(f"Best L1 Ratio: {elastic_net_cv.l1_ratio_}")
print(f"Mean Squared Error (CV): {mse_cv}")
print(f"R^2 Score (CV): {r2_cv}")
print(f"Intercept (CV): {elastic_net_cv.intercept_}")
print(f"Coefficients (CV): {elastic_net_cv.coef_}")
# 可视化结果
plt.scatter(X_test, y_test, color='blue', label='Actual')
plt.plot(X_test, y_pred_cv, color='red', label='Predicted')
plt.xlabel("X")
plt.ylabel("y")
plt.title("Elastic Net Regression with Cross-Validation")
plt.legend()
plt.show()
结果解释
- Best Alpha: 通过交叉验证选择的最佳正则化参数。
- Best L1 Ratio: 通过交叉验证选择的最佳L1正则化比例。
- Mean Squared Error (CV): 交叉验证后的均方误差。
- R^2 Score (CV): 交叉验证后的决定系数。
- Intercept (CV): 交叉验证后的截距。
- Coefficients (CV): 交叉验证后的回归系数。
通过比较两个实例,可以看出优化后的模型通过交叉验证选择了最佳的正则化参数,从而提高了模型的预测性能和泛化能力。
热门推荐
【父母必读】如何鼓励孩子自己写作业
适合南美缸养的 6 种鱼,你喜欢哪种?
女性小腹坠痛怎么办?5个缓解方法+预防建议
拖延症终结者:5个方法让你即刻行动
落头民:一个传说中的民族是否存在?
低成本解锁金门深度游,公共交通带你领略海岛风情
如何优化居住环境的采光与通风?这种优化如何提升生活舒适度?
高铁为什么禁止乘客吸烟?会造成什么后果?
五大必玩模拟经营游戏推荐:打造属于你的虚拟世界,体验高自由度和丰富剧情
鹰嘴豆的功效与作用有哪些
2024年海南三亚元旦狂欢:全景旅游攻略与必玩亮点指南
罚款、情节较重的拘留!高铁动车上为什么不能吸烟?有什么危害?
黄焖鸡烹饪技巧与营养分析
罚款、情节较重的拘留!高铁动车上为什么不能吸烟?有什么危害?
鼓励孩子尝试,勇敢迈出第一步
自闭症谱系障碍:症状、原因与研究进展
新生儿护理:守护新生天使的全方位指南
《英勇之地》评测:沙盒与副本的完美融合
关爱无界:探索艾滋病人失禁背后的挑战与应对策略
郑州高楼撒钱女子悲剧:揭露背后社会压力
唇炎的六大类型与症状表现
新鲜玉米放冷藏还是冷冻?
玉米熟的保存还是生的保存?教你几个技巧,放一年味道也不变
唇炎最简单的恢复办法
黄陂湖:莲花水国,候鸟天堂
深入探讨AI:多角度解析人工智能的发展、应用与影响
Omega-3是什么?功效、食物来源及推荐摄取量全解析
如何跟进团队数据沟通
《鬼谷八荒》手游物品出售攻略:六种实用交易方法详解
发热39度不退?解决方法在这!