LASSO回归

首先思考一个问题:正则化为什么可以防止过拟合?带着这个问题看下面的内容(第2部分大致能感性地回答这个问题)。

本文有些部分参考了这篇博客:L0,L1,L2正则化浅析

1、概念

L0正则化的值是模型参数中非零参数的个数。

L1正则化表示各个参数绝对值之和。

L2正则化标识各个参数的平方的和。

 

2、参数稀疏化

2-1  实现参数的稀疏有什么好处吗?

现实中,对于回归真正有意义的变量往往是比较少的,这也是LASSO流派的世界观——“稀疏性假设”。另外根据“奥卡姆剃刀原则”,越简单的模型越可靠。或者说,由于噪音的存在,选择“无关变量”甚至可以强行拟合噪音部分,从而产生过拟合,但对于测试数据来说,这是不利的。另外,变量越少模型越容易解释(模型的可解释性是很重要的)。

2-2参数值越小代表模型越简单吗?

是的。为什么参数越小,说明模型越简单呢,这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。

 

3、正则化

3-1  L0正则化

根据上面的讨论,稀疏的参数可以防止过拟合,因此用L0范数(非零参数的个数)来做正则化项是可以防止过拟合的。

从直观上看,利用非零参数的个数,可以很好的来选择特征,实现特征稀疏的效果,具体操作时选择参数非零的特征即可。但因为L0正则化很难求解,是个NP难问题,因此一般采用L1正则化。L1正则化是L0正则化的最优凸近似,比L0容易求解,并且也可以实现稀疏的效果。

3-2  L1正则化

L1正则化在实际中往往替代L0正则化,来防止过拟合。在江湖中也人称LASSO。

L1正则化之所以可以防止过拟合,是因为L1范数就是各个参数的绝对值相加得到的,我们前面讨论了,参数值大小和模型复杂度是成正比的。因此复杂的模型,其L1范数就大,最终导致损失函数就大,说明这个模型就不够好。

3-3  L2正则化

L2正则化可以防止过拟合的原因和L1正则化一样,只是形式不太一样。

L2范数是各参数的平方和再求平方根,我们让L2范数的正则项最小,可以使W的每个元素都很小,都接近于0。但与L1范数不一样的是,它不会是每个元素为0,而只是接近于0。越小的参数说明模型越简单,越简单的模型越不容易产生过拟合现象。

L2正则化江湖人称Ridge,也称“岭回归”
 

4、LASSO与Ridge回归

网上有很多介绍这个的,这里不再赘述。

这篇文章写得还行,参考一下

【机器学习】正则化的线性回归 —— 岭回归与Lasso回归

另外,可以看看博主发的多项式回归的知识

【机器学习】多项式回归

其他的比如:

Lasso回归

岭回归,Lasso——变量选择技术

统计学习:变量选择之Lasso | R语千寻

 

5、LASSO的适用场景

LASSO是基于线性回归,适用于广义的线性回归,包括多项式回归、Logistic回归等。

LASSO 虽然基于线性回归,但是可以和很多模型配合使用,如:二分类模型、生存模型。

二分类因变量的问题,直接用LASSO不太现实,所以可以LASSO+Logistic配合,用LASSO的降维特性配合Logistic的二分类拟合能力。

生存模型,直接用LASSO也实现不了,所以可以LASSO+Cox比例风险模型,用LASSO的降维特性+Cox的生存分析能力。

LASSO+LR在这篇文章中提到过:代谢组学:为肿瘤代谢biomarker发现提速

LASSO+Cox在今年7月份的一篇胃癌基因组学文献中看到过。

有个问题,带L1惩罚项的Logistic 与LASSO+Logistic模型,这二者有什么区别?

关于这种组合的,还有PLSR+Cox的组合,有空也研究下。

如果把 LASSO 的定义等价于 L1正则化的话,那么其实很多非线性模型也用到了LASSO(L1正则化)的策略,这是普遍适用的技巧。如:神经网络中也经常使用正则化来防止过拟合、SVM 的目标函数中也有正则化项(虽然为L2正则化)。机器学习模型的目标函数常常由损失函数和正则化项一起构成,我们需要调整二者的权重,来使自己的模型同时兼备较好的拟合性能和泛化潜力。这部分思想可以参考:模型求解 中的“优化目标”部分。

思考:SVM一般带 L2惩罚项,如果改为L1惩罚项,是不是可以称为LASSO+SVM?

另外关于回归与分类,知乎上有人对二者的联系做过这样的探讨,可以看看:分类与回归区别是什么?

 

6、LASSO的工具包

python里可以用sklearn里的linear_model.Lasso,R语言可以使用glmnet包或lars包。

另外,sklearn里的linear_model.LogisticRegression 中,可以设置 "penalty=l1",这是否等价于 LASSO+Logistic ?

LASSO+Logistic模型的实现在R中很简单,cv.glmnet()的参数中,family为"gaussian"时为线性回归(因变量为连续变量)、为"binomial"时为Logistic回归(因变量为二分类变量)。

PLSR+Cox的组合:plsRcox是plsr和cox组合的工具。

7、变量筛选

有人这样总结变量选择:
1)子集选择 这是传统的方法,包括逐步回归和最优子集法等,对可能的部分子集拟合线性模型,利用判别准则 (如AIC,BIC,Cp,调整R2 等)决定最优的模型
2)收缩方法(shrinkage method) 收缩方法又称为正则化(regularization)。主要是岭回归(ridge regression)和lasso回归。通过对最小二乘估计加入罚约束,使某些系数的估计为0。(岭回归:消除共线性;模的平方处理;Lasso回归:压缩变量,起降维作用;模处理)
(3)维数缩减 主成分回归(PCR)和偏最小二乘回归(PLS)的方法。把p个预测变量投影到m维空间(m

这部分详细介绍可以参考:高维数据中特征筛选方法的思考总结——多变量分析筛选法

 

8、R代码示例

library(glmnet)
x<-as.matrix(select.data)
x<-apply(x,2,as.numeric)
y<-select.data.group
cv.fit<-cv.glmnet(x, y, family="binomial", type.measure = "class")
plot(cv.fit)
cv.fit$lambda.min
cv.fit$lambda.1se

fit<-glmnet(x, y, family="binomial")
plot(fit)
coefficients<-coef(fit,s=cv.fit$lambda.min) # or: cv.fit$lambda.1se
Active.Index<-which(coefficients!=0)
Active.coefficients<-coefficients[Active.Index]

以上为简易版的代码,具体任务可根据实际需求灵活调整。

参考资料:热门数据挖掘模型应用入门(一): LASSO 回归

 

你可能感兴趣的:(机器学习)