弹性网络回归(Elastic Net Regression)

弹性网络回归(Elastic Net Regression)的详细理论知识推导

理论背景

弹性网络回归结合了岭回归(Ridge Regression)和Lasso回归(Lasso Regression)的优点,通过引入两个正则化参数来实现特征选择和模型稳定性。它解决了Lasso在处理高相关特征时的缺陷,并且在处理高维数据时表现优异。

数学公式

Elastic Net回归的损失函数如下:

其中:

推导

目标函数:Elastic Net的目标函数是均方误差(MSE)和两个正则化项的加权和。

梯度下降:通过梯度下降法求解目标函数的最小值,更新回归系数。

特征选择:L1正则化项可以将一些回归系数缩小为零,从而实现特征选择。

模型稳定性:L2正则化项增加了模型的稳定性,减少过拟合。

实施步骤

数据预处理:标准化或归一化数据。

拆分数据集:将数据集拆分为训练集和测试集。

模型训练:使用Elastic Net回归模型进行训练。

模型评估:使用测试集评估模型性能。

参数解读

未优化模型实例

python 复制代码
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: 回归系数,表示自变量对因变量的影响。

优化后的模型实例

python 复制代码
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): 交叉验证后的回归系数。

通过比较两个实例,可以看出优化后的模型通过交叉验证选择了最佳的正则化参数,从而提高了模型的预测性能和泛化能力。

相关推荐
陈广亮11 分钟前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬20 分钟前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia1 小时前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区1 小时前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两4 小时前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪4 小时前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232554 小时前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源
王鑫星4 小时前
SWE-bench 首次突破 80%:Claude Opus 4.5 发布,Anthropic 的野心不止于写代码
人工智能
lnix4 小时前
当“大龙虾”养在本地:我们离“反SaaS”的AI未来还有多远?
人工智能·aigc