老饼讲解:一步一步上手学习
岭回归也是一种线性模型,它与线性回归基本是相同的,但它会在损失函数中加入了二范正则项,来惩罚过大的系数,从而避免模型过拟合,那么,这节我们就来详细看看岭回归模型是怎么一回事吧。
我们先来看看岭回归的模型,再看看它的损失函数,就一清两楚了。
岭回归模型和线性回归模型一样,它的模型表达式为:
也就是:
但是呢,岭回归模型的损失函数在MSE的基础上,加入了二范正则项,如下:
其中,:样本个数
:系数个数
:y的预测值
:y的真实值
:惩罚系数,用于调节系数W的惩罚力度
当 越大时,惩罚力度越大, 岭回归求出的各个系数的绝对值就会越小。
可以看到,岭回归与线性回归基本就是一样的,只是损失函数加入了二范正则项。
岭回归的模型求解公式如下:
它与线性回归的求解公式相似,只是部分需要在对角元素上加上,推导过程在这里就省略了。
如果眼尖,就会注意到,岭回归模型本身是不带阈值的,其实很容易理解,因为岭回归要对各个w进行惩罚,而阈值b是不需要惩罚的,所以也就没有阈值。
但现实中,我们和的关系往往是需要阈值的,那怎么办呢,一般会先对数据中心化,这样数据就不需要阈值了,再用岭回归模型来建模。不过如果使用软件来构建岭回归,一般不用管这个,因为它会帮我们做这样的处理,并把中心化所做的仿射合并到岭回归模型中,最后也就得到了有阈值的线性模型。
好了,我再来看看岭迹图,它是岭回归模型中非常重要的一部分核心内容。那么,岭迹图是什么呢?我们知道,岭回归中 越大时,惩罚力度越大, 岭回归求出的各个系数的绝对值就会越小。那么,取什么值最好呢?一般就可以通过岭迹图来确定啦。
岭迹图是指,以作为轴,各个作为轴,所画出来的图,如下:

如图所示,就可以看到,和随着的增大,而逐步减小,这就是岭迹图了
根据岭迹图确定alpha,一般紧扣如下两点思想:
1. 不要过大:过大往往不合理,所以所取的要令整体w都不要偏大。
2. 尽量小:在保障w不太大的前提下,尽量取更小的,因为过大会使损失函数过于倾向正则项,忽视误差项。
岭迹图往往是如下图所示,然后在喇叭口前取alpha的值:

如图所示,在喇叭口前,系数会随着alpha而迅速减小,而在喇叭口之后,系数对alpha并不敏感,所以在喇叭口前取alpha值,比较划算,也就是"保障w不要太大的同时,alpha尽量的小"。
岭迹图除了用来确定,还可以用来分析变量,不过这是一个比较灵活的事情,并没有统一的方法,所以我们就随便举两个例子,大家借鉴着来理解就好了。
案例一:alpha为0时很w大,在alpha稍微变大时,w迅速趋0

图中的这种情况,一般可以认为这个变量没有什么用,先看alpha为0时,w很大,我们自然不想要过大的w,所以这个变量也就没什么用。再看alpha不为0时,w已经趋0,所以变量也没有贡献,那总的来说,这个变量不管什么情况下都没什么用。
案例二:w随着alpha的增大,在正负之间反复跳动

如图所示,w在正负之间反复跳动,说明变量对y一会是正贡献,一会是负贡献,非常不稳定,只要alpha稍微变动一下,正负贡献就相反了,而一个好的、稳定的变量,它对y的贡献应该也是稳定的,所以这种变量我们也不想要。
好了,说了这么多岭回归,是时候拎点数据出来玩一玩了。
例如,我们的数据如下:

事实上,上面的数据是我用 生成的,接下来构建一个岭回归模型,顺便看看它的岭迹图。
在python的sklearn中,只需要调用linear_model.Ridge()函数就可以构建岭回归模型了,具体代码如下:
"""
本代码展示如何用sklearn实现岭回归
本代码来自《老饼讲解-机器学习》 www.bbblearn.com
"""
from sklearn import linear_model
import numpy as np
x = np.array([[0, 2], [1, 1], [2,3],[3,2],[4,5],[5,2]]) # 输入x
y = np.array([8,7,15,14,25,18]) # 输出y
ridge = linear_model.Ridge(alpha=1,fit_intercept=True) # 初始化岭回归模型
ridge.fit(x,y) # 模型训练
print("当前alpha:"+str(ridge.alpha)) # 模型系数和阈值
print("模型参数:"+str(ridge.coef_)) # 模型的系数
print("模型阈值:"+str(ridge.intercept_)) # 模型的阈值代码运行结果如下:

这样我们就得到了我们的模型:
可以看到,它与真实关系 是有所偏差的,这是我们对权重进行了惩罚。
好了,下面我们来说一下岭迹图怎么画,因为alpha的设定需要参考岭迹图,而且借助岭迹图,还可以对变量作一些简单的分析。岭迹图的具体实现代码如下:
"""
本代码展示如何画岭迹图
本代码来自《老饼讲解-机器学习》 www.bbblearn.com
"""
from sklearn import linear_model
import matplotlib.pyplot as plt
import numpy as np
x = np.array([[0, 2], [1, 1], [2,3],[3,2],[4,5],[5,2]]) # 输入x
y = np.array([8,7,15,14,25,18]) # 输出y
# 画出岭迹图
alpha_list = np.linspace(0,5,20) # 设置要尝试的alpha
w_arr = np.empty((len(alpha_list),x.shape[1])) # 不同alpha下的权重参数
for i in range(len(alpha_list)): # 逐个alpha训练模型
ridge = linear_model.Ridge(alpha=alpha_list[i],fit_intercept=True) # 初始化模型
ridge.fit(x,y) # 训练模型
w_arr[i] = ridge.coef_ # 记录当前的权重参数
for i in range(w_arr.shape[1]): # 逐个参数画图
plt.scatter(alpha_list, w_arr[:,i], facecolors='none' # 画出当前参数的变化
,edgecolors= np.random.rand(1,1,3),marker='o',label='w'+str(i+1))
plt.legend() # 显示图例
plt.show() # 显示画布运行结果如下:

从图中可以看到,变量1与变量2的权重参数w1与w2随着alpha增大而减小,如果单从本案例的岭迹图来看,alpha设为0就可以了,因为系数在alpha=0时本身就不太大,同时也可以看到两个变量都不会因为alpha的改变而大幅度变动,说明两个变量都比较稳定。
总的来说,岭回归模型,就是加入了二范正则项的线性回归,它可以通过设置alpha惩罚系数来预防系数过大。另外,需要了解岭迹图怎么看,一方面是用它来确定alpha,另一方面可以用它来简单分析一下变量。岭回归差不多就是这么多内容了。
评论