Функция "координаты" пакета "pROC" возвращает другие значения чувствительности и специфичности, чем функция "confusionMatrix" пакета "caret" - PullRequest
0 голосов
/ 19 ноября 2018

Всем привет и заранее большое спасибо за вашу помощь.

Я выполнил случайную модель леса для классификации.Теперь я хочу определить наилучший порог для оптимизации специфичности и чувствительности.

Я в замешательстве, потому что, как указано в заголовке, функция "координаты" пакета "pROC" возвращает значения, отличные от функции "confusionMatrix"пакета «каретка».

Ниже приведен код:

# package import

library(caret)
library(pROC)

# data import

data <- read.csv2("denonciation.csv", check.names = F)

# data partition

validation_index <- createDataPartition(data$Denonc, p=0.80,list=FALSE)
validation <- data[-validation_index,]
entrainement <- data[validation_index,]

# handling class imbalance

set.seed (7)
up_entrainement <- upSample(x=entrainement[,-ncol(entrainement)],y=entrainement$Denonc)

# Cross validation setting

control <- trainControl(method ="cv", number=10, classProbs = TRUE)

# Model training

fit.rf_up <-train(Denonc~EMOTION+Agreabilite_classe+Conscienciosite_classe, data = up_entrainement, method="rf", trControl = control)

# Best threshold determination

roc <- roc(up_entrainement$Denonc, predict(fit.rf_up, up_entrainement, type = "prob")[,2])
    coords(roc, x="best", input = "threshold", best.method = "closest.topleft")

### The best threshold seems to be .36 with a specificity of .79 and a sensitivity of .73 ###

# Confusion matrix with the best threshold returned by "coords"

probsTest <- predict(fit.rf_up, validation, type = "prob")
threshold <- 0.36
predictions <- factor(ifelse(probsTest[, "denoncant"] > threshold, "denoncant", "non_denoncant"))
confusionMatrix(predictions, validation$Denonc)

Здесь значения отличаются:

Confusion Matrix and Statistics

                Reference
Prediction      denoncant non_denoncant
  denoncant           433          1380
  non_denoncant       386          1671

           Accuracy : 0.5437          
             95% CI : (0.5278, 0.5595)
No Information Rate : 0.7884          
P-Value [Acc > NIR] : 1               

              Kappa : 0.0529          
 Mcnemar's Test P-Value : <2e-16          

        Sensitivity : 0.5287          
        Specificity : 0.5477          
     Pos Pred Value : 0.2388          
     Neg Pred Value : 0.8123          
         Prevalence : 0.2116          
     Detection Rate : 0.1119          
   Detection Prevalence : 0.4685          
    Balanced Accuracy : 0.5382          

   'Positive' Class : denoncant    

Пожалуйста, не могли бы вы сказать, почемуФункция "координаты" пакета "pROC" возвращает ложные значения?

Большое спасибо,

Бабуин

1 Ответ

0 голосов
/ 19 ноября 2018

Здесь есть 2 возможные проблемы, которые я вижу:

  1. При обучении модели выборки из 2 классов уравновешиваются путем повышения дискретизации менее многочисленного класса: лучший порог, полученный в результате модели, также калибруется на том же наборе данных с повышенной выборкой. Насколько я вижу, это не относится к набору данных проверки.

  2. Два результата дают метрики модели на разных наборах (обучение и проверка): хотя они должны быть близко друг к другу для модели RandomForest, учитывая все усреднения, которые происходят под капотом, это не означает, что результаты будут точно такими же. Маловероятно, что модель RandomForest будет соответствовать данным, но это возможно, если данные состоят из смеси нескольких различных совокупностей с различным распределением векторов признаков и / или различными отношениями признак-ответ, которые не всегда могут быть равномерно распределены в обучающих и проверочных наборах, даже если вы делаете случайную выборку данных (т.е. распределение может быть одинаковым в среднем, но не для отдельных разделов обучения-проверки).

Я думаю, что первое, что идет не так, но, к сожалению, я не могу проверить ваш код, так как это зависит от файла denonciation.csv.

...