lasso的今世前身


引言

年关将至,少不了写年终总结。自己也绞尽脑汁对研读的统计文献做一个总结。我们来聊聊20年前诞生的lasso。lasso理论文章由统计学家Tibshirani, R在于1996年提出,并获得了里程碑式的影响。简单概述,lasso的目的就是选择合适的自变量。茫茫变量中怎么遇见合适的它。

lasso筛选变量python lasso筛选变量R_iterative

此处说明下我们为什么要进行选变量这个动作?
-变量维数多并且变量之间存在相关关系,所以剔除不重要的变量,选择合适的变量成为了统计学习里面的一个重点。

传统选变量方法

(1). Cp统计量
数学公式为:Cp=RSSqδ2−(n−2q)

(2). AIC准则
数学公式为:AIC=nln(RSSq)+2q

(3).BIC准则
数学公式:BIC=−2ln(RSSq)+ln(n)∗k

其中RSSq是在该模型下的残差平方和,q是模型的变量个数。
R语言中有AIC,BIC函数。

lm1 <- lm(Fertility ~ . , data = swiss)
lm2 <- update(lm1, . ~ . -Examination)
AIC(lm1, lm2)
BIC(lm1, lm2)

注意这些规则只是刻画了用某个模型之后相对“真实模型”的信息损失【因为不知道真正的模型是什么样子,所以训练得到的所有模型都只是真实模型的一个近似模型】。

这些规则理论上是比较漂亮的,但是实际在模型选择中应用起来还是有些困难的,
(1).茫茫变量中这种枚举的方式,计算量太大,典型的NP问题。
(2).通过这种离散的方式选择变量,模型并不稳定。即数据有许变化,模型就会有所改变。
所以上述方法更适合于模型之间的比较。

岭估计

针对变量之间存在相关性,引入岭的概念,使得XTX的均逆可得,避免病态矩阵的情况。

lasso筛选变量python lasso筛选变量R_machine-learning_02

这有效避免了逆的问题,但是岭估计是在全体集合上进行计算,不能选择合适的子集。
在高维统计中,基于岭的惩罚会存在大量的非0变量,而且相对于其他估计方法系数偏小。
R语言中岭估计调用的函数:

lm.ridge(y ~ ., longley) 
plot(lm.ridge(y ~ ., longley, lambda = seq(0,0.1,0.001)))

非负代理(Non-negative Garrote)

追溯到1993年,Breiman, L老先生提出了Non-negative Garrote方法进行选择更好的子集。这是lasso的前身。

lasso筛选变量python lasso筛选变量R_lasso筛选变量python_03

解释:给予变量系数一定的权重,但是对于权重的和有约束。

lasso(least absolute shrinkage and selection operato)

96年Tibshirani, R在Non-negative Garrote方法的基础上,直接对于变量的系数进行L1正则化。

lasso筛选变量python lasso筛选变量R_迭代_04

t 值越小,变量收缩越大,部分变量系数变成0。所以lasso具有重要的稀疏性质。

lasso筛选变量python lasso筛选变量R_opt_05

图片展示了p=2情况下,岭估计和lasso估计的几何图解。图中我们可以发现lasso估计的置信椭球和约束菱形的交点在坐标轴上,说明另一变量系数可以为0,而岭估计交点不会出现在坐标轴上。

根据 Lagrangian对偶方法,我们将上面的函数形式转化为:

lasso筛选变量python lasso筛选变量R_lasso筛选变量python_06

所以lasso问题是一个非线性、不可微函数优化问题,求解过程不容易。

lasso求解

FU(1998)提出shooting优化算法。Lagrangian对偶问题可以对满足KKT条件的问题用导数形式进行求解。 针对xj求导:

2xpj)

所以左式是βj的分段函数。

lasso筛选变量python lasso筛选变量R_iterative_07

由图可知左式截距在-λ]两端有解。

那么βj的解为:

lasso筛选变量python lasso筛选变量R_迭代_08

此处S0循环,循环多次直至所有变量系数收敛。
这种方法其实就是我们在处理类似lasso及其广义lasso中常用的坐标下降算法。P. TSENG在论文中证明了其中的收敛性问题。2007年Jerome Friedman在论文中将归纳坐标下降算法在lasso、elastic net、group lasso等广义lasso中的运用情况,给出了相应的解析解表达形式。

lasso:

lasso筛选变量python lasso筛选变量R_opt_09


elastic net:

lasso筛选变量python lasso筛选变量R_lasso筛选变量python_10

S在这里是一个软阀值算子。

lasso筛选变量python lasso筛选变量R_lasso筛选变量python_11


其中这里的变量x。每个变量迭代算法如同上述表示,p个变量均不断循环遍历直至均收敛。

2010年Jerome Friedman的文章中拓展了2007年的工作,针对高维广义线性模型提出了更加快捷的算法,并提供了R包glmnet。
这里只介绍迭代过程中的小技巧。针对表达形式中的1N∑Ni=1xij(yi−y^ji),文章中提供了两种迭代方法。

1、原始迭代方法:

lasso筛选变量python lasso筛选变量R_迭代_12


y^i观测值模型拟合值,利用现在模型的残差进行下一次迭代的计算。2、协方差迭代:

lasso筛选变量python lasso筛选变量R_迭代_13

利用内积的方式进行计算,我们需要计算每个变量与y改变时,我们进行一次迭代运算。


lasso的今世前身