来自 GLMNET 的可变重要性

机器算法验证 物流 重要性 网络
2022-01-27 07:05:46

我正在考虑使用套索作为选择特征和用二进制目标拟合预测模型的方法。下面是我正在使用的一些代码,用于尝试使用正则化逻辑回归的方法。

我的问题是我得到了一组“重要”变量,但我能否对这些变量进行排序以估计每个变量的相对重要性?系数是否可以为此按绝对值进行排名而标准化(我知道它们通过coef函数显示在原始变量尺度上)?如果是这样,如何做到这一点(使用 x 和 y 的标准差)标准化回归系数

示例代码:

    library(glmnet)

    #data comes from

#http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)

    datasetTest <- read.csv('C:/Documents and Settings/E997608/Desktop/wdbc.data.txt',head=FALSE)


#appears to use the first level as the target success
   datasetTest$V2<-as.factor(ifelse(as.character(datasetTest$V2)=="M","0","1"))


#cross validation to find optimal lambda
#using the lasso because alpha=1

    cv.result<-cv.glmnet(       
              x=as.matrix(dataset[,3:ncol(datasetTest)]),
              y=datasetTest[,2],        
              family="binomial",        
              nfolds=10,        
              type.measure="deviance",       
              alpha=1      
              )

#values of lambda used

    histogram(cv.result$lambda)

#plot of the error measure (here was deviance)
#as a CI from each of the 10 folds
#for each value of lambda (log actually)

    plot(cv.result) 

#the mean cross validation error (one for each of the
#100 values of lambda

    cv.result$cvm

#the value of lambda that minimzes the error measure
#result: 0.001909601

    cv.result$lambda.min
    log(cv.result$lambda.min)

#the value of lambda that minimzes the error measure
#within 1 SE of the minimum
#result: 0.007024236

    cv.result$lambda.1se

#the full sequence was fit in the object called cv.result$glmnet.fit
#this is same as a call to it directly.
#here are the coefficients from the min lambda

    coef(cv.result$glmnet.fit,s=cv.result$lambda.1se)
2个回答

据我所知,glmnet 不计算回归系数的标准误差(因为它使用循环坐标下降拟合模型参数)。因此,如果您需要标准化回归系数,则需要使用其他方法(例如 glm)

话虽如此,如果在拟合之前对解释变量进行了标准化,并且使用“standardize = FALSE”调用glmnet,那么不太重要的系数将小于更重要的系数 - 因此您可以仅按它们的大小对它们进行排名。这在非微不足道的收缩量(即非零 lambda)下变得更加明显

希望这可以帮助..

要获得一个空间中的系数,让您可以直接比较它们的重要性,您必须对它们进行标准化。我在 Thinklab 上写了一篇笔记,讨论逻辑回归系数的标准化。

(非常)长话短说,我建议使用Agresti方法:

# if X is the input matrix of the glmnet function,
# and cv.result is your glmnet object:
sds <- apply(X, 2, sd)
cs <- as.matrix(coef(cv.result, s = "lambda.min"))
std_coefs <- coefs[-1, 1] * sds

如果您依赖 glmnet 的内部标准化(默认选项standardize = TRUE),则这些标准化系数实际上是在 glmnet 在原始空间中重新转换之前由拟合步骤产生的系数(参见另一个注释:-))。