"standardize = " glmnet 包中的选项
"standardize = " option in glmnet package
我有一个关于 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)"
回复有点晚,但希望对您有所帮助。
请记住,在使用原生标准化选项时,glmnet
returns 原始尺度上的系数(请参阅下面的文档),因此我会谨慎得出该结论。
每当我想在同一尺度上比较系数时,我都会在运行 glmnet
之前使用scale()
进行标准化。这样,您可以获得返回的比例系数以进行比较。
standardize
Logical flag for x variable standardization, prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is standardize=TRUE. If variables are in the same units already, you might not wish to 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)"
回复有点晚,但希望对您有所帮助。
请记住,在使用原生标准化选项时,glmnet
returns 原始尺度上的系数(请参阅下面的文档),因此我会谨慎得出该结论。
每当我想在同一尺度上比较系数时,我都会在运行 glmnet
之前使用scale()
进行标准化。这样,您可以获得返回的比例系数以进行比较。
standardize
Logical flag for x variable standardization, prior to fitting the model sequence. The coefficients are always returned on the original scale. Default is standardize=TRUE. If variables are in the same units already, you might not wish to standardize.