#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)
кода в обновленной части сообщения.