Um exemplo de como fazer baunilha validação cruzada simples para lasso no glmnet
no mtcars
conjunto de dados.
Carregar conjunto de dados.
Prepare recursos (variáveis independentes). Eles devem ser de matrix
classe. A maneira mais fácil de converter df
contendo variáveis categóricas em matrix
é através de model.matrix
. Lembre-se, por padrão, glmnet
se encaixa na interceptação, então é melhor descartar a interceptação da matriz do modelo.
Prepare a resposta (variável dependente). Vamos codificar carros com acima da média mpg
como eficiente ('1') e o restante como ineficiente ('0'). Converta essa variável em fator.
Execute a validação cruzada via cv.glmnet
. Ele captará alpha=1
os glmnet
parâmetros padrão , que é o que você pediu: regressão do laço.
Examinando a saída da validação cruzada, você pode estar interessado em pelo menos duas informações:
lambda, que minimiza erros de validação cruzada. glmnet
realmente fornece 2 lambdas: lambda.min
e lambda.1se
. É seu julgamento como estatístico praticante que você deve usar.
coeficientes regularizados resultantes.
Por favor, veja o código R de acordo com as instruções acima:
# Load data set
data("mtcars")
# Prepare data set
x <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y <- factor(mpg, labels = c('notEfficient', 'efficient'))
library(glmnet)
# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')
mod_cv$lambda.1se
[1] 0.108442
coef(mod_cv, mod_cv$lambda.1se)
1
(Intercept) 5.6971598
cyl -0.9822704
disp .
hp .
drat .
wt .
qsec .
vs .
am .
gear .
carb .
mod_cv$lambda.min
[1] 0.01537137
coef(mod_cv, mod_cv$lambda.min)
1
(Intercept) 6.04249733
cyl -0.95867199
disp .
hp -0.01962924
drat 0.83578090
wt .
qsec .
vs .
am 2.65798203
gear .
carb -0.67974620
Comentários finais:
note que a saída do modelo não diz nada sobre a significância estatística dos coeficientes, apenas valores.
O penalizador l1 (laço), que você pediu, é notório por instabilidade, como evidenciado nesta postagem do blog e nesta pergunta de stackexchange . Uma maneira melhor poderia ser a validação cruzada alpha
também, o que permitiria decidir sobre a combinação adequada de penalizadores l1 e l2.
uma maneira alternativa de fazer a validação cruzada pode ser recorrer ao sinal de intercalação train( ... method='glmnet')
e, finalmente, a melhor maneira de aprender mais sobre cv.glmnet
e seus padrões glmnet
é, obviamente, ?glmnet
no console do R)))