机器学习:正则化到底是怎么一回事?_zg1g的博客-程序员信息网

技术标签: 算法  python  机器学习  正则  

本文首发在《算法channel》公众号

在最近的推送中,先后总结了最小二乘法的原理,两个求解方法:直接法和梯度下降,最后利用这两种思路进行了python实战;之后阐述了OLS算法使用的前提是必须满足数据集无多重共线性,因为它是无偏估计,这也带来了它非常惧怕多重共线性问题,在面对这些数据时,它往往得到的权重参数方差大,是一个不稳定的回归算法。

工程应用中,你拿到的数据集可能有上百个特征维度,实际上是很难保证数据集中的所有维度都满足无共线性,所以OLS实际上没有太多的实际应用价值,它必须要想到一种办法解决多重共线性,进而过滤掉那些权重参数等于或接近于0的特征项,因为它们根本就对最终的标签值贡献不了任何东西,我们最终想要的结果是从这100个维度中,得到一些,可能最后只有10个特征,或个位数个特征是主要的影响标签值的特征,它们才是贡献最大的特征列。

要想达成这个目标,脊回归和套索回归出现了,它们无一例外的在OLS的基础上做了一定优化,发现都是加了一项,这一项就是大名鼎鼎的正则化项。

1 L1和L2正则化项

正则化项在机器学习中几乎无处不在,无一例外的都可以看到损失函数后面会添加一个额外项。

常用的额外项一般有两种,L1正则化和L2正则化 ,它们都可以看做是成本函数的惩罚项(指对成本函数中的参数做的一些限制)。

对于线性回归模型,在上篇推送中我们说到了套索回归,它是应用了L1正则化项,而脊回归应用了L2正则化项。L1正则化是指权重参数 w 中各个元素的绝对值之和,通常表示为 ||w||1;L2正则化是指 中各个元素的平方和然后再求平方根,通常表示为 ||w||2 。

一般都会在正则化项之前添加一个系数α,这在机器学习中称为超参数(权重参数以外的相关参数称为超参数)。

那么L1正则化项和L2正则化项到底是如何做到对成本函数的参数惩罚的呢? 它们到底起到什么作用呢?

2 L1和L2的作用

L1正则化可以产生稀疏权重参数矩阵,从而得到一个稀疏模型,这样表示为0的特征的贡献值为0,那么自然地我们会在这100个特征列中将这些过滤掉,只留下那些对因变量产生主要贡献的参数,简而言之,这样我们可以用L1正则化进行特征选择;同时一定程度上,L1可以防止过拟合。

L2正则化可以防止模型过拟合。

下面先初步看下L1和L2正则化项取值的图型,假定模型的主要两个权重参数分别为w1和w2,分别在Jupyter Notebook中写python代码模拟取值。

看下L1和L2的定义:

# 定义L1正则化项
def L1(w1, w2):
    return np.abs(w1) + np.abs(w2) 
# 定义L2正则化项
def L2(w1,w2):
    return (w1**2+w2**2)  

正则化项取值图:

import matplotlib.pyplot as plt
import numpy as np
# 数据数目
n = 256
# 定义x, y
x = np.linspace(-2, 2, n)
y = np.linspace(-2, 2, n)
# 生成网格数据
X, Y = np.meshgrid(x, y)
# 填充等高线的颜色, 6是等高线分为几部分
plt.contourf(X, Y, L2(X, Y),6,  alpha = 0.75, cmap = plt.cm.hot)
#C = plt.contour(X, Y, L2(X, Y), 6, colors = 'black', linewidth = 0.2)
plt.show()

L1正则化项取值的等高线图,两个坐标轴:w1,w2

这里写图片描述

L1正则化项取值的等高线图带有高度的图

这里写图片描述

L2正则化项取值的等高线图,两个坐标轴:w1,w2

这里写图片描述

L2正则化项取值的等高线图带有高度的图

这里写图片描述

从以上结果图中看到L1的等高线图是一个四边形(对于二维特征来说),L2是一个圆形。

3 L1如何做到稀疏

OLS的成本函数添加L1正则化项后,套索回归的成本函数变为了以上两项,其中前一项记为 costOLS,后一项记为 costL1。还是假定数据集的特征为二维:w1, w2,costOLS的等高线和 costL1的图如下所示:

这里写图片描述

当 costOLS 等值线与costL1 图形首次在一个顶点处相交,此处就是最成本函数最小值,注意到此时的权重参数 w1等于0,这不就是把2个特征稀疏到1个了吗!

