У меня есть набор данных df с большим дисбалансом классов (подтверждающий = 102, негативный = 293). Я попытался сделать кривую точного отзыва на этих данных, но она выглядит слишком хорошо.
Подводя итог ниже: Код для моей модели RF и изображения моих кривых PR. Что-нибудь выскакивает на кривых?
Сначала я попытался создать кривую точного отзыва на обучающем наборе. Поскольку мой набор данных крошечный, я не хотел создавать набор для проверки. Я знаю, что идеально видеть кривую PR на тестовых данных, но я читал несколько статей, в которых приводятся кривые PR на их тренировочных данных, поэтому я подумал, что это будет нормально. Кроме того, я хочу сообщить свои показатели производительности как по данным обучения, так и по данным тестирования, поэтому мне нужен AUCPR для обучающего набора.
#create trainControl
data_ctrl_null <- trainControl(method="cv", number = 10, classProbs = TRUE, summaryFunction=twoClassSummary, savePredictions=T, sampling=NULL)
#run model with predetermined parameters
rf_model <- train(outcome ~ ., data=df, ntree = 2000, tuneGrid = data.frame(mtry = 69), trControl = data_ctrl_null, method= "rf", preProc=c("center","scale"), metric="ROC",importance=TRUE)
#see performance matrix
confusionMatrix(rf_model$finalModel$predicted, df$outcome, positive = "affirmatory")
Confusion Matrix and Statistics
Reference
Prediction affirmatory negatory
affirmatory 57 20
negatory 45 273
Accuracy : 0.8354
95% CI : (0.7951, 0.8706)
No Information Rate : 0.7418
P-Value [Acc > NIR] : 5.728e-06
Kappa : 0.5332
Mcnemar's Test P-Value : 0.002912
Sensitivity : 0.5588
Specificity : 0.9317
Pos Pred Value : 0.7403
Neg Pred Value : 0.8585
Prevalence : 0.2582
Detection Rate : 0.1443
Detection Prevalence : 0.1949
Balanced Accuracy : 0.7453
'Positive' Class : affirmatory
И затем я создал кривую PR, используя приведенный ниже код с AUPRC = 0,14. Кривая PR выглядит так, как будто идет не так. Также эта статья предполагает, что AUPR C в идеале находится между 0,5-1, и мое значение не попадает в это окно.
# predict using train data
predictions <- predict(object = rf_model, newdata = df)
#create precision recall curve
fg <- predictions[df$outcome == 'affirmatory']
bg <- predictions[df$outcome == 'negatory']
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(pr)
Это предполагает , что, возможно, мои результаты перевернуты. Итак, перевернув код (см. Ниже), я получаю AUPRC = 1.0, что предполагает идеальный классификатор:
# predict using train data
predictions <- predict.train(rf_model) #no change
#switch bg and fg
bg <- predictions[df$outcome == 'affirmatory']
fg <- predictions[df$outcome == 'negatory']
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(pr)
Тогда я подумал, что, поскольку вы не должны получать AUPR C по данным обучения, что, если бы я сделал прогноз для кривой PR, используя набор для проверки, и повторил все, как указано выше:
#Create a train and validation set
smp_size <- floor(0.75 * nrow(df))
set.seed(123)
train_ind <- sample(seq_len(nrow(df)), size = smp_size)
train <- df[train_ind, ]
val <- df[-train_ind, ]
#new performance metrics
confusionMatrix(rf_train$finalModel$predicted, train$outcome, positive = "affirmatory")
Confusion Matrix and Statistics
Reference
Prediction affirmatory negatory
affirmatory 50 19
negatory 31 196
Accuracy : 0.8311
95% CI : (0.7834, 0.8719)
No Information Rate : 0.7264
P-Value [Acc > NIR] : 1.58e-05
Kappa : 0.5545
Mcnemar's Test P-Value : 0.1198
Sensitivity : 0.6173
Specificity : 0.9116
Pos Pred Value : 0.7246
Neg Pred Value : 0.8634
Prevalence : 0.2736
Detection Rate : 0.1689
Detection Prevalence : 0.2331
Balanced Accuracy : 0.7645
'Positive' Class : affirmatory
#PR on validation set
predictions <- predict(object = rf_train, newdata = val)
#try both combos
fg <- predictions[val$outcome == 'affirmatory']
bg <- predictions[val$outcome == 'negatory']
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(pr)
#AUPRC=0.8234582
bg <- predictions[val$outcome == 'affirmatory']
fg <- predictions[val$outcome == 'negatory']
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(pr)
#AUPRC=0.1802666
Таким образом, AUPRC = 0,82 имеет хорошее значение, но это не выглядит правильным. Фактически, я ожидал, что AUPR C будет намного хуже, поскольку я не думаю, что данные так хороши. Так почему же ни одна из кривых AUPR C не выглядит правильно?