Mistakamikaze
Mistakamikaze

Reputation: 442

R | How to get accuracy from cv.glmnet

I've been using the cv.glmnet function to fit a lasso logistic regression model. I'm using R

Here's my code. I'm using the iris dataset.

df = iris %>% 
  mutate(Species = as.character(Species)) %>% 
  filter(!(Species =="setosa")) %>% 
  mutate(Species = as.factor(Species))
  
X = data.matrix(df %>% select(-Species))
y = df$Species

Model = cv.glmnet(X, y, alpha = 1, family = "binomial")

How do I get the model accuracy from the cv.glmnet object (Model).

If I had been using caret on a normal logistic regression model, accuracy is already in the output.

train_control = trainControl(method = "cv", number = 10)
M2 = train(Species ~., data = df, trControl = train_control, 
           method = "glm", family = "binomial")
M2$results

but a cv.glmnet object doesn't seem to contain this information.

Upvotes: 0

Views: 2358

Answers (1)

bmacGTPM
bmacGTPM

Reputation: 612

You want to add type.measure='class' as in Model 2 below, otherwise the default for family='binomial' is 'deviance'.

df = iris %>% 
  mutate(Species = as.character(Species)) %>% 
  filter(!(Species =="setosa")) %>% 
  mutate(Species = as.factor(Species))

X = data.matrix(df %>% select(-Species))
y = df$Species

Model  = cv.glmnet(X, y, alpha = 1, family = "binomial")
Model2 = cv.glmnet(X, y, alpha = 1, family = "binomial", type.measure = 'class')

Then cvm gives the misclassification rate.

Model2$lambda ## lambdas used in CV
Model2$cvm    ## mean cross-validated error for each of those lambdas

If you want results for the best lambda, you can use lambda.min

Model2$lambda.min ## lambda with the lowest cvm
Model2$cvm[Model2$lambda==Model2$lambda.min] ## cvm for lambda.min

Upvotes: 2

Related Questions