Um exemplo de como fazer baunilha validação cruzada simples para lasso no glmnetno mtcars
conjunto de dados.
Carregar conjunto de dados.
Prepare recursos (variáveis independentes). Eles devem ser de matrixclasse. A maneira mais fácil de converter dfcontendo variáveis categóricas em matrixé através de model.matrix. Lembre-se, por padrão, glmnetse 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 mpgcomo 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=1os glmnetparâ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. glmnetrealmente fornece 2 lambdas: lambda.mine 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 alphatambé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.glmnete seus padrões glmneté, obviamente, ?glmnetno console do R)))