7.2 惩罚式回归
在OLS回归的各种变种中,比较重要的当属惩罚式回归。在普通回归中所得到的拟合是训练数据中的最佳拟合,这会导致过拟合。惩罚的意思是,如果模型对参数过度相信,我们就对它增加一个惩罚项。
提示 惩罚式回归是一种折中
惩罚式回归是偏差-方法折中的另一个例子。在使用惩罚项的时候,由于增加了偏差,我们会得到一个训练效果差一些的拟合。但另一方面,我们降低了方差,从而更易于避免过拟合。因此,整体效果可以泛化得更好。
7.2.1 L1和L2惩罚
有两种类型的惩罚经常用于回归:L1惩罚和L2惩罚。L1惩罚的意思是说,我们通过系数的绝对值之和对回归进行惩罚,而L2惩罚则会通过平方和来惩罚。
让我们形式化地探索一下这些想法。OLS优化如下所示:
在前面这个公式中,我们要寻找向量 b ,使得到目标y 的平方距离最小。
当加入L1惩罚项的时候,我们就会优化下面这个式子:
这里想要同时使误差变小,还要使系数(绝对值)变小。用L2惩罚项,就意味着使用的是下面这个式子:
它们之间的区别相当小:我们现在通过系数的平方来惩罚,而不是绝对值。然而,其结果的区别却是戏剧性的。
提示 岭(Ridge)、Lasso法和弹性网(Elastic net)
这些惩罚模型通常都有一些有趣的名字。L1惩罚模型通常叫做Lasso法 ,而L2惩罚模型叫做岭回归 (Ridge regression )。当然,我们可以把这两者结合起来,就得到了弹性网 (Elastic net)模型。
Lasso法和岭回归会比非惩罚回归得到更小的模型系数。然而,Lasso法还有一个额外的性质,那就是它会使更多的系数为0!这就是说,最终的模型甚至不会使用一些输入特征,模型是稀疏的。这通常是一个非常好的性质,因为模型把特征选择和回归在同一个步骤中都实现了。
你可能注意到了,无论我们何时加入惩罚项,都会加一个权重λ ,它决定了我们想要多大的惩罚力度。当λ 接近0的时候,那它跟OLS非常相近(事实上,如果你把λ 设为0,就相当于进行OLS),当λ 比较大的时候,我们会得到一个与OLS非常不同的模型。
岭模型更加古老,而Lasso却很难用于人工计算。然而,使用现代计算机,Lasso使用起来可以像岭模型一样容易,或者甚至把两者结合在一起形成弹性网。弹性网有两个惩罚项,一个是绝对值项,另一个是平方项。
7.2.2 在Scikit-learn中使用Lasso或弹性网
让我们用弹性网对上面的例子进行改造。使用Scikit-learn很容易把之前所用的最小二乘法替换为弹性网回归:
from sklearn.linear_model import ElasticNet en = ElasticNet(fit_intercept=True, alpha=0.5)
现在我们使用的是en ,而之前用的是lr 。这是唯一需要修改的地方。结果正如我们所预期的那样,训练误差增加至5.0(之前是4.6),但交叉验证误差却降至5.4(之前是5.6)。训练集上的误差变得更大,但我们却得到了更好的泛化能力。我们还可以在同一段代码中使用Lass类实现L1惩罚,或者用Ridge 类实现L2惩罚。
下图告诉我们,当从非惩罚回归(显示为虚线)切换到Lasso回归(更接近水平线)的时候发生了什么。然而,当有很多输入变量的时候,Lasso回归的收益就更加明显。下面仔细考虑一下这个设置:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论