罚广义线性模型:LASSO vs 岭回归
-
3 罚广义线性模型 51
install.packages("lars") install.packages("ridge")
(1) OLS回归
library(ridge) data(GenCont) model.ols <- lm(Phenotypes ~ ., data = as.data.frame(GenCont)) summary(model.ols)
提取回归系数
coef.ols <- coef(model.ols)
查看不等于0的回归系数
coef.ols[coef.ols!=0]
(2) ridge regression(岭回归)
model.rid <- linearRidge(Phenotypes ~ ., seq(0, 10, length = 100), data = as.data.frame(GenCont))
查看结果
summary(model.rid)
提取系数
coef返回的是标准化系数; 直接输入model.rid返回的是原始数据系数 coef.rid <- coef(model.rid) model.rid2 <- linearRidge(Phenotypes ~ ., data = as.data.frame(GenCont)) summary(model.rid2) coef.rid <- coef(model.rid2)
查看不等于0的系数
coef.rid[coef.rid!=0]
(3) 做 lasso regression
模型设定
library(lars) dt<-as.matrix(GenCont) X<-dt[,-1] Y<-dt[,1] model.lasso1 <- lars(X, Y) model.lasso2 <- lars(X, Y, type='lasso') model.lasso3 <- lars(X, Y, type='for') # Can use abbreviations
看变量选入顺序
model.lasso3 summary(model.lasso3)
Cp的含义:衡量多重共线性,其取值越小越好,这里取到第3步使得Cp值最小
画个图
plot(model.lasso3) set.seed(12345)
做交叉验证
CV.lasso <- cv.lars(X, Y, K=10) (best <- CV.lasso
cv)])选择最好的效果
(coef.lasso <- coef.lars(model.lasso3, mode='fraction', s=best))
命名
names(coef.lasso) <- colnames(dt)[-1]
查看结果
coef.lasso[coef.lasso!=0]
-
- 为什么用Penalized regression而不是普通的OLS回归?它究竟有什么好处?
- Lasso regression和ridge regression有什么区别?
用罚回归(Penalized regression)的原因
罚回归主要用来解决两个问题:一个是过拟合(over fitting),一个是特征(feature)的多重共线性。
普通的OLS模型如下所示:
其中
是因变量(dependent variable) 是自变量 是系数- e 是残差项
OLS算法要做小化残差平方和
,这个函数也可以看作OLS的损失函数(loss function)过拟合
但是这个模型可能有过拟合的问题,过拟合就意味着一些特征是不需要的。因此,需要把一些特征剔除或者让它们的系数越小越好。
因此,如果能够在原本的损失函数(loss function)的基础上,加上一个惩罚项
,使得这个损失函数能够随着 的增加而增加就好了。罚回归和普通回归最大的区别就是在损失函数上加上了惩罚项。
多重共线性
罚回归可以解决多重共线性的问题。
Lasso regression和Ridge regression
Lasso regression和Ridge regression的区别在于它们对于惩罚项的定义不同。
Lasso regression用的是l1-norm,Ridge regression用的是l2-norm。
l1-norm是 绝对值的和,l2-norm是 的平方和。用公式写出来的话,就是-
l1-norm:
-
l2-norm
所以Lasso和Ridge的损失函数分别是
参数代表惩罚程度的高低。- 当
过高时,最后得到的模型就会过于简单。 - 当
过低时,最后得到的模型就会过于复杂,相当于没有解决过拟合问题。
Lasso和Ridge在实践过程中最大的区别是:Lasso求得的损失函数最小值点会让一些
系数直接变成0,然而Ridge求得的损失函数最小值点虽然会让一些 系数变得很小,但是一般不会减小到0。因此Lasso回归还有选择特征的作用。当特征很多时,Lasso回归的表现往往更好。
但是Lasso在两种情况下表现较差:
- 特征很多,观测值(observations)很少的时候。极端情况下是观测值小于特征数。此时,Lasso回归选择的参数不会多于观测值的个数。
- 变量高度相关的时候,Lasso只会选择高度相关变量中的一个而忽略其它变量。
Elastic Net
为了解决Lasso和Ridge回归的缺点,可以使用Elastic Net回归,Elastic net结合了Lasso和Ridge两者的惩罚项。
Elastic net的惩罚项是:
- 当
- 当
参考文献:
https://en.wikipedia.org/wiki/Elastic_net_regularization
-
为什么用Penalized regression前需要对变量做标准化(standardization)
惩罚项是不对任何参数区别对待的。但是当一个变量取不同的量纲时,其参数的估计值自然也不一样。在这种情况下,惩罚项就会更多的“惩罚”大参数。
为了避免这种情况,需要对变量进行标准化,让它们有相同的量纲。
这里介绍两种标准化的方法,分别对应sklearn包中的StandardScaler和MaxminScaler
-
StandardScaler:变量减去均值除以标准差。用Standard Scaler还有能够简化计算的优点。
-
MaxminScaler:有时也叫做Normalization(注:这个词有多重意思)。把变量缩小到0和1之间。
用哪种最好目前说法不一。实际操作中最好两者都进行尝试。根据结果选择最好的方法。
-
-
感谢老师!我加一点理论知识,有时间把相对应的python代码传上来。
-
为什么penalized regression可以解决多重共线问题我还没有想明白,欢迎大家补充
-
Ridge罚回归的贝叶斯解释: Bayesian interpretation of regularization
普通OLS回顾
对于普通的OLS回归,当假设残差项为正态分布时,我们可以把它算作MLE(Maximum likelihood regression)
(
用向量表示的话就是 )MLE的任务就是要最大化likelihood。
因为
, 所以
因此, likelihood 可以表示为
所以得出结论:需要找到让
最小的罚回归
这里要引入MAP的概念(maximum a posteriori estimate),是指最大化后验分布概率
罚回归相当于我们假设
的先验分布是正态分布 其中 是未知常量根据贝叶斯公式,可以得到
最大化likelihood就是最小化
其中
就是参数
-
此回复已被删除!