弹性网络_线性回归(7)—— 弹性网络

之前有同学问,对于岭回归和Lasso该如何选择呢?岭回归在于 “抑制住回归系数的锋芒,不让 系数那么大,但是不会让 系数变为0”. 如果在你的数据中每个变量都特别重要,你不想有些变量被剔除,那么岭回归可能比较适合你。Lasso回归在于 “稀疏是这个世界的真相,随着lambda的变大,它会让一些回归系数变为0”。如果你的数据中变量特别多,希望挑选出一些特征变量,那么Lasso回归可能比较适合你。此外,还有一种方法将岭回归和Lasso回归的优势综合了起来——弹性网络。它将L1惩罚与L2惩罚同时引入到目标函数的最小化过程中,在获得稀疏系数的同时,维持了岭回归的正则属性。弹性网络在很多特征互相联系的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程中继承 Ridge 的稳定性。 弹性网络包含了一个混合参数α,它和lambda同时起作用。 α是一个0和1之间的数,lambda和前面一样,用来调节惩罚项的大小。 当α=0时,弹性网络等价于岭 回归; 当α=1时,弹性网络等价于Lasso。如下:

d38462633958639825835e2de22d4098.png

弹性网络的矩阵推导同岭回归,这里就不多说了,有兴趣的自行推导下。我们这里直接来实战演练:
library(ElemStatLearn) #contains the datalibrary(car) #package to calculate Variance Inflation Factorlibrary(glmnet) #allows ridge regression, LASSO and elastic nedata(prostate)str(prostate)prostate$gleason 6, table(prostate$gleason)##将gleason评分变为二分类变量 <=6 和 >6train TRUE)[,test = subset(prostate, train==FALSE)[,1:9]x as.matrix(train[, y 9]

我们这里直接用cv.glmnet来交叉验证构建的Elastic network,统一选择lambda.1se作为最佳lambda。alpha依次设置为0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1. 其中当alpha=0的时候为岭回归,alpha=1的时候为lasso回归,其实这两种回归也是弹性网络的特殊情况。

构建一个循环,算出当alpha为不同值的时候,测试集MSE的变化。

result for (i in 0:10) {  fit 'mse',family=  Predicted $lambda.1se,newx = as.matrix(  mse test  result 'alpha-',i/10),alpha=i/10,MSE=mse))}result$Fit $alpha==1,                     ifelse(result$alpha==0,'Ridge','Elastic-Net'))result                 

弹性网络_线性回归(7)—— 弹性网络_第1张图片

library(ggplot2)library(ggsci)ggplot(result,aes(alpha,MSE,color=Fit))+  geom_point(size=4,alpha=0.8)+  theme_classic()+  scale_color_manual(values = c("#4DBBD5FF","#E64B35FF","#00A087FF"))+  theme(legend.position = c(0.9,0.9),legend.title = element_blank())

弹性网络_线性回归(7)—— 弹性网络_第2张图片

通过MSE这个评估标准,我们发现Lasso在测试集中仍然是最好的模型。

在其它的弹性网络中,我们发现当alpha=0.8时,MSE仅次于Lasso。所以仅仅为了测试起见,我们查看下alpha=0.8的弹性网络model。

fit type.measure=plot(fit)

弹性网络_线性回归(7)—— 弹性网络_第3张图片

cv.fit type.measure = plot(cv.fit)

弹性网络_线性回归(7)—— 弹性网络_第4张图片

你可能感兴趣的:(弹性网络)