Algoritmos de aprendizaje automático para predecir la morosidad en el otorgamiento de crédito en las Instituciones Financieras

Julio Cesar Carpio Ticona

Puno - Perú

2018-08-11

CONTENIDO

1. EL PROBLEMA

2. REVISIÓN DE LA LITERATURA

3. METODOLOGÍA

4. PRUEBAS, RESULTADOS Y DISCUSIÓN

5. CONCLUSIONES Y RECOMENDACIONES

EL PROBLEMA

PROBLEMA

PROBLEMA

PROBLEMA

PROBLEMA GENERAL

¿Qué algoritmo de aprendizaje automático será el más eficiente para predecir la morosidad en el otorgamiento de crédito en las Instituciones Financieras para garantizar una futura toma de decisión adecuada por parte de los administradores de riesgo respecto a brindar crédito a los clientes?

PROBLEMAS ESPECÍFICOS

OBEJETIVOS DE LA INVESTIGACIÓN

OBJETIVO GENERAL

OBJETIVOS ESPECÍFICOS

HIPÓTESIS DE LA INVESTIGACIÓN

HIPÓTESIS GENERAL

HIPÓTESIS ESPECÍFICOS

REVISIÓN DE LA LITERATURA

SISTEMA FINANCIERO PERUANO

PROCESO DEL CRÉDITO

El Crédito es la operacion financiera donde una entidad le concede a otra una cantidad de dinero en una cuenta a su disposicion, comprometiendose a devolver todo el dinero tomado, pagando ademas un interés por el uso de esa cantidad.

CONCEPTOS IMPORTANTES

Minería Datos: Proceso de descubrir información útil a partir del análisis de grandes volúmenes de datos cuyo objetivo es predecir tendencias o comportamientos y obtener modelos que previamente eran desconocidos.

Aprendizaje Automático: Construcción de programas que utilizando la experiencia sean capaces de mejorar automáticamente su rendimiento (Aprendizaje supervisado y no supervisado).

CONCEPTOS IMPORTANTES

MODELOS DE APRENDIZAJE AUTOMÁTICO

MÉTODOS DE EVALUACIÓN

METODOLOGÍA

METODOLOGÍA

METODOLOGÍA CRISP-DM

PRUEBAS Y RESULTADOS

Código en R (Entrenamiento y Prueba) y Modelo General

library(RODBC); library(DT)
canal<-odbcConnect("H-MYSQL",uid = "root")
datos<-sqlQuery(canal,"SELECT *FROM creditomodelo")
close(canal)
set.seed(134) # training 70% y testing 30%
dividir <- sample(2, nrow(datos), replace = TRUE, prob = c(0.7, 0.3))
entrenamiento <- datos[dividir == 1, ] ; prueba <- datos[dividir == 2, ]

Árboles de Decisión

library(RODBC); library(rpart)
canal<-odbcConnect("H-MYSQL",uid = "root")
datos<-sqlQuery(canal,"SELECT *FROM creditomodelo")
datos<-datos[,-1]; datos$salario<-as.factor(datos$salario); datos$tiemporesidencia<-as.factor(datos$tiemporesidencia)
datos$diasatraso<-as.factor(datos$diasatraso); close(canal)
set.seed(134) # training 70% y testing 30%
dividir <- sample(2, nrow(datos), replace = TRUE, prob = c(0.8, 0.2))
entrenamiento <- datos[dividir == 1, ]; prueba <- datos[dividir == 2, ]
modelo_arbol <- rpart(resultado~., data = entrenamiento,
                    control = rpart.control(minsplit = 60,
                    minbucket = 0.66,cp = 0.01,maxdepth = 30))
prediccion_arbolROC <- predict(modelo_arbol, prueba, type = "prob") # se usa para hallar plotROC
prediccion_arbol <- predict(modelo_arbol, prueba[,-20], type = "class") # se usa para hallar MC
MC <- table(prueba$resultado,prediccion_arbol);acierto <- sum(diag(MC))/sum(MC)
error <- 1-acierto; score_arbol <- prediccion_arbolROC[,2]
clase_arbol <- prueba$resultado

Árboles de Decisión

Bosques Aleatorios

library(RODBC); library(randomForest)
canal<-odbcConnect("H-MYSQL",uid = "root")
datos<-sqlQuery(canal,"SELECT *FROM creditomodelo")
datos<-datos[,-1]; datos$salario<-as.factor(datos$salario)
datos$tiemporesidencia<-as.factor(datos$tiemporesidencia)
datos$diasatraso<-as.factor(datos$diasatraso); close(canal)
set.seed(134) # training 80% y testing 20%
dividir <- sample(2, nrow(datos), replace = TRUE, prob = c(0.8, 0.2))
entrenamiento <- datos[dividir == 1, ]; prueba <- datos[dividir == 2, ]
modelo_bosque<-randomForest(resultado~.,data = entrenamiento,importance=TRUE, ntree = 500)
prediccion_bosque <- predict(modelo_bosque, prueba[,-20], type = "class") # para hallar MC
prediccion_bosqueROC <- predict(modelo_bosque, prueba[,-20], type = "prob") # para hallar ROC
MC<-table(prueba$resultado,prediccion_bosque); acierto<-sum(diag(MC))/sum(MC)
error <- 1-acierto; score <- prediccion_bosqueROC[,2] ; clase <- prueba$resultado

