R и Random Forest: как caret и pROC работают с положительным и отрицательным классом?

В последние дни я анализировал производительность реализации Random Forest в R и различных доступных инструментов, чтобы получить:

  • AUC
  • Чувствительность
  • Специфичность

Таким образом, я использовал два разных метода:

  • mroc и coords из библиотеки pROC, чтобы получить производительность модели в различных точках отсечения.
  • confusionMatrix из библиотеки caret, чтобы получить оптимальную производительность модели (AUC, точность, чувствительность, специфичность, ...)

Дело в том, что я понял, что есть некоторые различия между обоими подходами.

Я разработал следующий код:

suppressMessages(library(randomForest))
suppressMessages(library(pROC))
suppressMessages(library(caret))

set.seed(100)

t_x <- as.data.frame(matrix(runif(100),ncol=10))
t_y <- factor(sample(c("A","B"), 10, replace = T), levels=c("A","B"))

v_x  <- as.data.frame(matrix(runif(50),ncol=10))
v_y <- factor(sample(c("A","B"), 5, replace = T), levels=c("A","B"))

model <- randomForest(t_x, t_y, ntree=1000, importance=T);
prob.out <- predict(model, v_x, type="prob")[,1];
prediction.out <- predict(model, v_x, type="response");

mroc <- roc(v_y,prob.out,plot=F)

results <- coords(mroc,seq(0, 1, by = 0.01),input=c("threshold"),ret=c("sensitivity","specificity","ppv","npv"))

accuracyData <- confusionMatrix(prediction.out,v_y)

Если вы сравните переменные results и precisionData, вы увидите, что зависимость между чувствительностью и специфичностью обратная.

То есть результаты confusionMatrix:

Confusion Matrix and Statistics

          Reference
Prediction A B
         A 1 1
         B 2 1

               Accuracy : 0.4             
                 95% CI : (0.0527, 0.8534)
    No Information Rate : 0.6             
    P-Value [Acc > NIR] : 0.913           

                  Kappa : -0.1538         
 Mcnemar's Test P-Value : 1.000           

            Sensitivity : 0.3333          
            Specificity : 0.5000          
         Pos Pred Value : 0.5000          
         Neg Pred Value : 0.3333          
             Prevalence : 0.6000          
         Detection Rate : 0.2000          
   Detection Prevalence : 0.4000          
      Balanced Accuracy : 0.4167          

       'Positive' Class : A 

Но если я ищу такие Чувствительность и Специфичность в вычислении координат, я обнаруживаю, что они поменялись местами:

     sensitivity specificity       ppv       npv
0.32         0.5   0.3333333 0.3333333 0.5000000

По-видимому, Sensitivity и Specificity противоположны в coords и confusionMatrix.

Принимая во внимание, что confusionMatrix правильно определяет положительный класс, я предполагаю, что это хорошая интерпретация чувствительности и специфичности.

Мой вопрос: Есть ли способ заставить координаты интерпретировать положительные и отрицательные классы так, как я хочу?


person asuka    schedule 04.10.2016    source источник


Ответы (2)


Если вы посмотрите на вывод confusionMatrix, вы увидите следующее:

       'Positive' Class : A 

Теперь, глядя на mroc, класс B принимается как положительный класс:

Data: prob.out in 3 controls (v_y A) < 2 cases (v_y B).

По сути, pROC принимает уровни вашего фактора как отрицательный, положительный, а caret делает прямо противоположное. Вы можете явно указать свои уровни с помощью pROC, чтобы получить такое же поведение:

mroc <- roc(v_y,prob.out,plot=F, levels = c("B", "A"))

Или, в зависимости от вашего предпочтительного поведения, с positive аргументом confusionMatrix:

accuracyData <- confusionMatrix(prediction.out,v_y, positive = "B")
person Calimo    schedule 04.10.2016

Попробуйте это, и вы получите одинаковые результаты, используя оба метода (все дело в положительных и отрицательных уровнях фактора класса):

accuracyData <- confusionMatrix(prediction.out,v_y, positive='A')
accuracyData



Confusion Matrix and Statistics

             Reference
    Prediction A B
             A 1 0
             B 2 2                         

             Accuracy : 0.6             
                 95% CI : (0.1466, 0.9473)
    No Information Rate : 0.6             
    P-Value [Acc > NIR] : 0.6826          

                  Kappa : 0.2857          
 Mcnemar's Test P-Value : 0.4795          

            Sensitivity : 0.3333          
            Specificity : 1.0000          
         Pos Pred Value : 1.0000          
         Neg Pred Value : 0.5000          
             Prevalence : 0.6000          
         Detection Rate : 0.2000          
   Detection Prevalence : 0.2000          
      Balanced Accuracy : 0.6667          

       'Positive' Class : A   


mroc <- roc(v_y,prob.out,plot=F, levels=c("B", "A"))
results <- coords(mroc, 0.49, "threshold", ret=c("specificity", "sensitivity", "accuracy",
                                      "tn", "tp", "fn", "fp", "npv", "ppv", "1-specificity",
                                      "1-sensitivity", "1-accuracy", "1-npv", "1-ppv"))
results 

specificity   sensitivity      accuracy            tn            tp            fn            fp           npv           ppv 1-specificity 
    1.0000000     0.3333333     0.6000000     2.0000000     1.0000000     2.0000000     0.0000000     0.5000000     1.0000000     0.0000000 
1-sensitivity    1-accuracy         1-npv         1-ppv 
    0.6666667     0.4000000     0.5000000     0.0000000 
person Sandipan Dey    schedule 04.10.2016