ME844AME: MINERIA DE DATOS
Contexto
En Mibanco existe una preocupación por evaluar el nivel de riesgo del portafolio de clientes, motivo por el cual se le solicita diseñar un modelo que permita predecir el riesgo de los clientes y así poder direccionar las políticas del proceso crediticio, siendo más estricto en aquello clientes con un mayor riesgo y más flexible con los clientes de mejor riesgo.
Después de revisar la solicitud con los equipos de Políticas se determinó su interés por observar el comportamiento de pagos de los clientes en un periodo de 12 meses posteriores al mes de observación, si durante este periodo, el atraso máximo a nivel clientes supera el umbral de 60 días, diremos que el cliente ha hecho default. Adicionalmente, el equipo de Políticas indicó la relevancia del atraso en los clientes Mibanco y sus diferencias en su comportamiento (entre clientes con atrasos y sin atrasos en su historia).
Desafío
Desarrollar un modelo de acuerdo con las necesidades del equipo de Políticas, para ello se cuenta con una base del stock cliente entre los periodos 201701-201803 (50,206 registros) y un total de 44 variables entre información interna y externa (RCC).
Describir los pasos y/o etapas realizados durante el modelamiento hasta obtener modelo final (del caso de negocio), comentado los principales hallazgos.
Sustentar la selección del modelo final, utilizando indicadores que considere relevante.
Integración a la gestión, en base al modelo construido recomendar los clientes a los cuales se les podría flexibilizar las políticas.
Descripcion
ID: Identificador del cliente
FLG_CLI_DEF60: Default
INC_SUM_ACTSH_ACTU_24M: INCREMENTO DE DEUDA ACTIVA
MAX_ATR_I_12M: MAX_ATR||Máximo atrasos en los últimos 12 meses
MAX_ENT_12M: MÁXIMA CANTIDAD DE ENTIDADES ACREEDORAS||Nro. máximo de entidades acreedoras en los últimos 12 meses
NMES_ATR15_I_U6K_24M: N_MESES_ATR||Número de meses con atrasos mayores iguales a 15 en los últimos 6 meses de comportamiento en los últimos 24 meses
NMES_UATR3_I_24M: N_MESES_UATR||Número de meses desde el último atraso mayor o igual a 3 días de atraso observado en los 24 últimos meses (distancia)
N_NOR_24M: NRO. DE MESES CON CALIFICACIÓN “NORMAL”||Nro. de meses que el cliente fue calificado como ‘NORMAL’. En los últimos 24 meses
RTOT_DACT_DTOT_24M: Ratio del total de la deuda activa sobre el total de la deuta total en los últimos 24 meses VAR_PROM_DEUDIR_ACTU_12M: VARIACIÓN DE DEUDA DIRECTA (CONSIDERANDO PROMEDIO)||Deuda directa promedio en los últimos 12 meses respecto a la deuda directa actual VAR_PROM_ENT_ACTU_24M: VARIACIÓN DE ENTIDADES ACREEDORAS (CONSIDERANDO PROMEDIO)||Promedio de nro. de entidades en los últimos 18 meses respecto al nro. de entidades actual
EDA(Analisis Exploratorio de datos)
# Librerias necesarias
library(tidyverse)
library(readxl)
library(skimr)
library(tidymodels)
library(caret)
library(haven)
library(tidyverse)
library(Fahrmeir)
library(ggplot2)
library(ggpubr)
library(discretization)
library(randomForest)
library(recipes)
library(C50)
library(doParallel)
library(ranger)
library(e1071)
library(gbm)
library(party)
library(partykit)Eliminar las columnas con un “Complete de 100%”
Eliminar Periodo y ID
# Base de datos con variables principales
Data <- read.csv('base10.csv')
Data <- Data %>%
mutate(FLG_CLI_DEF60 = as.factor(FLG_CLI_DEF60))
Data %>% glimpse()## Rows: 50,591
## Columns: 11
## $ MAX_ATR_I_12M <int> 2, 9, 0, 2, 9, 6, 4, 0, 2, 4, 2, 1, 8, 7, 12,…
## $ NMES_ATR15_I_U6K_24M <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ RTOT_DACT_DTOT_24M <dbl> 0.9862304, 0.7068346, 0.2484270, 0.8480767, 1…
## $ VAR_PROM_ENT_ACTU_24M <dbl> 0.00000000, 0.00000000, 0.00000000, 0.0104166…
## $ NMES_UATR3_I_24M <int> 0, 6, 0, 0, 1, 5, 0, 14, 23, 2, 0, 0, 0, 1, 0…
## $ VAR_PROM_DEUDIR_ACTU_12M <dbl> -0.54984899, 0.94141490, 0.57636331, -0.16470…
## $ INC_SUM_ACTSH_ACTU_24M <dbl> 8.073189, 46.718352, 11.610906, 20.127711, 33…
## $ MAX_ENT_12M <int> 1, 1, 1, 5, 3, 1, 4, 1, 2, 1, 1, 3, 5, 3, 1, …
## $ N_NOR_24M <int> 20, 19, 8, 24, 24, 24, 24, 20, 23, 24, 24, 24…
## $ NMES_UATR15_I_U6K_24M <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ FLG_CLI_DEF60 <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## Rows: 50,591
## Columns: 11
## $ MAX_ATR_I_12M <int> 2, 9, 0, 2, 9, 6, 4, 0, 2, 4, 2, 1, 8, 7, 12,…
## $ NMES_ATR15_I_U6K_24M <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ RTOT_DACT_DTOT_24M <dbl> 0.9862304, 0.7068346, 0.2484270, 0.8480767, 1…
## $ VAR_PROM_ENT_ACTU_24M <dbl> 0.00000000, 0.00000000, 0.00000000, 0.0104166…
## $ NMES_UATR3_I_24M <int> 0, 6, 0, 0, 1, 5, 0, 14, 23, 2, 0, 0, 0, 1, 0…
## $ VAR_PROM_DEUDIR_ACTU_12M <dbl> -0.54984899, 0.94141490, 0.57636331, -0.16470…
## $ INC_SUM_ACTSH_ACTU_24M <dbl> 8.073189, 46.718352, 11.610906, 20.127711, 33…
## $ MAX_ENT_12M <int> 1, 1, 1, 5, 3, 1, 4, 1, 2, 1, 1, 3, 5, 3, 1, …
## $ N_NOR_24M <int> 20, 19, 8, 24, 24, 24, 24, 20, 23, 24, 24, 24…
## $ NMES_UATR15_I_U6K_24M <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ FLG_CLI_DEF60 <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
Escenario Imbalanceado
Data %>%
ggplot(aes(FLG_CLI_DEF60, fill = FLG_CLI_DEF60, color=FLG_CLI_DEF60))+
geom_bar(alpha = 0.5)+
scale_y_continuous(labels = comma)+
theme(legend.position="none")+
xlab("Target: FLG_CLI_DEF60")+
ylab("Number of accounts")+
geom_text(stat = "count", aes(label=..count..), vjust=-0.2) 
En este escenario, la variable objetivo se refiere a si un préstamo resulta en incumplimiento(default). Es decir si un prestatario incumple con el pago de un préstamo es igual a 1 y 0 en caso contraio
Se observa un escenario desbalanceado que se refiere a una situación en la que la proporción de préstamos que no incurren en incumplimiento (etiqueta 0) es significativamente mayor que la proporción de préstamos que sí incurren en incumplimiento (etiqueta 1). Esta asimetría en la distribución de las clases puede tener importantes implicaciones al desarrollar modelos predictivos y al evaluar su rendimiento.
Creando una muestra aleatoria del 15% de los datos ,esto por la gran cantidad de observaciones que existe, y acelerar el proceso de entrenamiento.
# Crear una muestra aleatoria del 15% de los datos ,esto por la gran cantidad de observaciones que existe, y acelerar el proceso de entrenamiento.
library(dplyr)
porcentaje_muestra <- 0.15
muestra <- Data %>%
sample_frac(porcentaje_muestra)
dim(muestra)## [1] 7589 11
## MAX_ATR_I_12M NMES_ATR15_I_U6K_24M RTOT_DACT_DTOT_24M
## Min. : 0.000 Min. :0.0000 Min. :0.02309
## 1st Qu.: 1.000 1st Qu.:0.0000 1st Qu.:0.77099
## Median : 3.000 Median :0.0000 Median :0.96077
## Mean : 6.919 Mean :0.2684 Mean :0.86346
## 3rd Qu.: 8.000 3rd Qu.:0.0000 3rd Qu.:1.00000
## Max. :945.000 Max. :6.0000 Max. :1.00000
## VAR_PROM_ENT_ACTU_24M NMES_UATR3_I_24M VAR_PROM_DEUDIR_ACTU_12M
## Min. :-0.7083 Min. : 0.000 Min. :-0.847073
## 1st Qu.:-0.2222 1st Qu.: 0.000 1st Qu.:-0.265873
## Median : 0.0000 Median : 0.000 Median :-0.007673
## Mean :-0.0426 Mean : 2.456 Mean : 0.153150
## 3rd Qu.: 0.0000 3rd Qu.: 3.000 3rd Qu.: 0.305893
## Max. : 2.6667 Max. :23.000 Max. :21.983818
## INC_SUM_ACTSH_ACTU_24M MAX_ENT_12M N_NOR_24M NMES_UATR15_I_U6K_24M
## Min. :0.000e+00 Min. :1.000 Min. : 1.00 Min. :0.00000
## 1st Qu.:1.000e+01 1st Qu.:1.000 1st Qu.:16.00 1st Qu.:0.00000
## Median :1.600e+01 Median :2.000 Median :22.00 Median :0.00000
## Mean :9.370e+06 Mean :2.062 Mean :19.51 Mean :0.08921
## 3rd Qu.:2.500e+01 3rd Qu.:3.000 3rd Qu.:24.00 3rd Qu.:0.00000
## Max. :5.556e+09 Max. :7.000 Max. :24.00 Max. :9.00000
## FLG_CLI_DEF60
## 0:6772
## 1: 817
##
##
##
##
Division de los datos en Entrenamiento y Test
#################################################
# Divisi?n de los datos en entrenamiento y test #
#################################################
set.seed(123)
# Se crean los ?ndices de las observaciones de entrenamiento
train <- createDataPartition(y = Data$FLG_CLI_DEF60, p = 0.75, list = FALSE, times = 1)
datos_train <- Data[train, ]# 75%
datos_test <- Data[-train, ]# 25%Para el escenario imbalanceado,se implementa el método de submuestreo (undersampling) para balancear los datos de la clase mayoritaria y la clase minoritaria. El submuestreo implica reducir el número de muestras en la clase mayoritaria para que se equilibre con la clase minoritaria.
# Para el escenario imbalanceado
library(dplyr)
# División de los datos de entrenamiento en clases
datos_train_class_0 <- datos_train %>% filter(FLG_CLI_DEF60 == 0)
datos_train_class_1 <- datos_train %>% filter(FLG_CLI_DEF60 == 1)
# Submuestreo de la clase mayoritaria
sample_size <- nrow(datos_train_class_1)
datos_train_class_0_sub <- sample_n(datos_train_class_0, size = sample_size)
# Combinar las clases balanceadas
datos_train <- rbind(datos_train_class_0_sub, datos_train_class_1)
# Verificar la distribución de la variable respuesta en los datos balanceados
prop.table(table(datos_train$FLG_CLI_DEF60))##
## 0 1
## 0.5 0.5
##
## 0 1
## 0.8923442 0.1076558
##
## 0 1
## 0.5 0.5
##
## 0 1
## 0.8924618 0.1075382
Preprocesamiento
#################################################
# Preprocesamiento #
#################################################
objeto_recipe <- recipe(formula = FLG_CLI_DEF60 ~ .,
data = datos_train)
objeto_recipe
# Transformacion de variables cuantitativas: normalizacion
objeto_recipe <- objeto_recipe %>% step_center(all_numeric())
objeto_recipe <- objeto_recipe %>% step_scale(all_numeric())
# Binarizaci?n de variables cualitativas
objeto_recipe <- objeto_recipe %>% step_dummy(all_nominal(), -all_outcomes())
# Se entrena el objeto recipe
trained_recipe <- prep(objeto_recipe, training = datos_train)
trained_recipe
# Se aplican las transformaciones al conjunto de entrenamiento y de test
datos_train_prep <- bake(trained_recipe, new_data = datos_train)
datos_test_prep <- bake(trained_recipe, new_data = datos_test)
glimpse(datos_train_prep)## Rows: 1,226
## Columns: 11
## $ MAX_ATR_I_12M <dbl> -0.37625518, -0.50930648, -0.77540908, 0.0894…
## $ NMES_ATR15_I_U6K_24M <dbl> -0.5118996, -0.5118996, -0.5118996, -0.511899…
## $ RTOT_DACT_DTOT_24M <dbl> 0.67028410, 0.67028410, 0.13088835, 0.3570290…
## $ VAR_PROM_ENT_ACTU_24M <dbl> 0.22281570, -1.03269779, -1.35273064, -0.6634…
## $ NMES_UATR3_I_24M <dbl> -0.4318546, -0.4318546, -0.4318546, -0.157241…
## $ VAR_PROM_DEUDIR_ACTU_12M <dbl> -0.37956435, 0.17843126, -0.54765259, 0.32777…
## $ INC_SUM_ACTSH_ACTU_24M <dbl> -0.23247162, -0.03736952, -0.42603874, 0.3914…
## $ MAX_ENT_12M <dbl> -1.0194035, -0.1508916, -0.1508916, 1.5861323…
## $ N_NOR_24M <dbl> -0.11220608, 0.21887613, -1.60207602, 0.71549…
## $ NMES_UATR15_I_U6K_24M <dbl> -0.194267, -0.194267, -0.194267, -0.194267, -…
## $ FLG_CLI_DEF60 <fct> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
Construcción de Modelos
#################################################
# Construcción de Modelos #
#################################################
# Ver: http://topepo.github.io/caret/available-models.html
# PARALELIZACI?N DE PROCESO
#===============================================================================
cl <- makeCluster(detectCores() - 1) # convention to leave 1 core for OS
registerDoParallel(cl)
# Metrica
#===============================================================================
# Puede ser "Accuracy", "logLoss", "ROC", "Kappa"
metrica <- "Accuracy"
# HIPERPAR?METROS, N?MERO DE REPETICIONES Y SEMILLAS PARA CADA REPETICI?N
#===============================================================================
particiones <- 10 # k fold
repeticiones <- 5 # nro repeticiones repeat k fold cvK-Vecinos mas Cercanos (KNN)
Hiperparametros
#################################################
# K-Vecinos mas Cercanos (KNN) #
#################################################
# Hiperparametros
hiperparametros <- data.frame(k = seq(from = 1,to = 71,by = 2))
set.seed(666)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# AJUSTE DEL MODELO
# ==============================================================================
set.seed(342)
modelo_knn <- train(FLG_CLI_DEF60 ~ ., data = datos_train_prep,
method = "knn",
tuneGrid = hiperparametros,
metric = metrica,
trControl = control_train)
modelo_knn## k-Nearest Neighbors
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results across tuning parameters:
##
## k Accuracy Kappa
## 1 0.6638707 0.3277036
## 3 0.6918093 0.3835835
## 5 0.7054894 0.4109797
## 7 0.7172606 0.4345416
## 9 0.7210113 0.4420358
## 11 0.7156241 0.4312676
## 13 0.7166223 0.4332489
## 15 0.7153001 0.4306382
## 17 0.7156373 0.4313016
## 19 0.7144951 0.4290353
## 21 0.7190507 0.4381350
## 23 0.7224695 0.4449837
## 25 0.7280088 0.4560632
## 27 0.7262214 0.4524821
## 29 0.7283260 0.4566931
## 31 0.7263827 0.4528153
## 33 0.7245781 0.4492066
## 35 0.7219856 0.4440225
## 37 0.7206662 0.4413927
## 39 0.7180579 0.4361764
## 41 0.7165838 0.4332386
## 43 0.7149643 0.4299908
## 45 0.7144738 0.4290242
## 47 0.7140019 0.4280773
## 49 0.7138274 0.4277185
## 51 0.7121973 0.4244678
## 53 0.7143219 0.4287172
## 55 0.7161132 0.4323029
## 57 0.7174141 0.4349036
## 59 0.7175860 0.4352367
## 61 0.7170797 0.4342334
## 63 0.7173956 0.4348535
## 65 0.7183792 0.4368323
## 67 0.7164173 0.4329077
## 69 0.7151138 0.4302966
## 71 0.7146260 0.4293067
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was k = 29.
library(ggplot2)
ggplot(modelo_knn , highlight = TRUE) +
scale_x_continuous(breaks = hiperparametros$k) +
labs(title = "Evolucion del accuracy del modelo KNN", x = "K") +
theme_bw()
Un valor de Accuracy (Precisión) igual a 0.7283260 significa que aproximadamente el 72.83% de las predicciones realizadas por el modelo KNN fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
Naive Bayes
HIPERPARAMETROS
#################################################
# Naive Bayes #
#################################################
# HIPERPAR?METROS, N?MERO DE REPETICIONES Y SEMILLAS PARA CADA REPETICION
#===============================================================================
# Hiperpar?metros
#hiperparametros <- data.frame(usekernel = FALSE, fL = 0 , adjust = 0)
hiperparametros <- data.frame(usekernel = FALSE, laplace = 0 , adjust = 0)
set.seed(666)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# AJUSTE DEL MODELO
# ==============================================================================
set.seed(342)
modelo_nb <- train(FLG_CLI_DEF60 ~ ., data = datos_train_prep,
method = "naive_bayes",
tuneGrid = hiperparametros,
metric = metrica,
trControl = control_train)
modelo_nb## Naive Bayes
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results:
##
## Accuracy Kappa
## 0.6795565 0.3591337
##
## Tuning parameter 'laplace' was held constant at a value of 0
## Tuning
## parameter 'usekernel' was held constant at a value of FALSE
## Tuning
## parameter 'adjust' was held constant at a value of 0
Un valor de Accuracy (Precisión) igual a 0.6795565 significa que aproximadamente el 67.95% de las predicciones realizadas por el modelo Naive Bayes fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
Arbol de Clasificacion: C5.0
Hiperparametros
#################################################
# Arbol de Clasificaci?n: C5.0 #
# Ver Quinlan (1993) y Kuhn and Johnson (2013) #
#################################################
# HIPERPAR?METROS, N?MERO DE REPETICIONES Y SEMILLAS PARA CADA REPETICI?N
#===============================================================================
# Hiperpar?metros
hiperparametros <- data.frame(parameter = "none")
set.seed(666)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# AJUSTE DEL MODELO
# ==============================================================================
set.seed(342)
modelo_C50Tree <- train(FLG_CLI_DEF60 ~ ., data = datos_train_prep,
method = "C5.0Tree",
tuneGrid = hiperparametros,
metric = metrica,
trControl = control_train)
modelo_C50Tree## Single C5.0 Tree
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results:
##
## Accuracy Kappa
## 0.7182216 0.436471
##
## Call:
## C50:::C5.0.default(x = x, y = y, weights = wts)
##
##
## C5.0 [Release 2.07 GPL Edition] Fri Aug 11 23:25:38 2023
## -------------------------------
##
## Class specified by attribute `outcome'
##
## Read 1226 cases (11 attributes) from undefined.data
##
## Decision tree:
##
## NMES_ATR15_I_U6K_24M > -0.5118997:
## :...NMES_UATR15_I_U6K_24M <= 1.519196: 1 (305/34)
## : NMES_UATR15_I_U6K_24M > 1.519196:
## : :...VAR_PROM_DEUDIR_ACTU_12M > 0.1590318: 0 (14/3)
## : VAR_PROM_DEUDIR_ACTU_12M <= 0.1590318:
## : :...NMES_UATR15_I_U6K_24M <= 6.659585: 1 (19/2)
## : NMES_UATR15_I_U6K_24M > 6.659585: 0 (2)
## NMES_ATR15_I_U6K_24M <= -0.5118997:
## :...MAX_ATR_I_12M <= -0.6423578:
## :...MAX_ENT_12M <= -1.019403: 0 (188/30)
## : MAX_ENT_12M > -1.019403:
## : :...MAX_ENT_12M > 0.7176204:
## : :...N_NOR_24M <= -0.1122061: 1 (8/1)
## : : N_NOR_24M > -0.1122061:
## : : :...VAR_PROM_DEUDIR_ACTU_12M > -0.07669736: 0 (7)
## : : VAR_PROM_DEUDIR_ACTU_12M <= -0.07669736:
## : : :...RTOT_DACT_DTOT_24M <= -0.5521551: 0 (6)
## : : RTOT_DACT_DTOT_24M > -0.5521551:
## : : :...MAX_ATR_I_12M <= -0.8419347: 0 (6/2)
## : : MAX_ATR_I_12M > -0.8419347: 1 (12/2)
## : MAX_ENT_12M <= 0.7176204:
## : :...MAX_ATR_I_12M > -0.7754091:
## : :...RTOT_DACT_DTOT_24M <= -0.443878: 0 (23)
## : : RTOT_DACT_DTOT_24M > -0.443878:
## : : :...RTOT_DACT_DTOT_24M <= -0.2257341: 1 (4)
## : : RTOT_DACT_DTOT_24M > -0.2257341: 0 (57/15)
## : MAX_ATR_I_12M <= -0.7754091:
## : :...MAX_ATR_I_12M > -0.8419347: 0 (56/22)
## : MAX_ATR_I_12M <= -0.8419347:
## : :...N_NOR_24M > -0.1122061: 0 (51/6)
## : N_NOR_24M <= -0.1122061:
## : :...RTOT_DACT_DTOT_24M <= -0.5088441: 1 (5)
## : RTOT_DACT_DTOT_24M > -0.5088441:
## : :...VAR_PROM_DEUDIR_ACTU_12M <= -0.6692505: 1 (2)
## : VAR_PROM_DEUDIR_ACTU_12M > -0.6692505: 0 (6/1)
## MAX_ATR_I_12M > -0.6423578:
## :...NMES_UATR3_I_24M <= -0.4318546:
## :...INC_SUM_ACTSH_ACTU_24M <= -0.2764528: 1 (76/16)
## : INC_SUM_ACTSH_ACTU_24M > -0.2764528:
## : :...VAR_PROM_DEUDIR_ACTU_12M > 0.6950641: 0 (12/1)
## : VAR_PROM_DEUDIR_ACTU_12M <= 0.6950641:
## : :...MAX_ATR_I_12M <= -0.1101526: 1 (103/41)
## : MAX_ATR_I_12M > -0.1101526: 0 (32/12)
## NMES_UATR3_I_24M > -0.4318546:
## :...N_NOR_24M <= -1.767617: 1 (17/5)
## N_NOR_24M > -1.767617:
## :...MAX_ENT_12M <= -0.1508916: 0 (138/38)
## MAX_ENT_12M > -0.1508916:
## :...MAX_ENT_12M <= 0.7176204:
## :...N_NOR_24M <= 0.2188761: 1 (15/2)
## : N_NOR_24M > 0.2188761: 0 (27/9)
## MAX_ENT_12M > 0.7176204:
## :...N_NOR_24M <= 0.3844172: 0 (9)
## N_NOR_24M > 0.3844172:
## :...N_NOR_24M > 0.7154995: 0 (15/5)
## N_NOR_24M <= 0.7154995:
## :...MAX_ENT_12M > 1.586132: 1 (3)
## MAX_ENT_12M <= 1.586132:
## :...NMES_UATR3_I_24M <= -0.1572417: 0 (4)
## NMES_UATR3_I_24M > -0.1572417: 1 (4/1)
##
##
## Evaluation on training data (1226 cases):
##
## Decision Tree
## ----------------
## Size Errors
##
## 31 248(20.2%) <<
##
##
## (a) (b) <-classified as
## ---- ----
## 509 104 (a): class 0
## 144 469 (b): class 1
##
##
## Attribute usage:
##
## 100.00% NMES_ATR15_I_U6K_24M
## 72.27% MAX_ATR_I_12M
## 52.69% MAX_ENT_12M
## 37.11% NMES_UATR3_I_24M
## 27.73% NMES_UATR15_I_U6K_24M
## 27.32% N_NOR_24M
## 18.19% INC_SUM_ACTSH_ACTU_24M
## 18.03% VAR_PROM_DEUDIR_ACTU_12M
## 9.87% RTOT_DACT_DTOT_24M
##
##
## Time: 0.0 secs
El valor de Accuracy (Precisión) igual a 0.7182216 significa que aproximadamente el 71.82% de las predicciones realizadas por el modelo Arbol de Clasificacion: C5.0 fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
Árbol de Clasificación: RPART (cart)
Hiperparametros
#################################################
# ?rbol de Clasificaci?n: RPART cart #
#################################################
# HIPERPAR?METROS, N?MERO DE REPETICIONES Y SEMILLAS PARA CADA REPETICI?N
#===============================================================================
# Hiperpar?metros
hiperparametros <- data.frame(cp = seq(0.001,0.07,by = 0.0005))
set.seed(666)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# AJUSTE DEL MODELO
# ==============================================================================
set.seed(342)
modelo_rpart <- train(FLG_CLI_DEF60 ~ ., data = datos_train_prep,
method = "rpart",
tuneGrid = hiperparametros,
metric = metrica,
trControl = control_train)
modelo_rpart## CART
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.0010 0.6949266 0.3899288
## 0.0015 0.6986811 0.3974526
## 0.0020 0.7102539 0.4205843
## 0.0025 0.7117226 0.4235176
## 0.0030 0.7128569 0.4257579
## 0.0035 0.7156425 0.4313176
## 0.0040 0.7172752 0.4345711
## 0.0045 0.7174364 0.4348967
## 0.0050 0.7172725 0.4345557
## 0.0055 0.7167834 0.4335965
## 0.0060 0.7174312 0.4348922
## 0.0065 0.7162876 0.4326125
## 0.0070 0.7174312 0.4348947
## 0.0075 0.7169288 0.4338886
## 0.0080 0.7166009 0.4332329
## 0.0085 0.7170953 0.4342080
## 0.0090 0.7170953 0.4342080
## 0.0095 0.7159504 0.4319197
## 0.0100 0.7154519 0.4309462
## 0.0105 0.7156145 0.4312782
## 0.0110 0.7149721 0.4300345
## 0.0115 0.7149721 0.4300345
## 0.0120 0.7157917 0.4316655
## 0.0125 0.7157917 0.4316655
## 0.0130 0.7154705 0.4310099
## 0.0135 0.7154705 0.4310099
## 0.0140 0.7146628 0.4293934
## 0.0145 0.7158103 0.4316885
## 0.0150 0.7153251 0.4307219
## 0.0155 0.7151585 0.4303521
## 0.0160 0.7151585 0.4303521
## 0.0165 0.7151585 0.4303387
## 0.0170 0.7151585 0.4303387
## 0.0175 0.7151585 0.4303387
## 0.0180 0.7151585 0.4303387
## 0.0185 0.7151599 0.4303496
## 0.0190 0.7151599 0.4303496
## 0.0195 0.7154877 0.4310054
## 0.0200 0.7156517 0.4313332
## 0.0205 0.7156517 0.4313332
## 0.0210 0.7156517 0.4313332
## 0.0215 0.7156517 0.4313332
## 0.0220 0.7158156 0.4316611
## 0.0225 0.7158156 0.4316611
## 0.0230 0.7158156 0.4316611
## 0.0235 0.7158156 0.4316611
## 0.0240 0.7158156 0.4316611
## 0.0245 0.7158156 0.4316611
## 0.0250 0.7158156 0.4316611
## 0.0255 0.7158156 0.4316611
## 0.0260 0.7158156 0.4316611
## 0.0265 0.7158156 0.4316611
## 0.0270 0.7158156 0.4316611
## 0.0275 0.7158156 0.4316611
## 0.0280 0.7158156 0.4316611
## 0.0285 0.7158156 0.4316611
## 0.0290 0.7174549 0.4349398
## 0.0295 0.7174549 0.4349398
## 0.0300 0.7158289 0.4316474
## 0.0305 0.7158289 0.4316474
## 0.0310 0.7136978 0.4273851
## 0.0315 0.7136978 0.4273851
## 0.0320 0.7117306 0.4234507
## 0.0325 0.7117306 0.4234507
## 0.0330 0.7117306 0.4234507
## 0.0335 0.7117306 0.4234507
## 0.0340 0.7109175 0.4218028
## 0.0345 0.7068405 0.4136292
## 0.0350 0.7068405 0.4136292
## 0.0355 0.7043815 0.4087111
## 0.0360 0.7043815 0.4087111
## 0.0365 0.7012854 0.4025272
## 0.0370 0.7012854 0.4025272
## 0.0375 0.6993262 0.3986634
## 0.0380 0.6993262 0.3986634
## 0.0385 0.6959167 0.3918766
## 0.0390 0.6949331 0.3899094
## 0.0395 0.6937948 0.3876636
## 0.0400 0.6921568 0.3844390
## 0.0405 0.6921568 0.3844390
## 0.0410 0.6928112 0.3856900
## 0.0415 0.6928112 0.3856900
## 0.0420 0.6923208 0.3847308
## 0.0425 0.6923208 0.3847308
## 0.0430 0.6923208 0.3847308
## 0.0435 0.6923208 0.3847308
## 0.0440 0.6924834 0.3850140
## 0.0445 0.6937948 0.3876370
## 0.0450 0.6937948 0.3876370
## 0.0455 0.6942867 0.3886206
## 0.0460 0.6942867 0.3886206
## 0.0465 0.6949424 0.3899321
## 0.0470 0.6949424 0.3899321
## 0.0475 0.6949424 0.3899321
## 0.0480 0.6949424 0.3899321
## 0.0485 0.6949424 0.3899321
## 0.0490 0.6949424 0.3899321
## 0.0495 0.6949424 0.3899321
## 0.0500 0.6949424 0.3899321
## 0.0505 0.6949424 0.3899321
## 0.0510 0.6949424 0.3899321
## 0.0515 0.6949424 0.3899321
## 0.0520 0.6949424 0.3899321
## 0.0525 0.6949424 0.3899321
## 0.0530 0.6949424 0.3899321
## 0.0535 0.6949424 0.3899321
## 0.0540 0.6949424 0.3899321
## 0.0545 0.6949424 0.3899321
## 0.0550 0.6949424 0.3899321
## 0.0555 0.6949424 0.3899321
## 0.0560 0.6949424 0.3899321
## 0.0565 0.6949424 0.3899321
## 0.0570 0.6949424 0.3899321
## 0.0575 0.6949424 0.3899321
## 0.0580 0.6949424 0.3899321
## 0.0585 0.6949424 0.3899321
## 0.0590 0.6949424 0.3899321
## 0.0595 0.6949424 0.3899321
## 0.0600 0.6949424 0.3899321
## 0.0605 0.6949424 0.3899321
## 0.0610 0.6949424 0.3899321
## 0.0615 0.6949424 0.3899321
## 0.0620 0.6949424 0.3899321
## 0.0625 0.6949424 0.3899321
## 0.0630 0.6949424 0.3899321
## 0.0635 0.6949424 0.3899321
## 0.0640 0.6949424 0.3899321
## 0.0645 0.6949424 0.3899321
## 0.0650 0.6949424 0.3899321
## 0.0655 0.6949424 0.3899321
## 0.0660 0.6949424 0.3899321
## 0.0665 0.6949424 0.3899321
## 0.0670 0.6949424 0.3899321
## 0.0675 0.6949424 0.3899321
## 0.0680 0.6949424 0.3899321
## 0.0685 0.6949424 0.3899321
## 0.0690 0.6949424 0.3899321
## 0.0695 0.6949424 0.3899321
## 0.0700 0.6949424 0.3899321
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.0295.
library(ggplot2)
ggplot(modelo_rpart , highlight = TRUE) +
scale_x_continuous(breaks = hiperparametros$cp) +
labs(title = "Evoluci?n del accuracy del modelo CART", x = "cp") +
theme_bw()
## n= 1226
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 1226 613 0 (0.5000000 0.5000000)
## 2) NMES_ATR15_I_U6K_24M< -0.1693292 886 322 0 (0.6365688 0.3634312)
## 4) MAX_ATR_I_12M< -0.609095 431 104 0 (0.7587007 0.2412993) *
## 5) MAX_ATR_I_12M>=-0.609095 455 218 0 (0.5208791 0.4791209)
## 10) NMES_UATR3_I_24M>=-0.2945482 232 83 0 (0.6422414 0.3577586) *
## 11) NMES_UATR3_I_24M< -0.2945482 223 88 1 (0.3946188 0.6053812) *
## 3) NMES_ATR15_I_U6K_24M>=-0.1693292 340 49 1 (0.1441176 0.8558824) *

