专栏首页机器学习与统计学机器学习算法之岭回归、Lasso回归和ElasticNet回归

机器学习算法之岭回归、Lasso回归和ElasticNet回归

作者:biaodianfu https://www.biaodianfu.com/ridge-lasso-elasticnet.html

在处理较为复杂的数据的回归问题时,普通的线性回归算法通常会出现预测精度不够,如果模型中的特征之间有相关关系,就会增加模型的复杂程度。当数据集中的特征之间有较强的线性相关性时,即特征之间出现严重的多重共线性时,用普通最小二乘法估计模型参数,往往参数估计的方差太大,此时,求解出来的模型就很不稳定。在具体取值上与真值有较大的偏差,有时会出现与实际意义不符的正负号。

在线性回归中如果参数

过大、特征过多就会很容易造成过拟合,如下如所示:

正则化

岭回归与Lasso回归的出现是为了解决线性回归出现的过拟合以及在通过正规方程方法求解

的过程中出现的

不可逆这两类问题的,这两种回归均通过在损失函数中引入正则化项来达到目的。

在日常机器学习任务中,如果数据集的特征比样本点还多,

的时候会出错。岭回归最先用来处理特征数多于样本数的情况,现在也用于在估计中加入偏差,从而得到更好的估计。这里通过引入

限制了所有

之和,通过引入该惩罚项,能够减少不重要的参数,这个技术在统计学上也叫作缩减(shrinkage)。和岭回归类似,另一个缩减LASSO 也加入了正则项对回归系数做了限定。

为了防止过拟合(

过大),在目标函数

\theta

后添加复杂度惩罚因子,即正则项来防止过拟合。正则项可以使用L1-norm(Lasso)、L2-norm(Ridge),或结合L1-norm、L2-norm(Elastic Net)。

Lasso:使用L1-norm正则

Ridge:使用L2-norm正则

ElasticNet:结合l1-norm、l2-norm进行正则

简单的理解正则化:

  1. 正则化的目的:防止过拟合
  2. 正则化的本质:约束(限制)要优化的参数

关于第1点,过拟合指的是给定一堆数据,这堆数据带有噪声,利用模型去拟合这堆数据,可能会把噪声数据也给拟合了,这点很致命,一方面会造成模型比较复杂,另一方面,模型的泛化性能太差了,遇到了新的数据让你测试,你所得到的过拟合的模型,正确率是很差的。

关于第2点,本来解空间是全部区域,但通过正则化添加了一些约束,使得解空间变小了,甚至在个别正则化方式下,解变得稀疏了。这一点不得不提到一个图,相信我们都经常看到这个图,但貌似还没有一个特别清晰的解释,这里我尝试解释一下,图如下:

上图中左边为Lasso回归,右边为岭回归。红色的椭圆和蓝色的区域的切点就是目标函数的最优解,我们可以看到,如果是圆,则很容易切到圆周的任意一点,但是很难切到坐标轴上,因此没有稀疏;但是如果是菱形或者多边形,则很容易切到坐标轴上,因此很容易产生稀疏的结果。这也说明了为什么L1范式会是稀疏的。这样就解释了为什么lasso可以进行特征选择。岭回归虽然不能进行特征筛选,但是对

的模做约束,使得它的数值会比较小,很大程度上减轻了overfitting的问题。

这里的

都是模型的参数,要优化的目标参数,蓝色部分区域,其实就是解空间,正如上面所说,这个时候,解空间“缩小了”,你只能在这个缩小了的空间中,寻找使得目标函数最小的

。再看看那红色的圆圈,再次提醒大家,这个坐标轴和特征(数据)没关系,它完全是参数的坐标系,每一个圆圈上,可以取无数个

,这些

有个共同的特点,用它们计算的目标函数值是相等的。那个红色的圆心,就是实际最优参数,但是由于我们对解空间做了限制,所以最优解只能在“缩小的”解空间中产生。

以两个变量为例,解释岭回归的几何意义:

1、没有约束项时。模型参数

已经经过标准化。残差平方和RSS可以表示为

的一个二次函数,数学上可以用一个抛物面表示。

2、岭回归时。约束项为

,对应着投影为

平面上的一个圆,即下图中的圆柱。

可见岭回归解与原先的最小二乘解是有一定距离的。

使用Scikit-Learn进行岭回归、Lasso回归和ElasticNet回归

岭回归

岭(Ridge)回归再普通最小二乘法的损失函数中增加了额外的缩减惩罚项,以限制L2范数的平方项。

在这种情况下,X是将所有样本作为列向量的矩阵,w表示权重向量。系数

表示正则化的强弱正则化。

from sklearn.linear_model import Ridgefrom sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_splitboston = load_boston()X = boston.datay = boston.target# 把数据分为训练数据集和测试数据集(20%数据作为测试数据集)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)model = Ridge(alpha=0.01, normalize=True)model.fit(X_train, y_train)train_score = model.score(X_train, y_train)  # 模型对训练样本得准确性test_score = model.score(X_test, y_test)  # 模型对测试集的准确性print(train_score)print(test_score)

