r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

Glmnet是一个通过惩罚最大似然来拟合广义线性模型的包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net(弹性网络)惩罚值计算的。

由Kaizong Ye,Coin Ge撰写

该算法速度极快,可以利用输入矩阵中的稀疏性x

介绍

Glmnet是一个通过惩罚最大似然来拟合广义线性模型的包。正则化路径是针对正则化参数λ的值网格处的lasso或Elastic Net(弹性网络)惩罚值计算的。该算法速度极快,可以利用输入矩阵中的稀疏性x。它符合线性,逻辑和多项式,泊松和Cox回归模型。可以从拟合模型中做出各种预测。它也可以适合多元线性回归。

glmnet算法采用循环坐标下降法,它连续优化每个参数上的目标函数并与其他参数固定,并反复循环直至收敛。由于高效的更新和技术,如热启动和主动集合收敛,我们的算法可以非常快地计算解决方案路径。

×

一、用途

正则化Regularization主要用来防止overfitting。

下面举例会发生的一些模型评估情况:

  1. 比如在KNN(K-Nearest Neighbors)中,单纯用knn.score作模型评估会忽视样本不平衡情况,导致评估正确率不准确。用代码knn.score得到是分子除以分母的形式:

[公式] 。

这种测评model方法并不完美。因为有可能发生一种情况:不平衡样本比例,导致错评model。比如判断垃圾邮件分类,一共有100个测试数据集,只有5个是垃圾邮件。正确率有95%,即使无法判断垃圾邮件(预测有100%的正确率)与实际正确率也相差不大。可以采用confusion matrix 方法。(PS: 下一篇,会写各种评估模型性能的方法。)

2. 比如在线性回归Linner Regression 中,可以用代码.score得到,是R squared 衡量X与y相关性,它评价你选择的线性模型合适与否。如果R squared偏小,说明特征X的weight比重较小,还有其他的特征没有考虑进去。另外也可以采用均方根误差(RMSE)作为评价回归模型的另一个常用指标。

3. 对于评价模型首先我们会检验Bias-Variance-Tradeoff。

(1)如果模型Bias过高,说明模型的预测值与偏差值较大,模型欠拟合,应该选择更好的模型。为了充分学习训练集数据,解决欠拟合方法有:设置k-fold cross vaildation (交叉验证方法)。把数据集分成k份测试集。每次用剩下(k-1)份作为训练集,测试在1份测试集上。共进行K次验证。例如Linear regression中衡量cross_val_score是R squared。

(2)如果模型Variance过高,虽然对训练集高度学习,但太关注个体变动比如学到了Noise,模型过拟合。考虑过拟合原因:

  • 特征选取过多 ,导致参数过多。

  • 部分特征的权重或者它的系数过大(the coefficient or the weight of features too large)

正则化Regularization的产生是为了解决改善上述过拟合源头。

二、L1, L2 及ElasticNet弹性网络回归概念

正则化内有两步,分别是L1: Lasso;L2: Ridge。

概念:

  1. L1称为Lasso,L1 Lasso回归是在损失函数基础上加入了绝对值和的正则化方法

用途:主要选择出重要特征。

特征:使weight 趋向0,在特征选择上特别重要!

公式: [公式]

2. L2称为Ridge, L2 Ridge回归是在损失函数基础上加入了平方和的正则化方法

用途:主要惩罚系数过大的特征。

特征: [公式] (正则化参数)越大,限制过拟合越强。

公式: [公式]

3. ElasticNet回归则是融合了两种正则方法,是Lasso回归与Ridge回归的组合。

公式: [公式]

注意点:

  1. 在一般步骤上,先L2 Ridge正则化方法,后L1 Lasso正则化方法。为什么呢?


存在这样一种情况,如果我们用来拟合的自变量过多(或者说特征变量过多),而且特征变量之前存在很高的相关关系,比如上面这种情况:以上两个函数都可以很好的拟合数据,但右边的函数显然有过拟合的嫌疑,为了避免这种情况,有两种方法:

方法一:舍掉x^3和x^4这两个变量(舍弃无用的特征变量)。这可以人工选择,也可以利用算法来做。但舍弃无用的特征变量会舍弃一部分数据,一部分数据可能是有意义的。所以推荐方法二。

方法二:减小θ3和θ4的值(即正则化,保留所有特征变量,但减少变量参数的值)。

结论:先采用Ridge回归,后采用Lasso回归是因为为了保护数据的完整性,先保留所有特征变量,但减少变量参数的权重值。而实际情况中,我们很难判断哪些特征变量需要正则化,所以一般情况下,我们是对所有的参数都正则化处理:

[公式]

2. 其中 [公式] 是正则项, [公式] 为正则参数, 不能设置过大。需要注意的是,i是从1开始的,这意味着函数的常数项( [公式] )并没有被正则化。所以正则化 [公式] 不能设的太大,否则会导致除了常数项外,所有的参数值都很小,因变量近似等于常数项,出现欠拟合现象。


三、由来原因

1. 从期望风险、经验风险与结构风险之间关系的角度

在训练集上做损失函数是经验风险,然而经验风险最小化无法保证未知数据集上的损失函数最小,同时理想的期望风险中的联合分布不可求。所以折中通过结构风险,使模型最优化。

正则化是结构风险中处理手段的一种。