当上升到参数含有多个时,costL1会有更对的角点出来,比如100维空间中,这样导致的一个直接结果便是costOLS 会率先与这些角点相碰的机率大于与其他部位相碰的机率,这就是为什么L1可以产生稀疏模型从而用于特征选择。

那么再聊聊超参数alfa对costL1图形的影响吧! alfa越小,表明正则化惩罚的力度越小,那么 costL1的面积就会越大,这样权重参数被稀疏的程度(等于0的个数)就越小;alfa 越大,惩罚力度越大,稀疏的程度就越大。

4 L2如何做到防止过拟合

从第二节的介绍中我们可以看到L2正则化的等高线是个圆形。相比于L1正则化的方形相比,自然地,costOLS与 L2 相交时使得 w1 或w2 等于零的机率会缩小,这样与L1正则相比,为什么 L2 稀疏能力不强大的原因。具体可以参考上节推送的例子:机器学习线性回归:谈谈多重共线性问题及相关算法,其中举例了直接调用sklearn API:OLS,Ridge, Lasso 三种回归,得到的权重参数比较。

但是L2正则化可以防止过拟合,L2正则化项通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。

可以设想一下对于一个线性回归方程,若参数很大(这个在之前的推送中:机器学习之线性回归:OLS 无偏估计及相关性python分析,机器学习线性回归:谈谈多重共线性问题及相关算法,多次看到OLS得到的权重参数会很大),那么只要数据偏移一点点,就会对结果造成很大的影响,OLS对多重共线性问题的抗扰动能力很差!

那么带L2正则化项的脊回归为什么得到的权重参数往往很小呢? 在前面的推送中我们已经知道OLS的梯度下降,参数的迭代公式如下:

这里写图片描述

在脊回归中,加了L2后的参数迭代公式优化为如下:

这里写图片描述

以上两个公式,并未引入学习率这个参数。

可以看到,每次迭代都会使参数比之前下降的快了,因为乘以了一个小于1的数,所以参数会更小些。

让我们看一下远边的大海,和海边优美的风景,先放松一下吧!

这里写图片描述

4 总结

以上详细总结了L1和L2正则化在机器学习中发挥的作用,文章以线性回归的正则化:脊回归和套索回归为例子,阐述了L1更擅长进行参数向量的稀疏化,而L2相比于L1更能防止过拟合的发生。

明天,我们开始总结机器学习中非常重要的,应用很广泛的逻辑回归了,欢迎您的关注!

谢谢您的阅读,期待您的到来。

欢迎关注《算法channel》

主要推送关于算法的分析过程及应用的消息。培养思维能力,注重过程,挖掘背后的原理,刨根问底。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注。

这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/daigualu/article/details/78557106

智能推荐

谷歌深度学习游乐场_Google的游乐场为Pixel相机带来了惊奇的角色(以及更多)_culingluan4376的博客-程序员信息网

谷歌深度学习游乐场Google’s new “Playground” brings more awesome-looking animated characters to the Pixel 3‘s camera. It’s an “evolution” of the older AR Stickers feature, according to Google. Google的新“游乐场”为Pi...

STM32H743 TFTP Boot 简录_weifengdq的博客-程序员信息网_stm32h743

文章目录stm32h743存储简况区域划分分散加载问题引出默认的分散加载文件修改分散加载文件CubeMX部分配置boot的jump_to_appapp中断向量表偏移app分散加载文件修改最简升级py脚本MCU处理参考stm32h743存储简况如下:2MB Flash, 分2个bank(存储区), 可在两个banks并行执行 读/编程/擦除 操作1 Flash_Word = 8 Words = 32 Bytes = 256 bits, 其实1 Flash_Word 还有额外的10bits ECC.

[云服务器实践] 将阿里云服务器的云盘数据迁移、拷贝到本地电脑_宇内虹游的博客-程序员信息网

文章目录前言参考文献环境详细实践过程前言今天向阿里云提交了工单,问题是:“想将云服务器中的数据(大约300G)从云服务器中导出或者下载到本地电脑。”,工程师在40min后给出了一个解决方案,在此实践一下,顺便记录一下过程。参考文献手动搭建FTP站点(CentOS 7)环境我的服务器是:Ubuntu 14.04详细实践过程在服务器上打开终端:sudo apt-get install vsftpdsudo apt-get install --reinstall systemd

