首页 > 解决方案 > glmnet 包中的“standardize =”选项

问题描述

我有一个关于 glmnet 包中的标准化选项的问题。
我知道为了使系数有意义,回归分析需要缩放或标准化数据集。
通常,对于线性回归(例如,使用 R 中的 glm 函数),我在运行 glm 模型之前使用 scale() 函数手动缩放数据集。
然而,似乎在使用 glmnet 包(用于正则化回归)时,标准化选项确实标准化了数据集,从而使系数本身有意义(可比较)。我对么?

如果这是正确的,假设我运行以下代码。事实证明,变量“x3”的系数最高(在绝对值范围内)。那么我可以得出结论,变量“x3”是区分类别中最重要的变量吗???

我期待听到任何意见!谢谢。

set.seed(12345) 
example.dat <- data.frame(Category = rbinom(100, 1, 0.5),
                          x1 = rpois(100, 10),
                          x2 = rnorm(100, 3, 10),
                          x3 = rbeta(100, 8, 20),
                          x4 = rnorm(100, -3, 45),
                          x5 = rnorm(100, 1000, 10000))

sample = sample.split(example.dat$Category, SplitRatio = .70)
train = subset(example.dat, sample == TRUE)
test  = subset(example.dat, sample == FALSE)

set.seed(12345)
lasso.fit <- cv.glmnet(data.matrix(train[,-1]),
                       train[,1], 
                       family         = "binomial",
                       nfolds         = nrow(train), # LOOCV
                       grouped        = FALSE,
                       type.measure   = "class",
                       alpha          = 0.6,
                       standardize    = TRUE,
                       standardize.response = TRUE)
print(lasso.fit)
coef       <- as.matrix(abs(coef(lasso.fit, s = "lambda.1se")))
coef.order <- as.matrix(coef[order(coef, decreasing = TRUE),])
rownames(as.matrix(coef.order[coef.order[,1]>0,]))
# [1] "x3"          "(Intercept)"

标签: rscaleglmnetlasso-regressionstandardization

解决方案


回复有点晚,但希望对您有所帮助。

在使用返回原始比例系数的本机标准化选项时请记住glmnet(请参阅下面的文档),所以我会小心得出这个结论。

每当我想在相同的尺度上比较系数时,我都会scale()在运行前进行标准化glmnet。这样,您可以获得返回的缩放系数以进行比较。


在拟合模型序列之前,标准化 x 变量标准化的逻辑标志。系数始终以原始比例返回。默认为标准化=真。如果变量已经采用相同的单位,您可能不希望标准化。

glmnet 文档


推荐阅读