Почему моя кривая точного отзыва выглядит так неправильно? - PullRequest
0 голосов
/ 06 мая 2020

У меня есть набор данных 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)

enter image description here

Это предполагает , что, возможно, мои результаты перевернуты. Итак, перевернув код (см. Ниже), я получаю 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)

enter image description here

Тогда я подумал, что, поскольку вы не должны получать 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

enter image description here enter image description here

Таким образом, AUPRC = 0,82 имеет хорошее значение, но это не выглядит правильным. Фактически, я ожидал, что AUPR C будет намного хуже, поскольку я не думаю, что данные так хороши. Так почему же ни одна из кривых AUPR C не выглядит правильно?

...