无论经验风险、结构风险、期望风险,它们的基础都是损失函数(Loss Function)。

A. 经验风险

经验风险就是最普通的损失函数,训练集内所有样本点求损失函数的平均和。

从单个样本点Loss function入手,它是针对单个具体的样本而言的,表示的是模型预测的值与样本真实值之间的差距。比如对于某个样本 [公式] ,其真实的值为 [公式] ,而我们的模型选择决策函数为 [公式] 。那么通过模型预测的值为 [公式] ;损失函数就是用来表示 [公式] 与 [公式] 之间的差距的,我们用函数 [公式] 来衡量。我们希望的是这个 [公式] 函数最小化。理想的情况是模型决策函数预测值 [公式] 刚好等于该样本的真值 [公式] 。


通过损失函数我们能知道模型决策函数f(X)对于单个样本点的预测能力。损失函数 [公式]越小,说明模型对于该样本预测越准确如果想知道模型f(X)对训练样本中所有的样本的预测能力只需所有的样本点都求一次损失函数然后进行累加就好了。

[公式]

经验风险越小说明模型 [公式] 对训练集的拟合程度越好。

[公式]

但是对于未知的样本效果怎么样呢?我们知道未知的样本数据( [公式] )的数量是不容易确定的,所以就没有办法用所有样本损失函数的平均值的最小化这个方法


B. 期望风险

期望风险是一种理想化状态,是对全体数据的模型预测。

如果想要评估全部数据(样本数据+未知数据),理想化的角度想到概率论中期望Expectation。即假设X和Y服从联合分布P(X,Y).那么期望风险就可以表示为:

[公式] (假设X和Y的所有数据服从联合分布)

为什么要引入损失函数的期望呢?人们希望模型能够刻画在全体样本上的预测能力!但是联合概率 [公式] 往往是无法得到的,因为无法得到全体样本数据包括未知数据,这一过程必须知道输入为 [公式] 的概率 [公式] , 及在输入为 [公式] 的情况下输出是的概率 [公式] ,才能知道联合概率 [公式] 。但是给出的样本往往不能反映真实的分布情况,期望风险不能直接计算,也就没法做期望风险最小化。

但是根据弱大数定律,当样本N无限大时,可用经验风险作为期望风险的估计,也就是局部估计整体。那么我们常说的风险最小化其实就指的是经验风险最小化!


C. 结构风险

比较经验风险和期望风险:

  1. 经验风险是建立在训练集上所有点的损失最少,它是是建立在局部;而期望风险是建立在全部集上所有点的损失最少,它是建立在全局。

2. 经验风险是现实的、可求的;期望风险是不现实的、不可求的。

产生问题:如果只考虑经验风险,会产生过拟合情况。经验风险越小,说明样本拟合程度越好(高) [公式] high variance。 模型f(x)对训练集中所有的样本点都有最好的预测能力,但是对于非训练集中的样本数据,模型的预测能力非常不好。

这种情况引出结构风险,在经验风险基础上添加一个正则项,表达式是:

[公式]

其中 [公式] 正则化系数是一个大于0的系数。 [公式] 表示的是是模型的复杂度(惩罚项)。结构风险可以这么理解:

经验风险越小,模型决策函数越复杂,其包含的参数越多,当经验风险函数小到一定程度就出现了过拟合现象。也可以理解为模型决策函数的复杂程度是过拟合的必要条件,那么我们要想防止过拟合现象的方式,就要破坏这个必要条件,即降低决策函数的复杂度。也即,让惩罚项 [公式] 最小化,现在出现两个需要最小化的函数了。我们需要同时保证经验风险函数和模型决策函数的复杂度都达到最小化,一个简单的办法把两个式子融合成一个式子得到结构风险函数然后对这个结构风险函数进行最小化。



该代码可以处理稀疏的输入矩阵格式,以及系数的范围约束。其核心是一组Fortran子程序,它们使执行速度非常快。

该软件包还包括用于预测和绘图的方法以及执行K折交叉验证的功能。


热门课程

R语言数据分析挖掘必知必会

面对扑面而来的数据浪潮,包含Google、Facebook等国际企业,都已采用R语言进行数据分析

探索课程

首先,我们加载glmnet包:

包中使用的默认模型是高斯线性模型或“最小二乘”,我们将在本节中演示。我们加载一组预先创建的数据用于说明。用户可以加载自己的数据,也可以使用保存在工作区中的数据。

我们拟合模型glmnet。

“拟合”是类的一个对象,glmnet它包含拟合模型的所有相关信息以供进一步使用。我们不鼓励用户直接提取元素。相反,各种方法plot,print,coef和predict,使我们能够更优雅执行。

我们可以通过执行plot函数来显示系数:

我们看到lasso(alpha=1)在这里做的最好。我们也看到,使用的lambda的范围与alpha不同。

系数上限和下限

假设我们想要拟合我们的模型,但将系数限制为大于-0.7且小于0.5。这可以通过实现upper.limits和lower.limits参数:

惩罚因素

该参数允许用户对每个系数应用单独的惩罚因子。其每个参数的默认值为1,但可以指定其他值。penalty.factor等于零的变量不会受到惩罚!

当人们对变量有先验知识或偏好时,这非常有用。在很多情况下,一些变量可能非常重要,以至于一直想要保持这些变量,这可以通过将相应的惩罚因子设置为0来实现:


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498