GLMNET的重要性不一


18

我正在研究使用套索作为选择特征并将预测模型与二值目标拟合的方法。以下是我正在尝试使用正则化逻辑回归的方法的一些代码。

我的问题是我得到一组“重要”变量,但是我能够对这些变量进行排序以估计每个变量的相对重要性吗?为此,可以通过绝对值对系数进行标准化(我知道它们通过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)

Answers:


14

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

话虽如此,如果解释变量在fit和glmnet之前被标准化,并且使用“ standardize = FALSE”进行调用,则次重要的系数将小于次重要的系数-因此您可以按其大小对它们进行排名。非平凡的数量收缩(即非零的λ值)变得更加明显

希望这可以帮助..


2
谢谢。我相信系数会恢复到原始大小。因此,需要重新调整它们的大小(例如,我假设使用我发布的技术)。
B_Miner 2011年

user6129是对的!您无法对所选变量进行排名。这是一个活跃的研究领域。
suncoolsu 2011年

3
@B_Miner:是的,如果使用“ standardize = TRUE”进行调用,glmnet将返回原始比例的系数。解决该问题的一种方法是在外部标准化解释变量(例如,使用“ scale()”函数),并使用“ standardize = FALSE”调用glmnet。然后可以将所得系数按大小排序,以判断其重要性。
Yevgeny

@suncoolsu:请参见上面的最新答案
Yevgeny

@Yevgeny我有一个问题。那么从技术上讲,无论我们设置'standardize = FALSE'并自行对变量进行标准化,还是仅使用'standardize = TRUE',性能结果(例如曲线下的面积)是否应该相同?(仅返回的beta系数会有所不同)。从理论上讲,这就是我的想法,但是实际上,当我使用'standardize = TRUE'时,我会得到更好的结果。因此,系数和性能都不同。这是应该的吗?
米歇尔

7

为了在一个可以直接比较其重要性的空间中获取系数,您必须对其进行标准化。我在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进行重新转换之前,由拟合步骤得出的系数(请参阅其他说明:-)。


2
我想你的最后一行应该是std_coefs <- coefs[-1, 1] * sds。这与您的注释相对应,该注释表示Agresti方法为。我发现这违反直觉,但却是正确的。非标准化系数是预测器中单位变化的结果变化量。归一化系数是预测变量中1个标准差变化的结果变化。为此,必须乘以SD。
b=bσx
肯特·约翰逊,

Antoine-您能确定乘法而不是除法在这里正确吗?
B_Miner

1
实际上,您将系数乘以。线性分数的形式为,即:标准化系数。+ b X + = + b σ XX - μ / σ X + ... b σ X = Xσx+bx+=+(bσx)(xμ)/σx+bσx=x
VictorZurkowski

是的,这是一个错字(这是另一个提醒,不要在不运行代码的情况下不要输入示例;-))感谢您抓住它,它已修复。
安托万·利泽(AntoineLizée)

无论glmnet对象是使用standardize = TRUE还是创建的,这都会给出正确的标准化系数standardize = FALSE,是吗?
詹姆斯·希尔斯霍恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.