mysql中怎样用join查询,MySQL中链接查询inner join与left join使用_weixin_40007541的博客-程序员信息网

连接查询其实就是对两个表记录做笛卡尔乘积。如果不指定连接条件的话,则会对每行都做笛卡尔乘积,这样最后返回的结果树就会是两个表记录数的乘积;如果指定则,则仅对符合列条件的行进行笛卡尔乘积,并返回结果。在这里可以指定两个列相等,也可以自定两个列其他逻辑关系,而且也可以指定多个列通过or或者and进行连接。mysql中主要可以使用如下几种join语法1:join、inner join、cross joi...

解决LogStash报错:FORBIDDEN/12/index read-only / allow delete (api)_懵懂无知的蜗牛的博客-程序员信息网_forbidden/12/index read-only

一、现象在Kibana上一直查询不到索引最新插入的数据,通过排查发现Logstash的日志(/logs/logstash-plain.log)大量报错:FORBIDDEN/12/index read-only / allow delete (api)[2020-10-27T15:35:12,119][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({"type"=&..

ServerSocket与Socket入门详解_流烟默的博客-程序员信息网_serversocket socket

一直认为,实践出真知,理论是基石。没有理论的实践是空虚和盲目的。【1】Socketsocket是什么?百度百科:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接需要一对socket。两个socket之间形成一个管道(通道),进行信息流的传输。Java网络编程第四版如是说:Socket又称套接字,应用程序通常通

随便推点

hbase数据库---slf4j-log4j12-1.6.4.jar包冲突_数据文字工作者的博客-程序员信息网

当启动hbase shell之后,报如下错误:[[email protected] bin]# hbase shell2015-03-10 15:39:25,967 INFO  [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.availableHBase S

JAVA java学习(43)——————Java一维数组_豆皮没有豆的博客-程序员信息网

当数组中每个元素都只带有一个下标时,这种数组就是“一维数组”。一维数组(one-dimensional array)实质上是一组相同类型数据的线性集合,是数组中最简单的一种数组。数组是引用数据类型,引用数据类型在使用之前一定要做两件事情:声明和初始化。创建一维数组在上一节数组的介绍中已经讲到了数组的声明和初始化,为了在程序中使用一个数组,必须声明一个引用该数组的变量,并指明整个变量可以引用的数组类型。声明一维数组的语法格式为:type[] arrayName; // 数据类型[] 数组名;或

用vue ui创建新的vue项目_呆小虾的博客-程序员信息网

用vue ui创建新的vue项目vue3.0以上才会有vue ui功能一、创建新vue项目1.在命令行里面输入vue ui2.进入创建新项目页面输入项目名称,填写git初始化提交信息,下一步3.预设面板可以选择以前创建过的预设,也可以重新手动配置项目,下一步4.进入功能面板,选择项目所需要的功能一定要有Babel和Linter / Formatter(代码格式校验)、...

打印出来是Thu Jan 01 08:00:00 CST 1970的原因???_lk小强的博客-程序员信息网

打印出来是Thu Jan 01 08:00:00 CST 1970,而是不是Thu Jan 01 00:00:00 CST 1970原因???打印出来的时间是8点而非0点,原因是存在系统时间和本地时间的问题,其实系统时间依然是0点,只不过我的电脑时区设置为东8区,故打印的结果是8点。CST - 中国标准时间:China Standard Time UT+8:00格林威治时间 (GMT)...

(C++)Windows自动锁屏程序_周3301的博客-程序员信息网_c语言锁屏代码

程序员长期盯着屏幕,对眼睛的伤害是很大的。科学建议每一个小时就休息五分钟,眼睛看向六米之外的地方(是不是绿色不是很重要)。在下利用C++,写了一个自动锁屏的程序,可以设置锁屏时间,实现键盘输入win + L的功能开发环境用的Dev-C++程序代码//运行后输入时间,回车后就可以放在一边,等到了时间就自动锁屏,提醒你好休息一会了#include <stdio.h>#include <stdlib.h>#include<iostream>#include &lt

Jetson Xavier中安装DIGITS-》Caffee中的错误_能想多少想多少的博客-程序员信息网

不知道为什么这么长Building wheels for collected packages: numpy, scikit-image, leveldb, pandas, python-dateutil, python-gflags, PyWavelets Building wheel for numpy (setup.py) ... error ERROR: Command erro...

推荐文章

热门文章

相关标签