当前位置: 首页 > article >正文

【机器学习】线性回归正则化的概念、三种正则化方法的优缺点、使用场景以及在python中的实例

引言

线性回归的正则化扩展是指在最小二乘法的基础上,通过引入惩罚项来改进线性回归模型的估计

文章目录

  • 引言
  • 一、线性回归的正则化
    • 1.1 定义
    • 1.2 常见的线性回归正则化扩展方法
      • 1.2.1 岭回归(Ridge Regression)
      • 1.2.2 LASSO回归(Least Absolute Shrinkage and Selection Operator)
      • 1.2.3 Elastic-Net回归(Elastic-Net Regularization)
    • 1.3 总结
  • 二、正则化方法的优缺点
    • 2.1 岭回归(Ridge Regression)
      • 2.1.1 优点
      • 2.1.2 缺点
    • 2.2 LASSO回归(Least Absolute Shrinkage and Selection Operator)
      • 2.2.1 优点
      • 2.2.2 缺点
    • 2.3 Elastic-Net回归(Elastic-Net Regularization)
      • 2.3.1 优点
      • 2.3.2 缺点
    • 2.4 总结
  • 三、正则化方法使用场景
    • 3.1 岭回归
    • 3.2 LASSO回归
    • 3.3 Elastic-Net回归
    • 总结
  • 四、正则化在python中的实例
    • 4.1 使用statsmodels
    • 4.2 使用scikit-learn

在这里插入图片描述

一、线性回归的正则化

1.1 定义

线性回归的正则化扩展可以帮助解决最小二乘法中的一些问题,如过拟合、多重共线性等

1.2 常见的线性回归正则化扩展方法

