对于 glmnet,如何将 n 级分类变量编码为虚拟变量?

机器算法验证 r 分类数据 网络
2022-04-01 21:22:42

将分类变量输入glmnet时,我是编码n还是n-1虚拟变量?

例如,如果使用星期几作为自变量,我会使用 6 个假人还是 7 个?

如果答案是 6,我如何解释丢弃类别的系数等?

编辑:这是一些示例代码:

library(glmnet)
library(caret)

df1 <- data.frame(id = 1:210, var1 = rep(c('Mon','Tues','Wed','Thurs','Fri','Sat','Sun'),30))
df1$targetVar <- runif(210)
    df1$mktVol <- round(runif(210)*1000000,0)
df1$mktVol <- ifelse(df1$var1 %in% c('Sat','Sun'), 0, df1$mktVol)

df1
vtu <- c('mktVol','var1')
dv1 <- dummyVars( ~.,data = df1[,vtu])
df2 <- data.frame(predict(dv1,df1))

glmnet1 <- cv.glmnet(df2$targetVar, data.matrix(df2[,-c('targetVar')]), nfolds = 5)

glmnet1 <- cv.glmnet( data.matrix(df2[,-1]), df2[,"mktVol"] ,
      family="gaussian", alpha=.95, nfolds=5, standardize = FALSE,
      type.measure="mse")

Coefficients1 <- coef(glmnet1, s = glmnet1$lambda.min)
Active.Index <- which(Coefficients != 0)
Active.Coefficients <- Coefficients[Active.Index]
names(X1)[varsToUse[Active.Index]]

##############################

df1 <- data.frame(id = 1:210, var1 = rep(c('Mon','Tues','Wed','Thurs','Fri','Sat','Sun'),30))
df1$targetVar <- runif(210)
    df1$mktVol <- round(runif(210)*1000000,0)
df1$mktVol <- ifelse(df1$var1 %in% c('Sat','Sun'), 0, df1$mktVol)

df1
vtu <- c('mktVol','var1')
#dv1 <- dummyVars( ~.,data = df1[,vtu])
#df2 <- data.frame(predict(dv1,df1))
dv1 <- model.matrix(~.,data = df1[,vtu])

#glmnet1 <- cv.glmnet(df2$targetVar, data.matrix(df2[,-c('targetVar')]), nfolds = 5)

glmnet1 <- cv.glmnet( data.matrix(df2[,-1]), df2[,"mktVol"] ,
      family="gaussian", alpha=.95, nfolds=5, standardize = FALSE,
      type.measure="mse")

Coefficients2 <- coef(glmnet1, s = glmnet1$lambda.min)

##############################

df1 <- data.frame(id = 1:210, var1 = rep(c('Mon','Tues','Wed','Thurs','Fri','Sat','Sun'),30))
df1$targetVar <- runif(210)
    df1$mktVol <- round(runif(210)*1000000,0)
df1$mktVol <- ifelse(df1$var1 %in% c('Sat','Sun'), 0, df1$mktVol)

df1
vtu <- c('mktVol','var1')
#dv1 <- dummyVars( ~.,data = df1[,vtu])
#df2 <- data.frame(predict(dv1,df1))
dv1 <- model.matrix(~ 0+ .,data = df1[,vtu])

#glmnet1 <- cv.glmnet(df2$targetVar, data.matrix(df2[,-c('targetVar')]), nfolds = 5)

glmnet1 <- cv.glmnet( data.matrix(df2[,-1]), df2[,"mktVol"] ,
      family="gaussian", alpha=.95, nfolds=5, standardize = FALSE,
      type.measure="mse")

Coefficients3 <- coef(glmnet1, s = glmnet1$lambda.min)
Coefficients1 
Coefficients2 
Coefficients3 
2个回答

“在 k 个相同预测变量的极端情况下,它们每个都得到相同的系数,其中 1=kth 是任何一个单独的 t 所获得的大小。从贝叶斯的角度来看,如果有很多预测变量,岭惩罚是理想的,并且都有非零系数(从高斯分布中得出)。

另一方面,Lasso 对非常相关的预测变量有点漠不关心,并且倾向于选择一个而忽略其余的。在上面的极端情况下,套索问题就失效了。套索惩罚对应于拉普拉斯先验,它期望许多系数接近于零,而一小部分子集更大且非零。”

第 4 页,通过坐标下降的广义线性模型的正则化路径,Jerome Friedman,Trevor Hastie,Rob Tibshirani。

所以,你可以把它们都留在里面——因为 Ridge 保证 (X'X) 矩阵是可逆的——但我不推荐它。

这个问题似乎与 无关glmnet,但通常对系数进行因子编码和解释。

我建议看一下使用分类变量作为开始的逻辑回归。R 库:分类变量的对比编码系统是学习不同类型的编码和解释的重要资源。关键是“与基础水平比较”。例如,如果我们想对周中的天数进行编码。我们可以将星期日作为基准水平,所有其他日子将与之进行比较。