При сравнении кривых ROC моделей машинного обучения для данных с нормальным и пониженным уровнем выборки результирующая чувствительность и специфичность часто сильно отличаются, поскольку модели с пониженным коэффициентом выборки выравнивают классы и придают большее значение захвату второстепенного класса.Почему полученные кривые ROC выглядят так похоже?
Я думаю, что вопрос лучше всего объяснить на простом примере, основанном на этот вопрос здесь .
Сначала возьмите данные сонара и вручную уменьшите выборку класса "R", чтобы разбалансировать данные и проиллюстрировать мой вопрос:
library(caret)
library(ggplot2)
library(mlbench)
library(plotROC)
data(Sonar)
set.seed(2019)
sonar_R <- Sonar %>% filter(Class == "R") %>% sample_n(., 20)
Sonar <- Sonar %>% filter(Class == "M") %>% rbind(sonar_R)
Теперь используйте каретку для моделей случайных лесов с обычными ипонижающая выборка основного класса:
ctrl <- trainControl(method="repeatedcv", number = 5, repeats = 5,
summaryFunction=twoClassSummary, classProbs=T,
savePredictions = T)
ctrl_down <- trainControl(method="repeatedcv", number = 5, repeats = 5,
summaryFunction=twoClassSummary, classProbs=T,
savePredictions = T, sampling = "down")
rfFit <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"),
trControl=ctrl)
rfFit_down <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"),
trControl=ctrl_down)
Теперь я могу определить функцию для получения максимальной ROC и соответствующей чувствительности и специфичности:
max_accuracy <- function(model) {
model_accuracy <- as.data.frame(model$results)
model_accuracy <- model_accuracy %>%
select(ROC, Sens, Spec) %>%
arrange(desc(ROC))
model_accuracy <- model_accuracy[1,]
return(model_accuracy)
}
max_accuracy(rfFit)
max_accuracy(rfFit_down)
Предоставление:
ROC Sens Spec
Normal 0.910 1 0.16
Down Sampled 0.872 0.827 0.77
А также нарисуйте ROC-кривые:
selectedIndices <- rfFit$pred$mtry == 2
g <- ggplot(rfFit$pred[selectedIndices, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) +
geom_roc(n.cuts=0, increasing = FALSE) +
coord_equal() +
style_roc(theme = theme_grey) +
ggtitle("Normal")
g +
annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g))$AUC, 4))) +
scale_x_continuous("1 - Specificity") + scale_y_continuous("Sensitivity")
selectedIndices_down <- rfFit$pred$mtry == 2
g_down <- ggplot(rfFit_down$pred[selectedIndices_down, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) +
geom_roc(n.cuts=0, increasing = FALSE) +
coord_equal() +
style_roc(theme = theme_grey) +
ggtitle("Down Sampled")
g_down +
annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g_down))$AUC, 4))) +
scale_x_continuous("1 - Specificity") + scale_y_continuous("Sensitivity")
Которые выглядят так:
Почемукривые ROC выглядят так похоже?При резко различающихся значениях чувствительности и специфичности кривые также не будут отличаться друг от друга?