El valor de Accuracy (Precisión) igual a 0.7174549 significa que aproximadamente el 71.75% de las predicciones realizadas por el modelo Árbol de Clasificación: RPART (cart) fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
Maquinas de Soporte Vectorial (SVM) - Kernel Radial
Hiperparametros
#######################################################
# M?quinas de Soporte Vectorial (SVM) - Kernel Radial #
#######################################################
# HIPERPAR?METROS, N?MERO DE REPETICIONES Y SEMILLAS PARA CADA REPETICI?N
#===============================================================================
# Hiperpar?metros
#hiperparametros <- expand.grid(sigma = c(0.001, 0.01, 0.1, 0.5, 1),
# C = c(1 , 20, 50, 100, 200, 500, 700))
hiperparametros <- expand.grid(sigma = seq(0.1,0.6,0.1),
C = seq(10,70,5))
set.seed(666)
seeds <- vector(mode = "list", length = (particiones * repeticiones) + 1)
for (i in 1:(particiones * repeticiones)) {
seeds[[i]] <- sample.int(1000, nrow(hiperparametros))
}
seeds[[(particiones * repeticiones) + 1]] <- sample.int(1000, 1)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# AJUSTE DEL MODELO
# ==============================================================================
set.seed(342)
modelo_svmrad <- train(FLG_CLI_DEF60 ~ ., data = datos_train_prep,
method = "svmRadial",
tuneGrid = hiperparametros,
metric = metrica,
trControl = control_train)
modelo_svmrad## Support Vector Machines with Radial Basis Function Kernel
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results across tuning parameters:
##
## sigma C Accuracy Kappa
## 0.1 10 0.7229387 0.4458780
## 0.1 15 0.7164118 0.4328221
## 0.1 20 0.7108647 0.4217341
## 0.1 25 0.7089147 0.4178190
## 0.1 30 0.7058159 0.4116227
## 0.1 35 0.7025491 0.4050905
## 0.1 40 0.7020626 0.4041192
## 0.1 45 0.7002766 0.4005569
## 0.1 50 0.6983319 0.3966708
## 0.1 55 0.6976815 0.3953699
## 0.1 60 0.6966993 0.3934065
## 0.1 65 0.6962075 0.3924272
## 0.1 70 0.6952292 0.3904707
## 0.2 10 0.6979815 0.3959441
## 0.2 15 0.6950639 0.3901141
## 0.2 20 0.6944187 0.3888315
## 0.2 25 0.6924688 0.3849362
## 0.2 30 0.6906603 0.3813203
## 0.2 35 0.6888729 0.3777440
## 0.2 40 0.6882225 0.3764381
## 0.2 45 0.6883997 0.3768016
## 0.2 50 0.6859473 0.3718882
## 0.2 55 0.6830085 0.3660092
## 0.2 60 0.6825193 0.3650380
## 0.2 65 0.6828472 0.3656882
## 0.2 70 0.6804041 0.3608009
## 0.3 10 0.6960342 0.3920599
## 0.3 15 0.6910014 0.3819989
## 0.3 20 0.6854489 0.3708848
## 0.3 25 0.6829953 0.3659776
## 0.3 30 0.6812026 0.3624118
## 0.3 35 0.6787661 0.3575363
## 0.3 40 0.6758259 0.3516510
## 0.3 45 0.6746731 0.3493330
## 0.3 50 0.6728858 0.3457540
## 0.3 55 0.6697804 0.3395421
## 0.3 60 0.6697883 0.3395736
## 0.3 65 0.6697923 0.3395830
## 0.3 70 0.6704507 0.3409032
## 0.4 10 0.6862726 0.3725514
## 0.4 15 0.6831831 0.3663750
## 0.4 20 0.6810505 0.3620913
## 0.4 25 0.6771466 0.3542669
## 0.4 30 0.6748596 0.3496782
## 0.4 35 0.6707798 0.3415205
## 0.4 40 0.6668733 0.3337034
## 0.4 45 0.6644249 0.3288103
## 0.4 50 0.6629561 0.3258698
## 0.4 55 0.6637758 0.3275073
## 0.4 60 0.6627923 0.3255433
## 0.4 65 0.6616501 0.3232473
## 0.4 70 0.6595256 0.3190009
## 0.5 10 0.6795832 0.3591480
## 0.5 15 0.6792858 0.3585567
## 0.5 20 0.6745503 0.3490731
## 0.5 25 0.6681954 0.3363365
## 0.5 30 0.6672038 0.3343569
## 0.5 35 0.6641050 0.3281496
## 0.5 40 0.6621379 0.3242131
## 0.5 45 0.6601679 0.3202752
## 0.5 50 0.6577168 0.3153756
## 0.5 55 0.6583713 0.3166793
## 0.5 60 0.6557430 0.3114332
## 0.5 65 0.6547714 0.3094978
## 0.5 70 0.6549313 0.3098190
## 0.6 10 0.6800803 0.3601381
## 0.6 15 0.6712796 0.3425210
## 0.6 20 0.6660776 0.3321146
## 0.6 25 0.6621418 0.3242415
## 0.6 30 0.6608303 0.3216269
## 0.6 35 0.6601772 0.3202993
## 0.6 40 0.6593575 0.3186599
## 0.6 45 0.6583806 0.3166991
## 0.6 50 0.6578887 0.3157050
## 0.6 55 0.6565800 0.3130864
## 0.6 60 0.6549538 0.3098356
## 0.6 65 0.6551151 0.3101520
## 0.6 70 0.6534903 0.3069005
##
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were sigma = 0.1 and C = 10.
## Support Vector Machine object of class "ksvm"
##
## SV type: C-svc (classification)
## parameter : cost C = 10
##
## Gaussian Radial Basis kernel function.
## Hyperparameter : sigma = 0.1
##
## Number of Support Vectors : 751
##
## Objective Function Value : -5843.436
## Training error : 0.204731
# REPRESENTACI?N GR?FICA
# ==============================================================================
ggplot(modelo_svmrad, highlight = TRUE) +
labs(title = "Evoluci?n del accuracy del modelo SVM Radial") +
theme_bw()
El valor de Accuracy (Precisión) igual a 0.7229387 significa que aproximadamente el 72.29% de las predicciones realizadas por el modelo Maquinas de Soporte Vectorial (SVM) - Kernel Radial fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
EXtreme Gradient Boosting - XGBoost
Hiperparametros
#######################################################
# eXtreme Gradient Boosting - XGBoost #
#######################################################
# Carga de bibliotecas
library(xgboost)
library(caret)
library(ggplot2)
# Definición de hiperparámetros para XGBoost
hiperparametros_xgb <- expand.grid(
nrounds = seq(50, 50, 50),
max_depth = c(3, 6, 9),
eta = c(0.01, 0.1, 0.3),
gamma = 0,
colsample_bytree = 1,
min_child_weight = 1,
subsample = 1
)DEFINICION DEL ENTRENAMIENTO
AJUSTE DEL MODELO
# Ajuste del modelo XGBoost
set.seed(342)
modelo_xgb <- train(FLG_CLI_DEF60 ~ .,data = datos_train_prep,
method = "xgbTree",
tuneGrid = hiperparametros_xgb,
metric = metrica,
trControl = control_train_xgb
)## [00:45:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [00:48:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## eXtreme Gradient Boosting
##
## 1226 samples
## 10 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (10 fold, repeated 5 times)
## Summary of sample sizes: 1103, 1104, 1103, 1104, 1103, 1104, ...
## Resampling results across tuning parameters:
##
## eta max_depth nrounds Accuracy Kappa
## 0.01 3 50 0.7167768 0.4336220
## 0.01 3 100 0.7254123 0.4508731
## 0.01 3 150 0.7296546 0.4593448
## 0.01 3 200 0.7329319 0.4658965
## 0.01 6 50 0.7146298 0.4292651
## 0.01 6 100 0.7204915 0.4409995
## 0.01 6 150 0.7237556 0.4475368
## 0.01 6 200 0.7234290 0.4468842
## 0.01 9 50 0.6982091 0.3964906
## 0.01 9 100 0.7022292 0.4045075
## 0.01 9 150 0.7076284 0.4153000
## 0.01 9 200 0.7087508 0.4175471
## 0.10 3 50 0.7337264 0.4674791
## 0.10 3 100 0.7270356 0.4540930
## 0.10 3 150 0.7221335 0.4442879
## 0.10 3 200 0.7204996 0.4410112
## 0.10 6 50 0.7209502 0.4419074
## 0.10 6 100 0.7098572 0.4197189
## 0.10 6 150 0.7096972 0.4193996
## 0.10 6 200 0.7033185 0.4066360
## 0.10 9 50 0.7085498 0.4171205
## 0.10 9 100 0.7065958 0.4132210
## 0.10 9 150 0.7056055 0.4112572
## 0.10 9 200 0.7057801 0.4116138
## 0.30 3 50 0.7183818 0.4367770
## 0.30 3 100 0.7087190 0.4174297
## 0.30 3 150 0.7054749 0.4109417
## 0.30 3 200 0.7009178 0.4018356
## 0.30 6 50 0.7075581 0.4151270
## 0.30 6 100 0.6966237 0.3932954
## 0.30 6 150 0.7029933 0.4060524
## 0.30 6 200 0.7024922 0.4050231
## 0.30 9 50 0.7070930 0.4142243
## 0.30 9 100 0.7056030 0.4112446
## 0.30 9 150 0.7049658 0.4099799
## 0.30 9 200 0.7034866 0.4070302
##
## Tuning parameter 'gamma' was held constant at a value of 0
## Tuning
##
## Tuning parameter 'min_child_weight' was held constant at a value of 1
##
## Tuning parameter 'subsample' was held constant at a value of 1
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were nrounds = 50, max_depth = 3, eta
## = 0.1, gamma = 0, colsample_bytree = 1, min_child_weight = 1 and subsample = 1.
## ##### xgb.Booster
## raw: 59.2 Kb
## call:
## xgboost::xgb.train(params = list(eta = param$eta, max_depth = param$max_depth,
## gamma = param$gamma, colsample_bytree = param$colsample_bytree,
## min_child_weight = param$min_child_weight, subsample = param$subsample),
## data = x, nrounds = param$nrounds, objective = "binary:logistic")
## params (as set within xgb.train):
## eta = "0.1", max_depth = "3", gamma = "0", colsample_bytree = "1", min_child_weight = "1", subsample = "1", objective = "binary:logistic", validate_parameters = "TRUE"
## xgb.attributes:
## niter
## callbacks:
## cb.print.evaluation(period = print_every_n)
## # of features: 10
## niter: 50
## nfeatures : 10
## xNames : MAX_ATR_I_12M NMES_ATR15_I_U6K_24M RTOT_DACT_DTOT_24M VAR_PROM_ENT_ACTU_24M NMES_UATR3_I_24M VAR_PROM_DEUDIR_ACTU_12M INC_SUM_ACTSH_ACTU_24M MAX_ENT_12M N_NOR_24M NMES_UATR15_I_U6K_24M
## problemType : Classification
## tuneValue :
## nrounds max_depth eta gamma colsample_bytree min_child_weight subsample
## 13 50 3 0.1 0 1 1 1
## obsLevels : 0 1
## param :
## list()
# Representación gráfica de la evolución del accuracy
ggplot(modelo_xgb, highlight = TRUE) +
labs(title = "Evolución del accuracy del modelo XGBoost") +
theme_bw()
El valor de Accuracy (Precisión) igual a 0.7337264 significa que aproximadamente el 73.37% de las predicciones realizadas por el modelo EXtreme Gradient Boosting - XGBoost fueron correctas en términos de clasificar correctamente si un préstamo resultaría en incumplimiento o no.
Comparacion de Modelos
#################################################
# Comparaci?n de Modelos #
#################################################
modelos <- list(KNN = modelo_knn, NB = modelo_nb,
Arbol_C5.0 = modelo_C50Tree, Arbol_CART = modelo_rpart,
SVMradial = modelo_svmrad,
xgboost = modelo_xgb
)
resultados_resamples <- resamples(modelos)
resultados_resamples$values %>% head(20)## Resample KNN~Accuracy KNN~Kappa NB~Accuracy NB~Kappa Arbol_C5.0~Accuracy
## 1 Fold01.Rep1 0.7154472 0.4319831 0.7398374 0.4799154 0.7642276
## 2 Fold01.Rep2 0.7661290 0.5322581 0.6290323 0.2580645 0.7661290
## 3 Fold01.Rep3 0.7786885 0.5573770 0.7049180 0.4098361 0.7540984
## 4 Fold01.Rep4 0.7049180 0.4098361 0.6065574 0.2131148 0.6557377
## 5 Fold01.Rep5 0.7131148 0.4262295 0.6639344 0.3278689 0.6721311
## 6 Fold02.Rep1 0.7704918 0.5409836 0.7459016 0.4918033 0.7459016
## 7 Fold02.Rep2 0.6639344 0.3278689 0.6557377 0.3114754 0.7131148
## 8 Fold02.Rep3 0.7398374 0.4806017 0.7723577 0.5444444 0.7317073
## 9 Fold02.Rep4 0.7295082 0.4590164 0.6967213 0.3934426 0.7213115
## 10 Fold02.Rep5 0.7398374 0.4788136 0.6910569 0.3827258 0.7154472
## 11 Fold03.Rep1 0.7154472 0.4300278 0.6666667 0.3340816 0.7235772
## 12 Fold03.Rep2 0.6967213 0.3934426 0.6721311 0.3442623 0.6557377
## 13 Fold03.Rep3 0.7500000 0.5000000 0.7338710 0.4677419 0.7580645
## 14 Fold03.Rep4 0.7950820 0.5901639 0.7622951 0.5245902 0.7295082
## 15 Fold03.Rep5 0.7377049 0.4754098 0.7049180 0.4098361 0.6967213
## 16 Fold04.Rep1 0.7049180 0.4098361 0.6557377 0.3114754 0.7295082
## 17 Fold04.Rep2 0.7317073 0.4624553 0.6585366 0.3179298 0.7073171
## 18 Fold04.Rep3 0.6967213 0.3934426 0.5819672 0.1639344 0.6393443
## 19 Fold04.Rep4 0.7235772 0.4463860 0.6991870 0.3964991 0.7235772
## 20 Fold04.Rep5 0.6829268 0.3665654 0.6747967 0.3493785 0.6910569
## Arbol_C5.0~Kappa Arbol_CART~Accuracy Arbol_CART~Kappa SVMradial~Accuracy
## 1 0.5289846 0.7479675 0.4965007 0.6910569
## 2 0.5322581 0.7500000 0.5000000 0.7822581
## 3 0.5081967 0.7049180 0.4098361 0.7049180
## 4 0.3114754 0.6639344 0.3278689 0.7213115
## 5 0.3442623 0.6803279 0.3606557 0.6967213
## 6 0.4918033 0.7540984 0.5081967 0.7377049
## 7 0.4262295 0.7131148 0.4262295 0.6721311
## 8 0.4631662 0.7073171 0.4150594 0.6991870
## 9 0.4426230 0.7049180 0.4098361 0.6885246
## 10 0.4312327 0.7479675 0.4953011 0.7723577
## 11 0.4472641 0.7317073 0.4621704 0.7235772
## 12 0.3114754 0.6967213 0.3934426 0.7295082
## 13 0.5161290 0.7016129 0.4032258 0.7580645
## 14 0.4590164 0.7131148 0.4262295 0.7622951
## 15 0.3934426 0.7622951 0.5245902 0.7295082
## 16 0.4590164 0.7459016 0.4918033 0.6967213
## 17 0.4144406 0.6747967 0.3493785 0.7235772
## 18 0.2786885 0.7131148 0.4262295 0.6885246
## 19 0.4468254 0.7642276 0.5281122 0.7154472
## 20 0.3830517 0.6991870 0.3995250 0.7398374
## SVMradial~Kappa xgboost~Accuracy xgboost~Kappa
## 1 0.3830517 0.7560976 0.5129356
## 2 0.5645161 0.7903226 0.5806452
## 3 0.4098361 0.7540984 0.5081967
## 4 0.4426230 0.7131148 0.4262295
## 5 0.3934426 0.6721311 0.3442623
## 6 0.4754098 0.7622951 0.5245902
## 7 0.3442623 0.7540984 0.5081967
## 8 0.3988905 0.7235772 0.4475561
## 9 0.3770492 0.6967213 0.3934426
## 10 0.5440826 0.7642276 0.5278623
## 11 0.4460927 0.7317073 0.4627399
## 12 0.4590164 0.7131148 0.4262295
## 13 0.5161290 0.7822581 0.5645161
## 14 0.5245902 0.7622951 0.5245902
## 15 0.4590164 0.7786885 0.5573770
## 16 0.3934426 0.7295082 0.4590164
## 17 0.4463860 0.6991870 0.3977769
## 18 0.3770492 0.6885246 0.3770492
## 19 0.4303295 0.7317073 0.4627399
## 20 0.4799154 0.6910569 0.3827258
# Se trasforma el dataframe devuelto por resamples() para separar el nombre del
# modelo y las m?tricas en columnas distintas.
metricas_resamples <- resultados_resamples$values %>%
gather(key = "modelo", value = "valor", -Resample) %>%
separate(col = "modelo", into = c("modelo", "metrica"),
sep = "~", remove = TRUE)
metricas_resamples %>% head()## Resample modelo metrica valor
## 1 Fold01.Rep1 KNN Accuracy 0.7154472
## 2 Fold01.Rep2 KNN Accuracy 0.7661290
## 3 Fold01.Rep3 KNN Accuracy 0.7786885
## 4 Fold01.Rep4 KNN Accuracy 0.7049180
## 5 Fold01.Rep5 KNN Accuracy 0.7131148
## 6 Fold02.Rep1 KNN Accuracy 0.7704918
# Accuracy y Kappa promedio de cada modelo
metricas_resamples %>%
group_by(modelo, metrica) %>%
summarise(media = mean(valor)) %>%
spread(key = metrica, value = media) %>%
arrange(desc(Accuracy))## # A tibble: 6 × 3
## # Groups: modelo [6]
## modelo Accuracy Kappa
## <chr> <dbl> <dbl>
## 1 xgboost 0.734 0.467
## 2 KNN 0.728 0.457
## 3 SVMradial 0.723 0.446
## 4 Arbol_C5.0 0.718 0.436
## 5 Arbol_CART 0.717 0.435
## 6 NB 0.680 0.359
metricas_resamples %>%
filter(metrica == "Accuracy") %>%
group_by(modelo) %>%
summarise(media = mean(valor)) %>%
ggplot(aes(x = reorder(modelo, media), y = media, label = round(media, 2))) +
geom_segment(aes(x = reorder(modelo, media), y = 0,
xend = modelo, yend = media),
color = "grey50") +
geom_point(size = 7, color = "firebrick") +
geom_text(color = "white", size = 2.5) +
scale_y_continuous(limits = c(0, 1)) +
# Accuracy basal
geom_hline(yintercept = 0.70, linetype = "dashed") +
annotate(geom = "text", y = 0.70, x = 5.5, label = "Ratio No Informativo") +
labs(title = "Validaci?n: Accuracy medio repeated-CV",
subtitle = "Modelos ordenados por media",
x = "modelo") +
coord_flip() +
theme_bw()metricas_resamples %>% filter(metrica == "Accuracy") %>%
group_by(modelo) %>%
mutate(media = mean(valor)) %>%
ungroup() %>%
ggplot(aes(x = reorder(modelo, media), y = valor, color = modelo)) +
geom_boxplot(alpha = 0.6, outlier.shape = NA) +
geom_jitter(width = 0.1, alpha = 0.6) +
scale_y_continuous(limits = c(0, 1)) +
# Accuracy basal
geom_hline(yintercept = 0.70, linetype = "dashed") +
annotate(geom = "text", y = 0.70, x = 6.5, label = "Ratio No Informativo") +
theme_bw() +
labs(title = "Validaci?n: Accuracy medio repeated-CV",
subtitle = "Modelos ordenados por media") +
coord_flip() +
theme(legend.position = "none")# Accuracy y Kappa promedio de cada modelo
metricas_promedio <- metricas_resamples %>%
group_by(modelo, metrica) %>%
summarise(media = mean(valor))Se observa que el modelo que tiene un mejor performance es el modelo EXtreme Gradient Boosting - XGBoost, con una Precisión (Accuracy) de 0.7337264 (73.37%)
Gráfico de barras de Accuracy promedio
# Gráfico de barras de Accuracy promedio
ggplot(metricas_promedio, aes(x = reorder(modelo, media), y = media, fill = modelo)) +
geom_bar(stat = "identity") +
labs(title = "Validación: Accuracy promedio repeated-CV",
x = "Modelo", y = "Accuracy Promedio") +
scale_y_continuous(limits = c(0, 1)) + # Establecer los límites del eje y
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))CONCLUSION:
El valor de precisión (Accuracy) de 0.7337264 (73.37%) adquiere un significado esencial en nuestro análisis de predicción de incumplimiento bancario (Default) , al proporcionarnos una medida clave de la capacidad del modelo EXtreme Gradient Boosting - XGBoost para realizar predicciones certeras.
Este valor nos indica que alrededor del 73.37% de las predicciones realizadas por el modelo EXtreme Gradient Boosting - XGBoost son acertadas al determinar si un préstamo concluirá en incumplimiento(Default) o no. En otras palabras, el modelo tiene la capacidad de clasificar adecuadamente la gran mayoría de los casos en función de su resultado real.
#Test de Friedman para comparar el accuracy de los modelos
library(coin)
matriz_metricas <- metricas_resamples %>%
filter(metrica == "Accuracy") %>%
spread(key = modelo, value = valor) %>%
select(-Resample, -metrica) %>%
as.matrix()
friedman.test(matriz_metricas)##
## Friedman rank sum test
##
## data: matriz_metricas
## Friedman chi-squared = 70.355, df = 5, p-value = 8.644e-14
En este caso, el p-value es extremadamente pequeño, lo que indica que hay diferencias significativas en el rendimiento de los modelos según la métrica de Accuracy.
Esto sugiere que al menos uno de los modelos es estadísticamente diferente de los demás en términos de su rendimiento de Accuracy.