下面是glmnet中的一些方法:
首先是一些数据,因为您没有发布任何数据(虹膜数据在物种中有两个级别):
data(iris)
x <- iris[,1:4]
y <- iris[,5]
y[y == "setosa"] <- "virginica"
y <- factor(y)
首先运行一个交叉验证模型,看看什么是最好的 lambda:
library(glmnet)
model_cv <- cv.glmnet(x = as.matrix(x),
y = y,
family = "binomial",
alpha = 1,
nfolds = 5,
intercept = FALSE)
在这里,我选择了 5 折交叉验证来确定最佳 lambda。
最好也看一下 lambda 的系数:
coef(model_cv, s = "lambda.min")
#output
#5 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) .
Sepal.Length -0.7966676
Sepal.Width 1.9291364
Petal.Length -0.9502821
Petal.Width 2.7113327
在这里您可以看到没有删除任何变量(或者它们将有 . 而不是系数)。如果所有特征都在同一尺度上(如基因表达数据),您可以考虑将standardize = FALSE 作为参数添加到 glmnet 调用,因为它默认设置为TRUE。至少我在建模表达式时会这样做。
查看最佳 lambda:
model_cv$lambda[which.min(model_cv$cvm)]
现在您可以使用所有数据制作模型:
glmnet_l0 <- glmnet(x = as.matrix(x),
y = y,
family = "binomial",
alpha = 1,
intercept = FALSE)
您可以在 lambda 刻度上绘制它并添加一条垂直线来描绘最佳 lambda:
plot(glmnet_l0, xvar = "lambda")
abline(v = log(model_cv$lambda[which.min(model_cv$cvm)]))
在这里可以看到系数几乎没有缩小,在最好的情况下是 lambda。
对于更高维度的数据,您会看到许多系数轨迹在最佳 lambda 开始之前趋向 0 和许多 .在 coef 矩阵中。
当使用predict.glmnet 时设置s = model_cv$lambda[which.min(model_cv$cvm)] 否则它将为所有测试的 lambda 生成预测。
同时检查这个post 它包含一些其他相关信息。