1.2.1 岭回归(Ridge Regression)

  • 原理:岭回归通过在最小二乘法的目标函数中添加一个 L 2 L2 L2正则化项(即岭罚),来解决多重共线性问题
  • 目标函数:岭回归的目标函数为:
    S ridge = 1 2 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 k β j 2 S_{\text{ridge}} = \frac{1}{2n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{k} \beta_j^2 Sridge=2n1i=1n(yiy^i)2+λj=1kβj2
    • λ \lambda λ是正则化参数,用于控制正则化强度
    • β j \beta_j βj是回归系数
  • 正规方程:岭回归的正规方程为:
    β = ( X T X + λ I ) − 1 X T Y \beta = (X^TX + \lambda I)^{-1}X^TY β=(XTX+λI)1XTY
    • I I I是单位矩阵
  • 作用:岭回归可以稳定回归系数估计,减少多重共线性对模型的影响

1.2.2 LASSO回归(Least Absolute Shrinkage and Selection Operator)

  • 原理:LASSO回归通过在最小二乘法的目标函数中添加一个 L 1 L1 L1正则化项(即LASSO罚),不仅解决多重共线性问题,还能自动进行特征选择
  • 目标函数:LASSO回归的目标函数为:
    S lasso = 1 2 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ ∑ j = 1 k ∣ β j ∣ S_{\text{lasso}} = \frac{1}{2n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{k} |\beta_j| Slasso=2n1i=1n(yiy^i)2+λj=1kβj
  • 正规方程:LASSO回归的正规方程为:
    β = ( X T X + λ I ) − 1 X T Y \beta = (X^TX + \lambda I)^{-1}X^TY β=(XTX+λI)1XTY
  • 作用:LASSO回归可以同时估计回归系数并选择重要的特征,适用于特征数量远大于样本数量的情况

1.2.3 Elastic-Net回归(Elastic-Net Regularization)

  • 原理:Elastic-Net回归结合了LASSO和岭回归的特点,通过同时添加L1和L2正则化项,可以解决多重共线性问题并自动选择特征
  • 目标函数:Elastic-Net回归的目标函数为:
    S elastic-net = 1 2 n ∑ i = 1 n ( y i − y ^ i ) 2 + λ 1 ∑ j = 1 k ∣ β j ∣ + λ 2 ∑ j = 1 k β j 2 S_{\text{elastic-net}} = \frac{1}{2n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda_1 \sum_{j=1}^{k} |\beta_j| + \lambda_2 \sum_{j=1}^{k} \beta_j^2 Selastic-net=2n1i=1n(yiy^i)2+λ1j=1kβj+λ2j=1kβj2
    • KaTeX parse error: Can't use function '\)' in math mode at position 11: \lambda_1 \̲)̲ 和 \( \lambda_2是正则化参数,用于控制 L 1 L1 L1 L 2 L2 L2正则化的强度
  • 正规方程:Elastic-Net回归的正规方程为:
    β = ( X T X + λ 1 I + λ 2 I ) − 1 X T Y \beta = (X^TX + \lambda_1 I + \lambda_2 I)^{-1}X^TY β=(XTX+λ1I+λ2I)1XTY
  • 作用:Elastic-Net回归可以结合LASSO和岭回归的优点,适用于特征选择和多重共线性问题的解决

1.3 总结

正则化扩展方法在实际应用中可以根据具体问题选择合适的方法。它们可以提高模型的预测性能,并帮助解决线性回归中的一些常见问题

二、正则化方法的优缺点

正则化方法在机器学习和统计学中广泛使用,旨在通过引入惩罚项来改进模型的估计,减少过拟合的风险,并帮助处理多重共线性问题

2.1 岭回归(Ridge Regression)

2.1.1 优点

  • 能够稳定回归系数估计,减少多重共线性对模型的影响
  • 容易实现和解释

2.1.2 缺点

  • 可能会导致某些系数被过度惩罚,导致某些特征的系数接近零,但不会完全为零
  • 可能会导致模型变得复杂,特别是当特征数量远大于样本数量时

2.2 LASSO回归(Least Absolute Shrinkage and Selection Operator)

2.2.1 优点

  • 能够同时估计回归系数并选择重要的特征,自动进行特征选择
  • 适合处理高维数据,尤其是特征数量远大于样本数量的情况

2.2.2 缺点

  • 可能会导致某些特征的系数被完全惩罚为零,导致这些特征在模型中丢失
  • 模型复杂度可能会随着特征数量的增加而增加

2.3 Elastic-Net回归(Elastic-Net Regularization)

2.3.1 优点

  • 结合了LASSO和岭回归的优点,提供了一种更稳健的特征选择方法
  • 可以同时稳定回归系数估计并自动选择特征

2.3.2 缺点

  • 模型的复杂度可能会随着特征数量的增加而增加
  • 需要调整 L 1 L1 L1 L 2 L2 L2正则化的强度,这可能需要通过交叉验证等方法来确定

2.4 总结

  • 正则化方法在实际应用中可以根据具体问题选择合适的方法。它们可以提高模型的预测性能,并帮助解决线性回归中的一些常见问题
  • 选择合适的正则化方法需要根据数据的特性、模型的复杂度要求以及模型的解释性来权衡

三、正则化方法使用场景

选择哪种正则化方法取决于数据的特定特征和目标

3.1 岭回归

  • 如果主要问题是多重共线性,即自变量之间存在高度相关性,岭回归是一个很好的选择
  • 如果希望回归系数尽可能稳定,避免过大或过小的值,岭回归可以提供这种稳定性
  • 如果不希望自动减少特征数量,岭回归是一个不错的选择

3.2 LASSO回归

  • 如果希望自动减少特征数量,并且数据中有大量不相关的特征,LASSO回归是一个很好的选择
  • 如果想要一个模型,它不仅预测结果,还能选择最重要的特征,LASSO回归是一个很好的选择
  • 如果担心模型过拟合,LASSO回归可以帮助您通过减少特征数量来避免过拟合

3.3 Elastic-Net回归

  • 如果想要结合岭回归和LASSO回归的优点,Elastic-Net回归是一个很好的选择
  • 如果希望模型既能够稳定回归系数估计,又能够自动减少特征数量,Elastic-Net回归是一个很好的选择
  • 如果不确定哪些特征是重要的,Elastic-Net回归可以提供更多的灵活性,因为它允许调整 L 1 L1 L1 L 2 L2 L2正则化的强度

总结

在实际应用中,需要尝试不同的正则化参数值( λ \lambda λ λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2)和不同的正则化方法,以找到最适合数据的模型。此外,可能还需要考虑其他因素,如数据的噪声水平、特征的分布等

四、正则化在python中的实例

在Python中,正则化线性回归可以通过多种库实现,包括statsmodelsscikit-learnsklearn-contrib

以下是一些示例,展示了如何在Python中使用这些库来实现正则化线性回归

4.1 使用statsmodels

statsmodels库提供了线性回归模型的各种扩展,包括岭回归、LASSO回归和Elastic-Net回归

import statsmodels.api as sm
# 假设X是特征矩阵,y是目标向量
X = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y = [1, 2, 3]
# 添加截距项
X = sm.add_constant(X)
# 创建岭回归模型
model_ridge = sm.OLS(y, X).fit()
# 创建LASSO回归模型
model_lasso = sm.OLS(y, X).fit_regularized(method='l1', alpha=1.0)
# 创建Elastic-Net回归模型
model_elastic = sm.OLS(y, X).fit_regularized(method='elastic_net', alpha=0.5, l1_ratio=0.5)
# 打印模型摘要
print(model_ridge.summary())
print(model_lasso.summary())
print(model_elastic.summary())

4.2 使用scikit-learn

scikit-learn库也提供了线性回归的正则化版本

from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 假设X是特征矩阵,y是目标向量
X = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
y = [1, 2, 3]
# 添加截距项
X = sm.add_constant(X)
# 划分数据集
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)
# 创建正则化模型
model_ridge = Ridge(alpha=1.0)
model_lasso = Lasso(alpha=1.0)
model_elastic = ElasticNet(alpha=0.5, l1_ratio=0.5)
# 训练模型
model_ridge.fit(X_train_scaled, y_train)
model_lasso.fit(X_train_scaled, y_train)
model_elastic.fit(X_train_scaled, y_train)
# 预测
y_pred_ridge = model_ridge.predict(X_test_scaled)
y_pred_lasso = model_lasso.predict(X_test_scaled)
y_pred_elastic = model_elastic.predict(X_test_scaled)
# 评估模型
print(model_ridge.score(X_test_scaled, y_test))
print(model_lasso.score(X_test_scaled, y_test))
print(model_elastic.score(X_test_scaled, y_test))
  • 首先添加了截距项
  • 然后使用train_test_split函数将数据分为训练集和测试集
  • 接着,我们创建了岭回归、LASSO回归和Elastic-Net回归模型
  • 对它们进行了训练和预测
  • 最后,我们评估了这些模型的性能

http://www.kler.cn/a/282910.html

相关文章:

  • Linux 下 mysql 9.1 安装设置初始密码 【附脚本】
  • 如何在CentOS 7上搭建SMB服务
  • 【教程】Ubuntu设置alacritty为默认终端
  • 【AutoGen 】简介
  • MySQL高级(二):一条更新语句是如何执行的
  • 深度学习和图像处理
  • 关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)
  • <数据集>手部识别数据集<目标检测>
  • Qt WebSocket
  • 【论文阅读】YOLOv10: Real-Time End-to-End Object Detection
  • SQL 简易建库和增删改查
  • 【Redis】主从复制
  • 操作系统 --王道计算机考研--学习笔记
  • 海信电视与《黑神话 :悟空》合作,大屏端流畅游戏体验如何保障?
  • 构建自闭症解决之道:多维度策略的探索与实践
  • YOLOv8 训练15种动物目标检测模型
  • day03-面向对象-内部类泛型常用API
  • [底层原理] C/C++获取时间(将时间戳转换为年月日)?
  • EmguCV学习笔记 VB.Net 7.2 特征点检测
  • Java之内部类
  • 浅谈Kafka(三)
  • 深度学习基础--深度学习网络
  • 服务器内存飙升分析小记
  • PostgreSQL遍历所有的表并设置id为自增主键(基于自建函数)
  • FineReport帆软报表:使用JAVA批量更新报表里的数据集连接名
  • 【python量化分析专题】最新整理的已经实测可用的各类免费股票数据接口之实时交易数据