在上一篇文章中,我们了解了最小二乘法同时也了解了最小二乘法的一些使用限制。岭回归就是来解决最小二乘法所存在的哪些问题的。
一、岭回归
岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计,实质上就是一种改良的最小二乘法。我们知道,最小二乘法是通过优化
而岭回归则是通过优化
通过,上面两个公式可以发现其实岭回归只是在平方差的后面加一项。其实,这就是我们所说的正则化,常见的正则化有L1正则化和L2正则化还有将两种一起结合用。而这里是属于L2正则化,通过正则化可以防止训练的模型过拟合。过拟合就是指,模型对于训练数据有很好的判断能力,而对于未知数据的预测能力并不是很好,为什么会这样呢?因为,在训练模型的过程中,有可能将训练数据中的噪声加入到模型中了。那这和最小二乘法又有什么关系呢?在介绍最小二乘法的时候,有提到最小二乘法的方程组个数要多于未知数的个数,而且特征之间不存在共线性。共线性就是指,如果输入有多个x1、x2...,也许x1和x2之间的特征是相似的。如果,遇到上面的问题应该怎么处理呢?常用的方法有两种,第一种通过人工判断去掉共线性的特征,也就是从x1和x2中去掉一个(对于某些情况可能很难实现),第二种通过正则化的方式,来实现减少输入参数(也称为降维)。通过观察两个式子可以发现,其中α大于等于0,如果α=0时,就等价于最小二乘法。如果阿尔法大于0,下面式子中的权重必定会小于上面公式中的权重,当α到一定值的时候,权重会趋于0,从而达到去除共线性的参数。
二、scikit-learn实现岭回归
1、alpha对权重的影响
下面程序展示的是一个,不同的alpha值对权重的影响,一共有10个权重(没有截距),所以最后可以看到10条曲线,可以发现当alpha的值趋近于0的时候,对权重的影响为0,也就退化成了最小二乘法。
import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model if __name__ == "__main__": #创建一个10*10的希尔伯特矩阵,其元素A(i,j)=1/(i+j-1),i,j分别为其行标和列标 #希尔伯特矩阵是一个共线性的矩阵 x = 1./(np.arange(1,11) + np.arange(0,10)[:,np.newaxis]) #创建一个全为1的10维的矩阵 y = np.ones(10) n_alphas = 200 #创建一个有200个alpha的列表,列表的开始值是-10,结束值是-2,步长是8/200 #列表中的元素都是10^(-10....) alphas = np.logspace(-10,-2,n_alphas) #创建一个权重列表 coefs = [] #遍历所有的alpha值 for a in alphas: #创建模型,没有截距 ridge = linear_model.Ridge(alpha=a,fit_intercept=False) #训练模型 ridge.fit(x,y) #将权重的值添加到列表中 coefs.append(ridge.coef_) #获取坐标 ax = plt.gca() #根据alpha和权重的值绘图 ax.plot(alphas,np.array(coefs)) #设置数据在坐标轴上的显示比例 ax.set_xscale("log") #翻转x轴 ax.set_xlim(ax.get_xlim()[::-1]) #设置x轴坐标的标签 plt.xlabel("alpha") #设置y轴坐标的标签 plt.ylabel("weights") #设置图的标题 plt.title("Ridge coefficients as a function of the regularization") #设置数据在图上的显示 plt.axis("tight") plt.show()
通过上面的程序我们可以发现一个问题,在使用岭回归模型的时候,我可能会选择多个alpha,然后从中选中一个最好的做为模型的alpha,那么,我们应该如何选择。scikit-learn提供了RidgeCV实现了缺省α参数的交叉验证的岭回归模型。
2、留一交叉验证(从多个α中选择一个)
from sklearn import linear_model if __name__ == "__main__": #创建一个岭回归模型,设置α的值 #α从0.1开始,到1.0结束,一共去10个α,每个α之间的间隔为1/10 clf = linear_model.RidgeCV(alphas=[0.1,1.0,10.0]) #训练模型 clf.fit([[0,0],[0,0],[1,1]],[0,.1,1]) #获取模型选择的α值 print(clf.alpha_) #0.1
这篇文章,主要是介绍了岭回归和岭回归的α对权重的影响,以及如何通过sciki-learn来选择合适的α,在下一篇文章中,我将会介绍如何通过岭回归模型实现一个文本的分类。