Почему получение разных результатов специфичности в матрице путаницы для одной и той же модели рейнджера на одном и том же поезде данных в каретке R?

#r #machine-learning #classification #r-caret #confusion-matrix

#r #машинное обучение #классификация #r-каретка #путаница-матрица

Вопрос:

Я новичок R и использую каретку для реализации ml . Я пытаюсь решить двоичную classification yes/no проблему с ответом банковского маркетинга от UCI.

Проблема: при обучении модели по train данным модель отображает max Specificity как 0.4974 , но когда я строю график a ConfusionMatrix на тех же train данных, которые я получаю 0.9684 Specificity . Такая большая разница Specificity в model summary amp; confusion matrix выглядит странно и непонятно. (Поскольку это imbalanced данные, учитывающие Specificity yes класс по accuracy сравнению с).

Цените любую помощь или объяснение причины того же

введите описание изображения здесь

Код ниже для справки:

Загрузка данных из UCI

(невозможно загрузить с помощью кода R, но вручную он загружается по ссылке)

 url <- "https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank-additional.zip"

temp <- tempfile()
download.file(url,temp)

data <- read.table(unz(temp, "bank-additional.csv"))
unlink(temp)
  

Поезд / тест

 library(tidyverse)
library(caret)

set.seed(123)

data_split_index <- createDataPartition(data$y, p = 0.7, list = FALSE)


train <- data[data_split_index,]
test <- data[-data_split_index,]


y_train = subset(train, select = y)
X_train = subset(train, select = -y)


# Data imbalance
table(y_train)
table(y_test)
  

Обработка выбросов

 # Outlier capping function
outlier_cap <- function(x, na.rm = TRUE){
  
  upper_cap = quantile(x, 0.99, na.rm = T)
  lower_cap = quantile(x, 0.01, na.rm = T)
  
  x[x > upper_cap] = upper_cap
  x[x < lower_cap] = lower_cap
  
  x <- x
}

# capping outliers
train <- train %>% mutate_if(is.numeric, outlier_cap) 
  

Одно горячее кодирование

 pp_dummy <- dummyVars(y ~ ., data = train)

train <- predict(pp_dummy, newdata = train)
train <- data.frame(train)

test <- predict(pp_dummy, newdata = test)
test <- data.frame(test)

  

Data Pre Processing

 pp_standardize <- preProcess(train, method = c("center","scale"))

train <- predict(pp_standardize, newdata = train)



pp_range <- preProcess(train, method = c("range"))

train <- predict(pp_range, newdata = train)

  

append y to train

 train$y <- Y_train # as.factor(Y)

  

настройка

 fitCtrl <- trainControl(
  method = "cv",
  # repeats = 5,
  number = 10,
  savePredictions = "final",
  classProbs = TRUE,
  summaryFunction = twoClassSummary
) 
  

Model Ranger py

 set.seed(123)

system.time(
  model_ranger_py <-  train(pull(y) ~ cons.conf.idx contact.telephone duration emp.var.rate job.self.employed month.jun month.mar month.may month.nov poutcome.success previous,
                            data = train,
                            metric = "Spec",
                            method = "ranger",
                            trControl = fitCtrl)
)
  

Проблема в результатах ниже двух строк кодов

 model_ranger_py
  
 confusionMatrix(predict(model_ranger_py, newdata = train), pull(train$y))
  

(ОБНОВЛЕНИЕ)

Получение еще более странных результатов между train и test сравнение данных

CM train

 confusionMatrix(predict(model_ranger_py, newdata = train), pull(train$y))

################################ output ################################
Confusion Matrix and Statistics

          Reference
Prediction   no  yes
       no  2562   10
       yes    6  306
                                             
               Accuracy : 0.9945             
                 95% CI : (0.991, 0.9968)    
    No Information Rate : 0.8904             
    P-Value [Acc > NIR] : <0.0000000000000002
                                             
                  Kappa : 0.9714             
                                             
 Mcnemar's Test P-Value : 0.4533             
                                             
            Sensitivity : 0.9977             
            Specificity : 0.9684
  
 plot_pred_type_distribution(df_train)
  

введите описание изображения здесь

Тест CM

 confusionMatrix(predict(model_ranger_py, newdata = test), pull(y_test)) 

################################ output ################################
Confusion Matrix and Statistics

          Reference
Prediction  no yes
       no  166   8
       yes 934 127
                                             
               Accuracy : 0.2372             
                 95% CI : (0.2138, 0.262)    
    No Information Rate : 0.8907             
    P-Value [Acc > NIR] : 1                  
                                             
                  Kappa : 0.0229             
                                             
 Mcnemar's Test P-Value : <0.0000000000000002
                                             
            Sensitivity : 0.1509             
            Specificity : 0.9407 
  
 plot_pred_type_distribution(df_test)
  

введите описание изображения здесь

Комментарии:

1. model_ranger_py выводит метрику на основе повторной выборки (данные, которые модель не видела — ошибка тестирования), в то время predict(model_ranger_py, newdata = train) как генерирует прогнозы на основе данных, на которые модель была подогнана (ошибка поезда)

2. @missuse я не уверен, что именно представляет собой повторную выборку данных, я думаю, вы ссылаетесь на них как на каждый этап перекрестной проверки. Даже в этом случае это выглядит как огромный разрыв в производительности. Затем, когда я validating использую эту модель для тестовых данных, я получаю совершенно противоположные результаты : Sensitivity : 0.1509 , Specificity : 0.9407 . Code: confusionMatrix(predict(model_ranger_py, newdata = test), pull(y_test)) . Я действительно удивлен результатами этой модели. Добавление update к исходному сообщению.

3. @missuse добавляя больше к вышесказанному, я не знаю, почему я получаю вероятности test data в большем discrete количестве значений, а не непрерывных. Я заметил это и в некоторых предыдущих моделях. Я не уверен, но это может быть из-за cross validation . Ссылка на chart полученный из plot_pred_type_distribution(df_test) кода в обновленной части сообщения.