Extract the coefficients for the best tuning parameters of a glmnet model in caret

后端 未结 1 373
广开言路
广开言路 2021-01-02 18:46

I am running elastic net regularization in caret using glmnet.

I pass sequence of values to trainControl for alpha and lambda, then I perfo

相关标签:
1条回答
  • 2021-01-02 19:39

    After a bit of playing with your code I find it very odd that glmnet train chooses different lambda ranges depending on the seed. Here is an example:

    library(caret)
    library(glmnet)
    set.seed(13)
    model.test <- caret::train(asthma ~ age + gender + bmi_p + m_edu + p_edu + f_color, data = x, method = "glmnet", 
                               family = "binomial", trControl = fitControl, tuneGrid = tuneGrid, 
                               metric = "ROC")
    
    c(head(model.test$finalModel$lambda, 5), tail(model.test$finalModel$lambda, 5))
    #output
     [1] 3.7796447301 3.4438715094 3.1379274562 2.8591626295 2.6051625017 0.0005483617 0.0004996468 0.0004552595 0.0004148155
    [10] 0.0003779645
    

    optimum lambda is:

    model.test$finalModel$lambdaOpt
    #output
    #[1] 0.05
    

    and this works:

    coef(model.test$finalModel, model.test$finalModel$lambdaOpt)
    #12 x 1 sparse Matrix of class "dgCMatrix"
                            1
    (Intercept)   -0.03158974
    age            0.03329806
    genderX1      -1.24093677
    bmi_p          1.65156913
    m_eduX1        0.45314106
    m_eduX2       -0.09934991
    m_eduX3       -0.72360297
    p_eduX1       -0.51949828
    p_eduX2       -0.80063642
    p_eduX3       -2.18231433
    f_colorred     0.87618211
    f_coloryellow -1.52699254
    

    giving the coefficients at best alpha and lambda

    when using this model to predict some y are predicted as X1 and some as X2

     [1] X1 X1 X0 X1 X1 X0 X0 X1 X1 X1 X0 X1 X1 X1 X0 X0 X0 X1 X1 X1 X1 X0 X1 X1
    Levels: X0 X1
    

    now with the seed you used

    set.seed(1352)
    model.test <- caret::train(asthma ~ age + gender + bmi_p + m_edu + p_edu + f_color, data = x, method = "glmnet", 
                               family = "binomial", trControl = fitControl, tuneGrid = tuneGrid, 
                               metric = "ROC")
    
    c(head(model.test$finalModel$lambda, 5), tail(model.test$finalModel$lambda, 5))
    #output
     [1] 2.699746e-01 2.459908e-01 2.241377e-01 2.042259e-01 1.860830e-01 3.916870e-05 3.568906e-05 3.251854e-05 2.962968e-05
    [10] 2.699746e-05
    

    lambda values are 10 times smaller and this gives empty coefficients since lambdaOpt is not in the range of tested lambda:

    coef(model.test$finalModel, model.test$finalModel$lambdaOpt)
    #output
    12 x 1 sparse Matrix of class "dgCMatrix"
                  1
    (Intercept)   .
    age           .
    genderX1      .
    bmi_p         .
    m_eduX1       .
    m_eduX2       .
    m_eduX3       .
    p_eduX1       .
    p_eduX2       .
    p_eduX3       .
    f_colorred    .
    f_coloryellow .
    
    model.test$finalModel$lambdaOpt
    #output
    0.5
    

    now when predicting upon this model only X0 is predicted (the first level):

    predict(model.test, x)
    #output
     [1] X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0 X0
    Levels: X0 X1
    

    quite odd behavior, probably worth reporting

    0 讨论(0)
提交回复
热议问题