Я смотрю на использование лассо в качестве метода выбора признаков и подбора прогнозирующей модели с бинарной целью. Ниже приведен код, с которым я играл, чтобы опробовать метод с регуляризованной логистической регрессией.
Мой вопрос заключается в том, что я получил группу «значимых» переменных, но могу ли я упорядочить их, чтобы оценить относительную важность каждой из них? Можно ли стандартизировать коэффициенты для этой цели ранга по абсолютной величине (я понимаю, что они показаны в исходной переменной шкале через 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)
источник
Чтобы получить коэффициент в пространстве, который позволяет вам напрямую сравнивать их важность, вы должны стандартизировать их. Я написал заметку на Thinklab, чтобы обсудить стандартизацию коэффициентов логистической регрессии.
(Очень) Короче говоря, я советую использовать метод Агрести :
Если вы полагались на внутреннюю стандартизацию с помощью glmnet (опция по умолчанию
standardize = TRUE
), то эти стандартизированные коэффициенты фактически являются теми, которые получены на этапе подгонки, до ретрансформации с помощью glmnet в исходном пространстве (см. Другое примечание :-)).источник
std_coefs <- coefs[-1, 1] * sds
glmnet
объект создан сstandardize = TRUE
илиstandardize = FALSE
, да?