Как построить ROC-кривую для логистической регрессии (LASSO) в R? - PullRequest
0 голосов
/ 03 мая 2018

Я подгоняю модель логистической регрессии к набору обучающих данных в R, более конкретно, регрессии LASSO со штрафом L1. Для этого я использовал пакет glmnet. Код для модели выглядит следующим образом.

t1 <- Sys.time()
glmnet_classifier <- cv.glmnet(x = dtm_train_tfidf,
                           y = tweets_train[['sentiment']], 
                           family = 'binomial', 
                           # L1 penalty
                           alpha = 1,
                           # interested in the area under ROC curve
                           type.measure = "auc",
                           # 5-fold cross-validation
                           nfolds = 5,
                           # high value is less accurate, but has faster training
                           thresh = 1e-3,
                           # again lower number of iterations for faster training
                           maxit = 1e3)
print(difftime(Sys.time(), t1, units = 'mins'))

preds <- predict(glmnet_classifier, dtm_test_tfidf, type = 'response')[ ,1]

Теперь я хотел бы построить ROC-кривую. Однако я не могу понять, как точно изобразить это.

Когда я plot(glmnet_classifier) это то, что я получаю: Plot of classifier

Поскольку это не кривая Рока, я хотел бы знать, знает ли кто-нибудь, как построить ее в R? Я уже ссылался на пакет ROCR, но он выдает ошибку:

roc.perf = performance(preds, measure = "tpr", x.measure = "fpr")

Кто-нибудь может помочь? Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Проблема, с которой вы сталкиваетесь с ROCR, заключается в том, что вы используете performance непосредственно для прогноза, а не для стандартного объекта прогноза. Вот пример того, как построить кривую ROC

library(ggplot2) # For diamonds data
library(ROCR) # For ROC curves
library(glmnet) # For regularized GLMs


# Classification problem
class <- diamonds$price > median(diamonds$price) # The top 50% valued diamonds
X <- as.matrix(diamonds[, c('carat', 'depth', 'x', 'y', 'z')]) # Predictor variables

# L1 regularized logistic regression
fit <- cv.glmnet(x = X, y = class, family = 'binomial', type.measure = 'class', alpha = 1)

# Predict from model
preds <- predict(fit, newx = X, type = 'response')

# ROCR for ROC curve
library(ROCR)
# Calculate true positive rate and false positive rate on the prediction object
perf <- performance(prediction(preds, class), 'tpr', 'fpr')

plot(perf)

ROC curve

0 голосов
/ 03 мая 2018
library(pROC)
data("aSAH")

fit <- glm(outcome ~ gender + age + wfns + s100b , data = aSAH, family = binomial)

 roc(aSAH$outcome, as.vector(fitted.values(fit)), percent=F,   boot.n=1000, ci.alpha=0.9, stratified=FALSE, plot=TRUE, grid=TRUE, show.thres=TRUE, legacy.axes = TRUE, reuse.auc = TRUE,
# print.thres = c(0.30,0.35, 0.40, 0.45,0.48, 0.50,0.55, 0.60),#
print.auc = TRUE, print.thres.col = "blue", ci=TRUE, ci.type="bars", print.thres.cex = 0.7, main = paste("ROC curve using","(N = ",nrow(aSAH),")") )

enter image description here

Надеюсь, это поможет;)

...