首先思考一个问题:正则化为什么可以防止过拟合?带着这个问题看下面的内容(第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回归
网上有很多介绍这个的,这里不再赘述。
这篇文章写得还行,参考一下
另外,可以看看博主发的多项式回归的知识
其他的比如:
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<p),利用投影得到的不相关的组合建立线性模型。
这部分详细介绍可以参考:高维数据中特征筛选方法的思考总结——多变量分析筛选法
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 回归