Лассо-регрессия, ни одна переменная не была удалена

Я выполняю лассо-регрессию в R для бинарной переменной ответа.

Я использую cv.glmnet, чтобы найти лучшую лямбду, и использую glmnet, чтобы проверить коэффициенты для лучшей лямбды. При вызове обеих функций я указываю standardize =TRUE и alpha = 1.

В моем случае около 40 переменных, и я уверен, что некоторые из них сильно коррелируют друг с другом из диаграмм рассеяния и vif (когда я выполнял логистическую регрессию для тех же данных).

Лучшая лямбда, которую я получил в результате регрессии лассо, составляет ‹0,001, и в лучшей модели не отбрасывается ни одна переменная (с лямбда = лучшая лямбда).

Интересно, почему ни одна переменная не была удалена.


person StayLearning    schedule 18.12.2015    source источник
comment
Вы можете опубликовать воспроизводимый пример? сколько наблюдений?   -  person sahir    schedule 21.12.2015
comment
@сахир. К сожалению, я не смог привести пример, который может воспроизвести ситуацию. У меня около 2000 наблюдений. Я, наконец, заканчиваю тем, что использую логистическую регрессию и SVM, потому что я замечаю, что даже я вручную контролирую уровень лямбда (заставляю его быть больше), переменные регрессии Лассо отбрасываются произвольно.   -  person StayLearning    schedule 21.12.2015


Ответы (1)


В основном это потому, что ваше значение lambda слишком мало. lambda<0.001 означает, что ваш штраф настолько мал, что на самом деле не имеет значения. Посмотрите на этот "глупый" пример:

Давайте сгенерируем несколько выборочных случайных данных. Обратите внимание, что переменные z и z1 сильно взаимосвязаны.

library(glmnet)
z<-rnorm(100)
data<-data.frame(y=3+rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100),x4=rnorm(100),x5=rnorm(100),
             x6=rnorm(100),x7=rnorm(100),x8=rnorm(100),x9=rnorm(100),x10=rnorm(100),z=z,z1=z+rnorm(100,0,0.3))

Теперь запустите несколько моделей:

gl<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1)
plot(gl,xvar="lambda")

введите здесь описание изображения

lambda равно 0.001 означает log(lambda)=-6.907755 и даже в этом "глупом" примере, когда мы могли подумать, что коэффициенты не будут значимыми (поэтому значения должны быть равны 0), мы получим маленькие, но ненулевые значения (как на графике).

Коэффициенты от glmnet с lambda=0.001 очень похожи на коэффициенты от glm (как я уже сказал, маленькие lambda равны без штрафа за логарифмическую вероятность):

gl1<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1,lambda=0.001)
gl2<-glm(data=data,formula=y~x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+z+z1) 
gl1$beta
# x1  -0.10985215
# x2  -0.12337595
# x3   0.06088970
# x4  -0.12714515
# x5  -0.12237959
# x6  -0.01439966
# x7   0.02037826
# x8   0.22288055
# x9  -0.10131195
# x10 -0.04268274
# z   -0.04526606
# z1   0.04628616  
gl3$coefficients
(Intercept)          x1          x2          x3          x4          x5          x6 
 2.98542594 -0.11104062 -0.12478162  0.06293879 -0.12833484 -0.12385855 -0.01556657 
         x7          x8          x9         x10           z          z1 
 0.02071605  0.22408006 -0.10195640 -0.04419441 -0.04602251   0.04513612

Теперь посмотрите, в чем разница в коэффициентах этих двух методов:

as.vector(gl1$beta)-as.vector(gl2$coefficients)[-1]
# [1]  0.0011884697  0.0014056731 -0.0020490872  0.0011896872  0.0014789566  0.0011669064
# [7] -0.0003377824 -0.0011995019  0.0006444471  0.0015116774  0.0007564556  0.00115004
person Maju116    schedule 22.12.2015