Bosques Aleatorios

Redes Neuronales

library(RODBC); library(nnet)
canal<-odbcConnect("H-MYSQL",uid = "root")
datos<-sqlQuery(canal,"SELECT *FROM creditomodelo"); datos<-datos[,-1]
datos$salario<-as.factor(datos$salario)
datos$tiemporesidencia<-as.factor(datos$tiemporesidencia)
datos$diasatraso<-as.factor(datos$diasatraso); close(canal)
set.seed(134) # training 80% y testing 20%
dividir <- sample(2, nrow(datos), replace = TRUE, prob = c(0.8, 0.2))
entrenamiento <- datos[dividir == 1, ] ; prueba <- datos[dividir == 2, ]
modelo_red <- nnet(resultado~.,data = entrenamiento, MaxNWts = 16000,
                   size = 300, rang = 0.1, decay = 5e-4, maxit = 400, 
                   trace = FALSE)
prediccion_red <- predict(modelo_red, prueba[,-20], type = "class") # para MC
prediccion_redROC <- predict(modelo_red, prueba[,-20], type = "raw") # para ROC
MC<-table(prueba$resultado,prediccion_red); acierto<-sum(diag(MC))/sum(MC)
error <- 1-acierto; score_red <- prediccion_redROC[,1]
clase_red <- prueba$resultado

Redes Neuronales

Máquinas de Vectores de Soporte

library(RODBC); library(e1071)
canal<-odbcConnect("H-MYSQL",uid = "root")
datos<-sqlQuery(canal,"SELECT *FROM creditomodelo"); datos<-datos[,-1]
datos$salario<-as.factor(datos$salario); datos$tiemporesidencia<-as.factor(datos$tiemporesidencia)
datos$diasatraso<-as.factor(datos$diasatraso); close(canal)
set.seed(134) # training 80% y testing 20%
dividir <- sample(2, nrow(datos), replace = TRUE, prob = c(0.8, 0.2))
entrenamiento <- datos[dividir == 1, ] ; prueba <- datos[dividir == 2, ]
modelo_svmPol <- svm(resultado~., data = entrenamiento,kernel = "polynomial", probability = TRUE)
modelo_svmSig <- svm(resultado~., data = entrenamiento,kernel = "sigmoid", probability = TRUE)
modelo_svmRad <- svm(resultado~., data = entrenamiento,kernel = "radial", probability = TRUE)
modelo_svmLin <- svm(resultado~., data = entrenamiento,kernel = "linear", probability = TRUE)
prediccion_svmPol <- predict(modelo_svmPol, prueba[,-20], probability = TRUE)
prediccion_svmSig <- predict(modelo_svmSig, prueba[,-20], probability = TRUE)
prediccion_svmRad <- predict(modelo_svmRad, prueba[,-20], probability = TRUE)
prediccion_svmLin <- predict(modelo_svmLin, prueba[,-20], probability = TRUE)
MCPol<-table(prueba$resultado,prediccion_svmPol); MCSig<-table(prueba$resultado,prediccion_svmSig)
MCRad<-table(prueba$resultado,prediccion_svmRad); MCLin<-table(prueba$resultado,prediccion_svmLin)
aciertoPol<-sum(diag(MCPol))/sum(MCPol); aciertoSig<-sum(diag(MCSig))/sum(MCSig)
aciertoRad<-sum(diag(MCRad))/sum(MCRad); aciertoLin<-sum(diag(MCLin))/sum(MCLin)
errorPol <- 1-aciertoPol; errorSig <- 1-aciertoSig
errorRad <- 1 - aciertoRad; errorLin <- 1- aciertoLin
score_svmPol <- attributes(prediccion_svmPol)$probabilities[,2]; clase_svmPol <- prueba$resultado
score_svmSig <- attributes(prediccion_svmSig)$probabilities[,2]; clase_svmSig <- prueba$resultado
score_svmRad <- attributes(prediccion_svmRad)$probabilities[,2]; clase_svmRad <- prueba$resultado
score_svmLin <- attributes(prediccion_svmLin)$probabilities[,2]; clase_svmLin <- prueba$resultado

Máquinas de Vectores de Soporte

Máquinas de Vectores de Soporte

Evaluando los Algoritmos

Evaluando los Algoritmos

Evaluando los Algoritmos

GRACIAS!