其中alpha的值为岭系数,scikit-learn提供了类RidgeCV,它可以自动执行网格搜索,来寻找最佳值:

from sklearn.linear_model import RidgeCVfrom sklearn.datasets import load_bostonfrom sklearn.model_selection import train_test_split
boston = load_boston()X = boston.datay = boston.target
# 把数据分为训练数据集和测试数据集(20%数据作为测试数据集)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=3)
model = RidgeCV(alphas=[1.0, 0.5, 0.1, 0.05, 0.01, 0.005, 0.001, 0.0005, 0.0001], normalize=True)model.fit(X_train, y_train)
print(model.alpha_)

Lasso回归

Lasso回归加入w的L1范数作为惩罚项,以确定系数中的数目较多的无用项(零值):

具体代码与Ridge回归类似,这里不再复述。

ElasticNet回归

ElasticNet将Lasso和Ridge组成一个具有两种惩罚因素的单一模型:一个与L1范数成比例,另外一个与L2范数成比例。使用这种方式方法所得到的模型就像纯粹的Lasso回归一样稀疏,但同时具有与岭回归提供的一样的正则化能力。它的损失函数是:

从上面的公式可知,ElasticNet使用时需要提供

两个参数。在

中参数的名称为l1_ratio:

from sklearn.datasets import load_bostonfrom sklearn.linear_model import LassoCV, ElasticNetCV
boston = load_boston()
# Find the optimal alpha value for Lasso regressionlscv = LassoCV(alphas=(1.0, 0.1, 0.01, 0.001, 0.005, 0.0025, 0.001, 0.00025), normalize=True)lscv.fit(boston.data, boston.target)print('Lasso optimal alpha: %.3f' % lscv.alpha_)
# Find the optimal alpha and l1_ratio for Elastic Netencv = ElasticNetCV(alphas=(0.1, 0.01, 0.005, 0.0025, 0.001), l1_ratio=(0.1, 0.25, 0.5, 0.75, 0.8), normalize=True)encv.fit(boston.data, boston.target)print('ElasticNet optimal alpha: %.3f and L1 ratio: %.4f' % (encv.alpha_, encv.l1_ratio_))

参考链接:

  • https://esl.hohoweiya.xyz/03-Linear-Methods-for-Regression/3.4-Shrinkage-Methods/index.html
  • http://python.jobbole.com/88799/

本文分享自微信公众号 - 机器学习与统计学(tjxj666),作者:biaodianfu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【MATLAB 从零到进阶】day13 方差分析(下)

    把样本数据的总离差平方和分解为:各因素主效应离差平方和、交互效应离差平方和、随机因素的离差平方和。根据平方和及自由度分解方式构造检验统计量,对各因素主效应、交互...

    统计学家
  • Excel表格中最经典的36个小技巧,全在这儿了

    技巧1、单元格内强制换行 技巧2、锁定标题行 技巧3、打印标题行 技巧4、查找重复值 技巧5、删除重复值 技巧6、快速输入对号√ 技巧7、万元显示 技巧8、隐藏...

    统计学家
  • 100天搞定机器学习|Day21 Beautiful Soup

    网络爬虫,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。通俗来说就是模拟用户在浏览器上的操作,从特定网站,自动提取对自己有价值的信息。主要通过查找域...

    统计学家
  • 从左关联到数据维度的思考 原

    在a 的结果集,用了group by ,其实相当于将表“降维”了。假如原来1000行,现在分组后结果集变为100行了。 在b 的结果集,没用group by ...

    申君健
  • MacBook安装Python

    安装homebrew:bash 下执行 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Home...

    py3study
  • 读懂一行Full GC日志(回复JVM内存分配担保机制一文中 Mr/Mrs Xxx 在留言区提出的问题)

    回复JVM内存分配担保机制一文中 Mr/Mrs Xxx 在留言区提出的问题: “请问分配3M的时候,怎么还发生了full gc?” 回复如下: 发生Full ...

    ImportSource
  • 干货 | 为了给你更好的体验,携程做了个“一站式”客服机器人

    经纬,从事客服机器人的算法研发工作,专注于nlp领域的算法研究和应用,喜欢数据和场景驱动的算法研发。

    携程技术
  • HTML5多线程与离线存储

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。 HTML5引入了应用程序缓存,这意味着 web 应用可...

    踏浪
  • 【直播】我的基因组 33:用samstat软件对sam文件做统计

    在此之前,我不止一次强调过QC的重要性,对全基因组测序等以找variation为主的分析流程来说,不仅仅是对测序数据的QC,还有比对之后的sam/bam文件也需...

    生信技能树
  • rtsp转rtmp、hls网页直播服务器EasyNVR前端兼容性调试:ie下的 pointer-events: none

    这个属性设置 很好的在chrome中完成了需求。但是在IE中似乎就没有能够完成自己应有的任务了。 结合:

    EasyNVR

扫码关注云+社区

领取腾讯云代金券