根据线性回归模型的参数估计公式 β=(X′X)−1X′y\beta=(X'X)^{-1}X'yβ=(X′X)−1X′y 可知,得到 β\betaβ 的前提是 (X′X)−1(X'X)^{-1}(X′X)−1 必须不为零,即可逆。但在实际应用中,可能会出现自变量个数多于样本量,或者自变量间存在多重共线性的情况,此时 X′X=0X'X=0X′X=0 ,将无法再根据公式计算出回归系数的估计值β\betaβ.

岭回归与LASSO回归

  • 一、岭回归模型
    • 01 模型概述
    • 02 代码实现
  • 二、LASSO回归模型
    • 01 模型概述
  • 三、代码

一、岭回归模型

01 模型概述

为解决多元线性回归模型中可能存在的不可逆问题,提出了岭回归模型。该模型解决思路就是,在线性回归模型的目标函数上添加l2l2l2正则项(惩罚项)
J(β)=∑(y−Xβ)2+λ∣∣β∣∣22=∑(y−Xβ)2+∑λβ2J(\beta)=\sum(y-X\beta)^2+\lambda||\beta||_2^2=\sum(y-X\beta)^2+\sum\lambda\beta^2 J(β)=∑(y−Xβ)2+λ∣∣β∣∣22​=∑(y−Xβ)2+∑λβ2
在线性回归模型的目标函数中添加l2正则项,其中λ\lambdaλ为非负数。当λ=0\lambda=0λ=0 时目标函数退化为线性回归模型的目标函数,当λ→+∞\lambda\rightarrow+\infinλ→+∞ 时,通过缩减回归系数使 β\betaβ 趋向于0

另外,λ\lambdaλ是l2l2l2正则项的平方数,用于平衡模型方差(回归系数的方差)和偏差。

系数求解如下:

展开岭回归模型中的平方项
J(β)=(y−Xβ)′(y−Xβ)+λβ′β=y′y−y′Xβ−β′X′y+β′X′Xβ+λβ′βJ(\beta)=(y-X\beta)'(y-X\beta)+\lambda\beta'\beta=y'y-y'X\beta-\beta'X'y+\beta'X'X\beta+\lambda\beta'\beta J(β)=(y−Xβ)′(y−Xβ)+λβ′β=y′y−y′Xβ−β′X′y+β′X′Xβ+λβ′β
计算导函数
∂J(β)∂β=2(X′X+λI)β−2X′y\frac{\partial J(\beta)}{\partial \beta}=2(X'X+\lambda I)\beta-2X'y ∂β∂J(β)​=2(X′X+λI)β−2X′y
参数求解
2(X′X+λI)β−2X′y=0∴β=(X′X+λI)−1X′y2(X'X+\lambda I)\beta-2X'y=0\\\therefore\beta=(X'X+\lambda I)^{-1}X'y 2(X′X+λI)β−2X′y=0∴β=(X′X+λI)−1X′y
其中需要注意的是 λ\lambdaλ 值的确定,这里采用交叉验证法:

首先将数据集拆分为k个样本量大体相等的数据组,并且每个数据组与其他组都没有重叠的观测。然后从k组数据中挑选k-1组数据用于模型的训练,剩下的一组数据用于模型的测试。以此类推,将会得到k中训练集和测试集。在每一种训练集和测试集下,都会对应一个模型及模型得分(如均方误差)。

python提供 RidgeCV(alphas = (0.1,1.0,10), fit_intercept=True, normalize=False, scoring=None, cv=None) 函数提供交叉验证法来确定λ\lambdaλ的值

  • alphas:指定多个lambda值的元组或数组对象,默认该参数包含0.1、1、10三种值
  • fit_intercept:是否需要拟合截距项,默认为True
  • normalize:建模时是否需要对数据集做标准化处理,默认为False
  • scoring:指定用于评估模型的度量方法
  • cv:指定交叉验证的重数。

02 代码实现

import pandas as pd
import numpy as np
from sklearn.linear_model import Ridge,RidgeCV   # Ridge岭回归,RidgeCV带有广义交叉验证的岭回归# 导入数据
data = pd.read_excel(r'diabetes.xlsx')
X_train = data[['AGE','SEX','BMI','BP','S1','S2','S3']]
y_train = data['Y']
# 运用等比数列构造200个不同的Lambda值
Lambdas = np.logspace(-5,2,200)
# 设置交叉验证的参数,对于每一个Lambda值,都执行10重交叉验证
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error',cv = 10)
# 模型拟合
ridge_cv.fit(X_train, y_train)
# 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_
ridge_best_Lambda

得到最佳的λ\lambdaλ值为0.0090110182516650178

# 基于最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True)
ridge.fit(X_train, y_train)
# 返回岭回归系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist())

结果如下:

Intercept   -61.021183
AGE           0.078594
SEX         -21.941443
BMI           6.240046
BP            1.234446
S1            1.143375
S2           -1.207391
S3           -2.344764
dtype: float64

即:y = -61.021183 + 0.078594AGE - 21.941443SEX + 6.240046BMI + 1.234446BP + 1.143375S1 - 1.207391S2 - 2.344764S3

二、LASSO回归模型

01 模型概述

​ 岭回归模型解决线性回归模型中矩阵X’X不可逆的办法是添加I2正则的惩罚项,但缺陷在于始终保留建模时的所有变量,无法降低模型的复杂度。对于此,Lasso回归采用了l1正则的惩罚项。
J(β)=∑(y−Xβ)2+λ∣∣β∣∣1=∑(y−Xβ)2+∑λ∣β∣J(\beta)=\sum(y-X\beta)^2+\lambda||\beta||_1=\sum(y-X\beta)^2+\sum\lambda|\beta| J(β)=∑(y−Xβ)2+λ∣∣β∣∣1​=∑(y−Xβ)2+∑λ∣β∣
对于Lasso回归模型中λ\lambdaλ值的确定,提供函数 LassoCV(alphas=None, fit_intercept=True, normalize=False, max_iter=1000, tol=0.0001)

  • max_iter:指定模型最大的迭代次数,默认为1000次
  • tol:指定误差收敛范围

三、代码

# 导入第三方模块
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import Ridge,RidgeCV
import matplotlib.pyplot as plt# 读取数据集
diabetes = pd.read_excel(r'diabetes.xlsx', sep = '')
# 构造自变量(剔除性别、年龄和因变量)
predictors = diabetes.columns[2:-1]
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes[predictors], diabetes['Y'], test_size = 0.2, random_state = 1234)

岭回归:

# 构造不同的Lambda值
Lambdas = np.logspace(-5, 2, 200)
# 岭回归模型的交叉验证
# 设置交叉验证的参数,对于每一个Lambda值,都执行10重交叉验证
ridge_cv = RidgeCV(alphas = Lambdas, normalize=True, scoring='neg_mean_squared_error', cv = 10)
# 模型拟合
ridge_cv.fit(X_train, y_train)
# 返回最佳的lambda值
ridge_best_Lambda = ridge_cv.alpha_
ridge_best_Lambda

λ\lambdaλ= 0.013509935211980266

# 导入第三方包中的函数
from sklearn.metrics import mean_squared_error
# 基于最佳的Lambda值建模
ridge = Ridge(alpha = ridge_best_Lambda, normalize=True)
ridge.fit(X_train, y_train)
# 返回岭回归系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [ridge.intercept_] + ridge.coef_.tolist())
# 预测
ridge_predict = ridge.predict(X_test)
# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,ridge_predict))
RMSE

RSM= 53.12361694661972

Lasso回归:

# 导入第三方模块中的函数
from sklearn.linear_model import Lasso,LassoCV
# LASSO回归模型的交叉验证
lasso_cv = LassoCV(alphas = Lambdas, normalize=True, cv = 10, max_iter=10000)
lasso_cv.fit(X_train, y_train)
# 输出最佳的lambda值
lasso_best_alpha = lasso_cv.alpha_
lasso_best_alpha

λ\lambdaλ = 0.062949889902218878

# 基于最佳的lambda值建模
lasso = Lasso(alpha = lasso_best_alpha, normalize=True, max_iter=10000)
lasso.fit(X_train, y_train)
# 返回LASSO回归的系数
pd.Series(index = ['Intercept'] + X_train.columns.tolist(),data = [lasso.intercept_] + lasso.coef_.tolist())# 预测
lasso_predict = lasso.predict(X_test)
# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,lasso_predict))
RMSE

RMSE = 53.06143725822573

线性回归:

# 导入第三方模块
from statsmodels import api as sms
# 为自变量X添加常数列1,用于拟合截距项
X_train2 = sms.add_constant(X_train)
X_test2 = sms.add_constant(X_test)# 构建多元线性回归模型
linear = sms.OLS(y_train, X_train2).fit()
# 返回线性回归模型的系数
linear.params# 模型的预测
linear_predict = linear.predict(X_test2)
# 预测效果验证
RMSE = np.sqrt(mean_squared_error(y_test,linear_predict))
RMSE

RMSE = 53.426239397229892

故此数据集应采用Lasso回归拟合最好。

数据分析 | 岭回归与LASSO回归相关推荐

  1. [机器学习] - 岭回归与Lasso回归

    注:在学习机器学习中回归算法时,随时都会接触最小二乘法原理和求解过程,最小二乘法可能对于理工科的学生低头不见抬头见的知识点,特点是在我学习<数值分析>课程中,老师讲了些最小二乘法的历史[- ...

  2. 基于Python的岭回归与LASSO回归模型介绍及实践

    基于Python的岭回归与LASSO回归模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 岭 ...

  3. 【sklearn】线性回归、最小二乘法、岭回归、Lasso回归

    文章目录 机器学习的sklearn库 一.回归分析 <1.1>线性回归 1.1.1.Python实现线性回归 <1.2>最小二乘法 1.2.1.MATLAB实现最小二乘法 1. ...

  4. 关于岭回归和lasso回归

    1. 岭回归 岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放 ...

  5. 应用预测建模第六章线性回归习题6.3【缺失值插补,分层抽样,预测变量重要性,重要预测变量如何影响响应变量,多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网】

    模型:多元线性回归,稳健回归,偏最小二乘回归,岭回归,lasso回归,弹性网 语言:R语言 参考书:应用预测建模 Applied Predictive Modeling (2013) by Max K ...

  6. 一文读懂线性回归、岭回归和Lasso回归

    (图片由AI科技大本营付费下载自视觉中国) 作者 | 文杰 编辑 | yuquanle 本文介绍线性回归模型,从梯度下降和最小二乘的角度来求解线性回归问题,以概率的方式解释了线性回归为什么采用平方损失 ...

  7. 岭回归与Lasso回归

    线性回归的一般形式 过拟合问题及其解决方法 问题:以下面一张图片展示过拟合问题 解决方法:(1):丢弃一些对我们最终预测结果影响不大的特征,具体哪些特征需要丢弃可以通过PCA算法来实现:(2):使用正 ...

  8. 岭回归和lasso回归_正则化(2):与岭回归相似的 Lasso 回归

    Lasso回归与ridge回归有很多相似之处,但是二者之间有一些显著的区别.如果你不太清楚岭回归,请参考前一章节推文:通俗易懂的岭回归. 1 lasso回归 与 ridge 回归的相同点 1.1 la ...

  9. 【机器学习】正则化的线性回归 —— 岭回归与Lasso回归

    python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...

最新文章

  1. 华人“霸榜”ACL最佳长短论文、杰出论文一作,华为、南理工等获奖
  2. 使用jenkins进行持续集成
  3. 【控制】二阶 UGV 的无穷时间状态输入性能最优解算
  4. 如何设置鼠标滚轮html,win7如何设置鼠标滚轮
  5. 【转】1.1异步编程:线程概述及使用
  6. 打印网页时背景图片的问题
  7. matlab实现谱聚类法图像分割代码,一种基于谱聚类的图像分割方法与系统与流程...
  8. php如何对mysql加锁_PHP+MySQL高并发加锁事务处理问题解决方法
  9. 怎么学好python leetcode的题目太难了_为什么leetcode中的python解法过于pythonic,而忽略了算法题主要关注的复杂度问题?...
  10. dll中使用dialogbox_玩游戏丢失dll文件别着急 认识这些就妥了
  11. SQL JOIN TABLES:在SQL Server中使用查询
  12. 非标准语法;请使用 _国际汉语教学中 语法点讲解的具体方法
  13. Atmega128串口详解
  14. Urgent VS Relex
  15. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-Web部分
  16. 单兵渗透工具-Yakit-Windows安装使用
  17. VS2008 Debug Error R6034
  18. 利用R语言制作好看的Meta分析文献偏倚风险图
  19. 关于电子产品克隆,PCB抄板与芯片解密缺一不可!
  20. [网鼎杯 2020 玄武组]SSRFMe【redis主从复制ssrf】

热门文章

  1. 当年明月《明朝那些事儿》读书笔记
  2. alert弹出[object Object]解决方法
  3. Spark ML特征的提取、转换和选择
  4. Robotframework自动化测试框架
  5. 百度搜索广告投放的展现位置!百度推广广告是如何扣费的?
  6. 计算机组成原理 十套,计算机组成原理十套卷答案白中英(74页)-原创力文档...
  7. 网页内嵌编辑器ueditor的使用
  8. 自制html5拖拽功能实现的拼图游戏
  9. TM1637驱动4位时钟数码管的Arduino 程序
  10. python EOFError: marshal data too short问题处理