Como interpretar Lasso reduzindo todos os coeficientes para 0?

8

Eu tenho um conjunto de dados com 338 preditores e 570 instâncias (infelizmente não é possível carregar) no qual estou usando o Lasso para executar a seleção de recursos. Em particular, estou usando a cv.glmnetfunção da glmnetseguinte maneira, onde mydata_matrixé uma matriz binária de 570 x 339 e a saída também é binária:

library(glmnet)
x_dat <- mydata_matrix[, -ncol(mydata_matrix)]
y <- mydata_matrix[, ncol(mydata_matrix)]
cvfit <- cv.glmnet(x_dat, y, family='binomial')

Esse gráfico mostra que o menor desvio ocorre quando todas as variáveis ​​foram removidas do modelo. Isso realmente está dizendo que apenas o uso da interceptação é mais preditivo do resultado do que usar apenas um único preditor ou cometi um erro, possivelmente nos dados ou na chamada de função?

Isso é semelhante a uma pergunta anterior , mas não obteve nenhuma resposta.

plot(cvfit)

insira a descrição da imagem aqui

Stuart Lacy
fonte
1
Eu acho que esse link pode detalhar alguns detalhes. Em essência, isso pode significar que muitos (se não todos) seus preditores não são muito significativos. O tópico abaixo explica isso com mais detalhes. stats.stackexchange.com/questions/182595/…
Dhiraj
3
@Dhiraj Significativo é um termo técnico relacionado ao teste de significância de hipótese nula. Não é apropriado aqui.
Matthew Drury

Respostas:

11

Eu não acho que você cometeu um erro no código. É uma questão de interpretar a saída.

O Lasso não indica quais regressores individuais são "mais preditivos" que outros. Ele simplesmente tem uma tendência interna de estimar coeficientes como zero. Quanto maior o coeficiente de penalidade , maior é essa tendência.log(λ)

Seu gráfico de validação cruzada mostra que, à medida que mais e mais coeficientes são forçados a zero, o modelo realiza um trabalho cada vez melhor de prever subconjuntos de valores que foram removidos aleatoriamente do conjunto de dados. Quando os melhores erros de previsão com validação cruzada (medidos como o "Desvio Binomial" aqui) são alcançados quando todos os coeficientes são zero, você deve suspeitar que nenhuma combinação linear de qualquer subconjunto dos regressores possa ser útil para prever os resultados.

Você pode verificar isso gerando respostas aleatórias que são independentes de todos os regressores e aplicando seu procedimento de ajuste a eles. Aqui está uma maneira rápida de emular seu conjunto de dados:

n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
                       dimnames=list(1:n, c("y", paste0("x", 1:k)))))

O quadro de dados Xpossui uma coluna binária aleatória chamada "y" e 338 outras colunas binárias (cujos nomes não importam). Usei sua abordagem para regredir "y" contra essas variáveis, mas - apenas para ter cuidado - verifiquei se o vetor de resposta ye a matriz do modelo xeram compatíveis (o que eles podem não fazer caso haja algum valor faltante nos dados) :

f <- y ~ . - 1            # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")

O resultado é notavelmente semelhante ao seu:

plot(fit)

Figura

De fato, com esses dados completamente aleatórios, o Lasso ainda retorna nove estimativas de coeficientes diferentes de zero (embora saibamos, por construção, que os valores corretos são zero). Mas não devemos esperar perfeição. Além disso, como o ajuste é baseado na remoção aleatória de subconjuntos de dados para validação cruzada, normalmente você não obterá a mesma saída de uma execução para a seguinte. Neste exemplo, uma segunda chamada cv.glmnetproduz um ajuste com apenas um coeficiente diferente de zero. Por esse motivo, se você tiver tempo, é sempre uma boa idéia executar novamente o procedimento de ajuste várias vezes e acompanhar quais estimativas de coeficiente são consistentemente diferentes de zero. Para esses dados - com centenas de regressores -, levará alguns minutos para repetir mais nove vezes.

sim <- cbind(as.numeric(coef(fit)), 
             replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), 
     xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
     main="Results of Repeated Cross-Validated Lasso Fits")

Figura 2

Oito desses regressores têm estimativas diferentes de zero em cerca de metade dos ajustes; o resto deles nunca tem estimativas diferentes de zero. Isso mostra até que ponto o Lasso ainda incluirá estimativas de coeficientes diferentes de zero, mesmo quando os coeficientes em si forem realmente zero.

whuber
fonte
1

Se você deseja obter mais informações, pode usar a função

fit1<-glmnet(x_dat, y, family='binomial', alpha= x)

plot(fit1, xvar = "lambda", label = TRUE)

O gráfico deve ser semelhante ao. insira a descrição da imagem aqui Os rótulos permitem identificar o efeito de lambda para os regressores.

Você pode usar valores diferentes de x (no modelo é chamado fator alfa) a 0 (regressão de crista) a 1 (regressão LASSO). O valor [0,1] é a regressão líquida elástica

Luigi Biagini
fonte
Diminuir o alfa para 0,5 ajudou a incluir mais variáveis, obrigado pela dica.
Stuart Lacy
0

A resposta de que não existem combinações lineares de variáveis ​​úteis na previsão de resultados é verdadeira em alguns casos, mas não em todos.

Eu tinha um gráfico como o acima, causado por multicolinearidade em meus dados. Reduzir as correlações permitiu que Lasso funcionasse, mas também removeu informações úteis sobre os resultados. Conjuntos melhores de variáveis ​​foram obtidos usando a importância aleatória da floresta para rastrear variáveis ​​e depois usando Lasso.

Chuvoso
fonte
-1

É possível, mas um pouco surpreendente. O LASSO pode fazer coisas estranhas quando você tem colinearidade; nesse caso, você provavelmente deve definir alfa <1, para que esteja ajustando uma rede elástica. Você pode escolher alfa por validação cruzada, mas verifique se está usando as mesmas dobras para cada valor de alfa.

inside_person
fonte