r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-1
https://developer.aliyun.com/article/1489394
线性回归
这里的线性回归是指两个模型系列。一个是 gaussian
正态_分布_,另一个是 mgaussian
多元正态_分布_。
正态_分布_
假设我们有观测值xi∈Rp并且yi∈R,i = 1,...,N。目标函数是
其中λ≥0是复杂度参数,0≤α≤1在岭回归(α=0)和套索LASSO(α=1)之间。
应用坐标下降法解决该问题。具体地说,通过计算βj=β〜j处的梯度和简单的演算,更新为
其中 。
当x
变量标准化为具有单位方差(默认值)时,以上公式适用 。
glmnet
提供各种选项供用户自定义。我们在这里介绍一些常用的选项,它们可以在glmnet
函数中指定 。
alpha
表示弹性网混合参数α,范围α∈[0,1]。α=1是套索(默认),α=0是Ridge。weights
用于观察权重。每个观察值的默认值为1。nlambda
是序列中λ值的数量。默认值为100。lambda
可以提供,但通常不提供,程序会构建一个序列。自动生成时,λ序列由lambda.max
和 确定lambda.min.ratio
。standardize
是x
在拟合模型序列之前进行变量标准化的逻辑标志 。
例如,我们设置α=0.2,并对后半部分的观测值赋予两倍的权重。为了避免在此处显示太长时间,我们将其设置 nlambda
为20。但是,实际上,建议将λ的数量设置为100(默认值)或更多。
然后我们可以输出glmnet
对象。
print(fit)
## ## Call: glmnet(x = x, y = y, weights = c(rep(1, 50), rep(2, 50)), alpha = 0.2, nlambda = 20) ## ## Df %Dev Lambda ## \[1,\] 0 0.000 7.94000 ## \[2,\] 4 0.179 4.89000 ## \[3,\] 7 0.444 3.01000 ## \[4,\] 7 0.657 1.85000 ## \[5,\] 8 0.785 1.14000 ## \[6,\] 9 0.854 0.70300 ## \[7,\] 10 0.887 0.43300 ## \[8,\] 11 0.902 0.26700 ## \[9,\] 14 0.910 0.16400 ## \[10,\] 17 0.914 0.10100 ## \[11,\] 17 0.915 0.06230 ## \[12,\] 17 0.916 0.03840 ## \[13,\] 19 0.916 0.02360 ## \[14,\] 20 0.916 0.01460 ## \[15,\] 20 0.916 0.00896 ## \[16,\] 20 0.916 0.00552 ## \[17,\] 20 0.916 0.00340
这将显示生成对象的调用 fit
以及带有列Df
(非零系数的数量), %dev
(解释的偏差百分比)和Lambda
(对应的λ值) 的三列矩阵 。
我们可以绘制拟合的对象。
让我们针对log-lambda值标记每个曲线来绘制“拟合”。
这是训练数据中的偏差百分比。我们在这里看到的是,在路径末端时,该值变化不大,但是系数有点“膨胀”。这使我们可以将注意力集中在重要的拟合部分上。
我们可以提取系数并在某些特定值的情况下进行预测。两种常用的选项是:
s
指定进行提取的λ值。exact
指示是否需要系数的精确值。
一个简单的例子是:
## 21 x 2 sparse Matrix of class "dgCMatrix" ## 1 1 ## (Intercept) 0.19657 0.199099 ## V1 1.17496 1.174650 ## V2 . . ## V3 0.52934 0.531935 ## V4 . . ## V5 -0.76126 -0.760959 ## V6 0.46627 0.468209 ## V7 0.06148 0.061927 ## V8 0.38049 0.380301 ## V9 . . ## V10 . . ## V11 0.14214 0.143261 ## V12 . . ## V13 . . ## V14 -0.91090 -0.911207 ## V15 . . ## V16 . . ## V17 . . ## V18 . 0.009197 ## V19 . . ## V20 -0.86099 -0.863117
左列是,exact = TRUE
右列是 FALSE
。从上面我们可以看到,0.01不在序列中,因此尽管没有太大差异,但还是有一些差异。如果没有特殊要求,则线性插补就足够了。
用户可以根据拟合的对象进行预测。除中的选项外 coef
,主要参数是 newx
的新值矩阵 x
。type
选项允许用户选择预测类型:*“链接”给出拟合值
- 因变量与正态分布的“链接”相同。
- “系数”计算值为的系数
s
例如,
## 1 ## \[1,\] -0.9803 ## \[2,\] 2.2992 ## \[3,\] 0.6011 ## \[4,\] 2.3573 ## \[5,\] 1.7520
给出在λ=0.05时前5个观测值的拟合值。如果提供的多个值, s
则会生成预测矩阵。
用户可以自定义K折交叉验证。除所有 glmnet
参数外, cv.glmnet
还有特殊的参数,包括 nfolds
(次数), foldid
(用户提供的次数), type.measure
(用于交叉验证的损失):*“ deviance”或“ mse”
- “ mae”使用平均绝对误差
举个例子,
cvfit = cv.glmnet(x, y, type.measure = "mse", nfolds = 20)
根据均方误差标准进行20折交叉验证。
并行计算也受 cv.glmnet
。为我们在这里给出一个简单的比较示例。
system.time(cv.glmnet(X, Y))
## user system elapsed ## 3.591 0.103 3.724
system.time(cv.glmnet(X, Y, parallel = TRUE))
## user system elapsed ## 4.318 0.391 2.700
从上面的建议可以看出,并行计算可以大大加快计算过程。
- “ lambda.min”:达到最小MSE的λ。
cvfit$lambda.min
## \[1\] 0.08307
## 21 x 1 sparse Matrix of class "dgCMatrix" ## 1 ## (Intercept) 0.14936 ## V1 1.32975 ## V2 . ## V3 0.69096 ## V4 . ## V5 -0.83123 ## V6 0.53670 ## V7 0.02005 ## V8 0.33194 ## V9 . ## V10 . ## V11 0.16239 ## V12 . ## V13 . ## V14 -1.07081 ## V15 . ## V16 . ## V17 . ## V18 . ## V19 . ## V20 -1.04341
在这里,我们使用相同的k折,为α选择一个值。
将它们全部放置在同一绘图上:
我们看到lasso(alpha=1
)在这里表现最好。
r语言中对LASSO回归,Ridge岭回归和弹性网络Elastic Net模型实现-3