Trabajo Fin de Grado
Grado en Ingeniería de Tecnologías Industriales
Evaluación del riesgo crediticio mediante
árboles de clasificación y bosques aleatorios
Autora: Patricia Pino Cubiles
Tutora: Ester Gutiérrez Moya
Payán Somet
Dep. Organización Industrial y Gestión de Empresas I
Escuela Técnica Superior de Ingeniería
Sevilla, 2017
1
2
Trabajo Fin de Grado
Grado en Ingeniería de Tecnologías Industriales
Evaluación del riesgo crediticio mediante
árboles de clasificación y bosques aleatorios
Autora:
Patricia Pino Cubiles
Tutora:
Ester Gutiérrez Moya
Profesora Titular de Universidad
Dep. de Organización Industrial y Gestión de Empresas I
Escuela Técnica Superior de Ingeniería
Universidad de Sevilla
Sevilla, 2017
3
4
Índice 1. Introducción .......................................................................................................................... 6
2. Conceptos básicos del Aprendizaje Estadístico Supervisado .............................................. 10
3. Árboles de clasificación ...................................................................................................... 17
3.1 Concepto y características de los árboles de clasificación .......................................... 17
3.2 Conceptos asociados al árbol ...................................................................................... 18
3.3 Elementos necesarios en el algoritmo de construcción ............................................... 20
3.4 Poda del árbol (Pruning) ............................................................................................. 23
3.4.1 Secuencia de subárboles ...................................................................................... 24
3.4.2 Selección del árbol óptimo .................................................................................. 25
3.5 Ventajas y desventajas de los árboles.......................................................................... 29
4. Bosques aleatorios (“Random Forests”) .............................................................................. 31
5. Aplicación a una base de datos de microcréditos ................................................................ 37
5.1. Descripción de la base de datos ........................................................................................ 37
5.2. Lectura y preparación de los datos con R ......................................................................... 40
5.3. Construcción de un árbol de clasificación ........................................................................ 43
5.4. Construcción de un modelo Bosque Aleatorio ................................................................. 58
6. Aplicación a una base de datos de créditos concedidos en Alemania a personas físicas. ... 63
6.1 Descripción de la base de datos ......................................................................................... 63
6.2 Tratamiento de datos no balanceados ................................................................................ 65
6.3. Construcción de modelos de clasificación sin aplicar procedimientos de muestreo para
datos no balanceados ............................................................................................................... 67
6.3.1. Árbol de clasificación ................................................................................................. 67
6.3.2. Bosque Aleatorio ....................................................................................................... 71
6.4. Construcción de modelos de clasificación aplicando procedimientos de muestreo para
datos no balanceados ............................................................................................................... 75
6.4.1. DownSampling .......................................................................................................... 75
6.4.2. Remuestreo en la clase minoritaria (“UpSampling”) ................................................ 83
6.4.3 Umbrales de decisión alternativos ............................................................................. 92
6.5. Resultados de los distintos métodos ............................................................................... 101
7. Conclusiones y posibles aplicaciones futuras ................................................................... 103
8. Referencias bibliográficas ................................................................................................. 105
5
6
1. Introducción
En los últimos años la Ciencia Estadística ha tenido que adaptarse a los nuevos retos y
problemas derivados de la ingente cantidad de información y datos generada en los
distintos sectores económicos. La estadística actúa como vehículo para el procesamiento
y análisis con el objetivo de poder determinar patrones y tendencias del conjunto de
datos.
Estos procesos son conocidos con diversos nombres entre los que destacan: Aprendizaje
Estadístico, Aprendizaje Automático, Minería de Datos, Ciencia del Dato, Big Data,
Descubrimiento del Conocimiento en Bases de Datos, conocido también mediante sus
siglas en inglés, KDD, Knowledge Discovery in Databases.
Estos nuevos retos en el tratamiento de la información requieren una elevada carga
computacional configurándose la Minería de Datos como un campo multidisciplinar
donde se producen contribuciones desde áreas diversas: Ciencias de la Computación,
Estadística, Inteligencia Artificial, Ingeniería, Bioinformática, Geoestadística, entre
otras.
La Teoría del Aprendizaje Estadístico se caracteriza por tener en cuenta aspectos
propios de la Ciencia Estadística: estimación, análisis de sesgos y varianzas,
procedimientos inferenciales, etc.
El término Aprendizaje Estadístico (también denominado mediante el anglicismo
Statistical Learning) incluye un amplio conjunto de herramientas para extraer
información a partir de conjuntos de datos. Estas herramientas pueden clasificarse según
sea el objetivo del análisis de los datos, como técnicas supervisadas y no supervisadas.
En términos generales, el Aprendizaje Estadístico Supervisado se refiere a la
construcción de modelos de predicción, donde se desea estimar el valor de una o más
variables objetivo (variables dependientes) a partir de un conjunto de variables
predictoras. Este tipo de modelos se utilizan en diversas áreas, como Economía,
Medicina, Ingeniería, Astrofísica o Medio Ambiente. Cuando se tiene una variable
dependiente de tipo categórico se habla de problemas de clasificación, mientras que en
situaciones donde la variable respuesta es cuantitativa se tiene un problema de
regresión. A continuación se presentan algunos ejemplos prácticos.
Problemas de Clasificación:
Determinar si un correo electrónico es no deseado (“spam”).
Identificar caracteres a partir de la digitalización de un texto.
Decidir sobre la concesión de un crédito.
Mejorar el rendimiento de una red operacional.
7
Regresión:
Predecir el nivel de contaminación por CO2.
Predecir el nivel de ingresos de un trabajador.
Predecir la demanda de energía eléctrica.
En el Aprendizaje Estadístico No Supervisado no existe la división entre variables
predictoras y variables dependientes. El Análisis de Conglomerados, donde se desea
particionar el conjunto de casos en grupos homogéneos, es un ejemplo típico de
Aprendizaje No Supervisado.
Aunque el término Aprendizaje Estadístico es reciente, la mayoría de los conceptos que
componen su base fueron desarrollados hace varios siglos. A principios del siglo XIX,
Legendre y Gauss publicaron documentos sobre el método de los mínimos cuadrados,
que sirvió como método de estimación de parámetros en la Regresión Lineal. Esta
técnica se aplicó inicialmente en problemas de Astronomía y en general, se puede
utilizar para predecir variables cuantitativas, por ejemplo para predecir el salario de los
trabajadores. Legendre, aunque no fue el primero en utilizar el método, sí fue el primero
en publicarlo en su obra (Nouvelles méthodes pour la determination des orbites des
comètes, 1805).
La polémica entre Gauss y Legendre acerca de la prioridad sobre el método de los
mínimos cuadrados es muy notoria en la historia de la Estadística y son muchos los
científicos posteriores (Plackett 1972, Stigler 1981, Celmins 1998, etc.) que han tratado
de dilucidarla, sin llegar a una conclusión definitiva.
Gauss trató de probar la aplicación del método de los mínimos cuadrados antes de 1805,
pero no tuvo demasiado éxito, tan sólo el astrónomo Olbers incluyó, en un artículo de
1816, una nota a pie de página asegurando que Gauss le había enseñado el método de
los mínimos cuadrados en 1802. Bessel publicó una nota similar en un trabajo en 1832.
En 1936, Fisher propuso el Análisis Discriminante Lineal para construir reglas de
clasificación, que verifica condiciones de optimalidad bajo las hipótesis paramétricas
de normalidad multivariante y homocedasticidad.
Durante la década de los 40, varios autores propusieron una alternativa, la Regresión
Logística, orientada a problemas de clasificación con cuando la variable respuesta toma
dos valores (variable binaria). Este modelo es de uso habitual en Medicina.
En los años 70 apareció el término Modelos Lineales Generalizados, que abarcan un
amplio conjunto de métodos estadísticos, incluyendo como caso particular a los
modelos de Regresón Lineal y Regresión Logística. A finales de la década de los 70 se
disponía de más técnicas, pero en general eran de carácter lineal, ya que el ajuste de
modelos no lineales, por ejemplo las redes de neuronas artificiales o las máquinas de
8
vectores soporte, requerían recursos computacionales que aún tenían que desarrollarse y
ser accesibles a la comunidad científica.
A partir de los años 80 se produce un aumento vertiginoso en las prestaciones de los
equipos informáticos, lo que posibilitó el desarrollo y aplicación de técnicas no lineales.
Breiman et al. (1984) presentaron la metodología CART (“Classification and
Regression Trees”) para la construcción de árboles de clasificación y regresión. Esta
metodología es el objetivo principal de este trabajo, ofreciendo un marco riguroso para
un desarrollo estadísticamente aceptable de este tipo de modelos, incluyendo aspectos
prácticos como el uso de validación cruzada para la determinación del tamaño final del
árbol.
La mejora de las prestaciones de los equipos informáticos ha posibilitado en los últimos
años el desarrollo de las técnicas de combinación de modelos. En estas técnicas se
construyen cierto número de modelos base sobre nuevas muestras generadas a partir del
conjunto de datos original. Para obtener la clasificación de un caso, las distintas
clasificaciones son agregadas mediante votación, o bien mediante la media de las
predicciones en problemas de regresión. En este trabajo también se presentará una
técnica de combinación de árboles, llamada Bosques Aleatorios (“Random Forests”)
que ofrece buenos resultados en muchas aplicaciones.
La construcción de todos estos modelos requiere una aplicación informática apropiada.
En este trabajo se utilizará el entorno de programación estadística R, (R Core Team,
2017), un producto de libre distribución bajo la GNU General Public License. R ofrece
un amplio conjunto de librerías que permiten construir la gran mayoría de técnicas de
Aprendizaje Estadístico, y además la comunidad de usuarios mantiene constantemente
actualizada esta plataforma de computación estadística.
Por tanto, los principales objetivos de este trabajo son los siguientes:
Describir la metodología CART para la construcción de árboles de clasificación
y regresión.
Estudiar la técnica de agregación de árboles Random Forest.
Construir de forma efectiva estos modelos sobre varios conjuntos de datos
mediante la aplicación informática R.
En el capítulo 2 se presentan algunos conceptos básicos del Aprendizaje Estadístico
Supervisado. El capítulo 3 describe con detalle la metodología CART. El capítulo 4
incluye dos casos prácticos de construcción de árboles de clasificación con la ayuda de
9
la aplicación informática R. El capítulo 5 se dedica a los Bosques Aleatorios, que son
aplicados en el capítulo 6 a los mismos datos del capítulo 4, también con R. Finalmente,
se incluyen las referencias citadas en el texto.
10
2. Conceptos básicos del Aprendizaje Estadístico Supervisado
En este capítulo se presentan diversos aspectos relacionados con la evaluación de la
calidad de un modelo estadístico de predicción, ya sea de una variable cualitativa
(problema de clasificación) o una variable cuantitativa (problema de regresión).
Se supone que la construcción del modelo se realiza en un contexto de Aprendizaje
Supervisado (se dispone de un conjunto de datos donde se conocen tanto las variables
predictoras como la variable dependiente). Desde el punto de vista estadístico, el
conjunto de datos es una muestra aleatoria simple , y , i 1,2,..,nn i iT x donde ix
denota una realización del vector aleatorio que contiene las variables predictoras,
mientras que yi es una realización de la variable aleatoria objetivo Y, siendo n el
tamaño de la muestra disponible.
Se considera un modelo de predicción g X para predecir la variable dependiente 𝑌,
en este trabajo será un árbol de clasificación. En general, los modelos predictivos
dependen de un vector de coeficientes o parámetros que debe ser estimado de forma
apropiada. Por ejemplo, en Regresión Lineal Múltiple los coeficientes que definen la
combinación lineal de las variables predictoras se suelen estimar por mínimos
cuadrados. En general se tendrá una medida del error de predicción ,L Y g X .
Algunas medidas usuales cuando 𝑌 es cuantitativa (problemas de regresión) son el error
cuadrático 2
Y g X y el error absoluto Y g X . Para variables objetivo
categóricas (problemas de clasificación) las medidas más habituales son:
Función pérdida 0-1, definida como , 1L Y g X si la predicción g X es diferente
al valor real 𝑌, , 0 L Y g X si la predicción es correcta.
Función Log-Verosimilitud (también llamada Entropía Cruzada o Desviación), que se
define como sigue, siendo K el número de categorías de la variable Y:
1
1
2 log / 2 log ; max ˆ /ˆ ˆK
Yk K
k
I Y k P Y k X b P X g X P Y k X
donde 1I u si u es cierto, 0 en otro caso.
Definición. Dado un modelo de predicción g X , construido a partir de un conjunto de
dato , , 1,2,..,n i iT x y i n , se define el error empírico o error de entrenamiento
11
1
1 ( , )ˆ
n
n
T i i
i
V L y g xn
Sin embargo, la calidad del modelo construido depende de su capacidad de generalizar,
es decir, del rendimiento que cabe esperar ante nuevas observaciones de la población
estudiada.
Definición. Dado un modelo de predicción ( )g x , ajustado sobre un conjunto de
entrenamiento nT , se define el error de generalización
,
/ˆ,nT nX Y
Err E L Y g X T
El error empírico tiende a ser inferior al error de generalización, debido al uso de los
mismos datos para ajustar el modelo y para estimar el error, por lo que se dice que es un
estimador optimista del error de generalización. Por tanto, la estimación del rendimiento
de un modelo de predicción no puede efectuarse sobre la muestra de entrenamiento, ya
que la medida resultante es sesgada y no ofrece una estimación fiable de la capacidad de
generalización del modelo. Por tanto conviene disponer de otros mecanismos para
evaluar el rendimiento del modelo. Por ejemplo, disponer de otra muestra, llamada
muestra o conjunto test o de prueba, donde se evalúe el rendimiento. En general se
particiona el conjunto de datos en dos partes, una se dedica al ajuste del modelo, y se le
llama conjunto de entrenamiento. El modelo es posteriormente aplicado sobre el resto
de casos, que forman el conjunto test, obteniendo así una estimación insesgada del error
de generalización.
Otro aspecto práctico de gran importancia en el proceso de construcción de modelos de
predicción radica en la configuración apropiada del tamaño del modelo. De forma
general la mayoría de modelos del Aprendizaje Estadístico dependen de uno o más
parámetros que configuran el tamaño o complejidad del modelo resultante. Por ejemplo,
el tamaño de la capa oculta en un perceptrón multicapas o el número de nodos
terminales en un árbol de clasificación o regresión. No por aumentar la complejidad del
modelo se tendrá un mejor rendimiento esperado. De hecho, los modelos de gran
complejidad suelen presentar el problema del sobreajuste: el rendimiento es muy bueno
en la muestra de entrenamiento, pero muy pobre en la muestra test. Esta problemática
presente en la selección de la complejidad de un modelo también es conocida como el
dilema sesgo-varianza, el cual se ilustra a continuación.
Sea un modelo poblacional ( )Y f X con [ ] 0E , 2[ ]Var . Se considera un
modelo de predicción g X , que depende de un vector de parámetros 𝑤, estimados a
12
partir de una muestra de entrenamiento nT . Dado 0x , suponiendo el criterio error
cuadrático, el error esperado de predicción en 0x , es:
2
0 0 0ˆ / e x E Y g x X x
2 2
2
0 0 0 0 E g x f x E g x E g x
2 2
0 0 Sesgo g x Var g x
El primer término es un error irreducible, mientras que los términos cuadrado del sesgo
y varianza dependen de la complejidad del modelo.
A mayor complejidad del modelo, menor es el sesgo (más acertado es el valor medio de
la predicción), pero mayor es la varianza (lo que disminuye su fiabilidad).
A menor complejidad, mayor es el sesgo, pero a cambio se reduce la varianza.
Por tanto, no se pueden reducir simultáneamente ambos componentes del error de
predicción. La figura 2.1 describe el comportamiento del error de predicción en los
conjuntos de entrenamiento y test según la complejidad del modelo.
Figura 2.1 Ilustración del dilema sesgo-varianza. Elaboración propia
La figura 2.1 pone de manifiesto que lo ideal sería encontrar aquel punto donde se
produzca el mejor compromiso entre sesgo y varianza. Para ello no se puede realizar un
recorrido de valores sobre el parámetro de complejidad en el conjunto test, ya que en
ese caso el conjunto test también intervendría en el proceso de aprendizaje del modelo,
13
lo que invalidaría la fiabilidad del error test para estimar la capacidad de generalización
del modelo. En aquellos casos en los que se disponga de un conjunto de datos
suficientemente grande, lo recomendable (Hastie et al., 2009) es realizar una partición
aleatoria de la muestra disponible. La división ideal es la siguiente:
Conjunto de Entrenamiento: Se utiliza para ajustar los modelos.
Validación: Para determinar la complejidad del modelo.
Test: Se deja aparte y sólo se utiliza para estimar el error de generalización del modelo
finalmente seleccionado.
Tamaños usuales para los subconjuntos son 50%, 25%, 25%, y 60%, 20%, 20 %.
Si por ejemplo se va a construir un perceptrón multicapas con una capa oculta, se podría
realizar el siguiente algoritmo.
Para 1,2, ,h H construir un perceptrón multicapas con h nodos ocultos sobre el
conjunto de entrenamiento. Calcular el error de predicción de ese modelo sobre el
conjunto de validación.
Siguiente h. Elegir aquel valor de h que conduce al menor error en el conjunto de
validación, sea *h .
Finalmente, aplicar el modelo con *h nodos ocultos sobre el conjunto test, obteniendo
así una estimación insesgada del error de generalización (este modelo se puede ajustar
sobre la unión de los conjuntos de entrenamiento y validación).
Si la muestra disponible no es suficientemente grande, la anterior división puede
conducir a submuestras excesivamente pequeñas. Una alternativa es recurrir a
procedimientos de validación cruzada. La idea es aproximar la estimación que
proporciona el conjunto de validación mediante un proceso de remuestreo sobre el
conjunto de entrenamiento. Para ello se realiza k veces una partición del conjunto de
entrenamiento en dos partes: conjunto de estimación y conjunto de validación.
Dado un modelo con una determinada complejidad, para cada partición se ajusta el
modelo sobre el conjunto de estimación y se mide el error sobre el conjunto de
validación. La media de los k errores de validación proporciona una estimación del
error de validación para la complejidad considerada. La figura 2.2 ilustra este proceso.
Como caso particular, k=n conduce a la aplicación de una técnica de remuestreo
llamada Jackknife, también aparece el término LOO (“Leave One Out”).
También se puede utilizar este procedimiento para estimar el error de generalización, si
bien en este caso la complejidad ya estaría fijada previamente, por ejemplo mediante el
uso de criterios de información. Mientras mayor sea k, menor es el sesgo del estimador,
pero a cambio mayor será su varianza, y al contrario. Habitualmente, se toma k=10.
14
Figura 2.2. Ilustración del proceso de validación cruzada. Elaboración propia
Otro aspecto importante de la construcción de modelos predictivos es el cálculo de
medidas del rendimiento del modelo. Se presentan a continuación las medidas que se
utilizarán en este trabajo para evaluar la calidad de los modelos de clasificación binarios
(la variable respuesta presenta dos categorías).
Las dos categorías de la variable respuesta pueden ser representadas como valor
positivo y negativo. En general, la clase positiva es la clase de “más interés”, por
ejemplo en un modelo para detectar correos electrónicos “spam”, los ejemplos positivos
serían los correos “spam”. Al cruzar los valores reales de la variable respuesta con las
predicciones ofrecidas por el modelo, sobre un conjunto de datos como el conjunto test,
se obtiene una tabla de doble entrada como la visualizada en la tabla 2.1.
Tabla 2.1 Ejemplo de tabla resultante del cruce de una variable respuesta y las predicciones de un modelo.
Predicción
Ejemplo
Predicciones
positivas
Predicciones
negativas
Totales
Ejemplos
positivos
Verdaderos
Positivos
Falsos
Negativos
P
15
Ejemplos
negativos
Falsos
Positivos
Verdaderos
Negativos
N
Totales Total de
predicciones
positivas
Total de
predicciones
negativas
N
Elaboración propia
La precisión o tasa de acierto se define como la proporción de casos correctamente
clasificados.
La sensitividad o sensibilidad, también denominada tasa de verdaderos positivos, es la
proporción de ejemplos positivos correctamente clasificados.
La especificidad o tasa de verdaderos negativos, es la proporción de ejemplos negativos
correctamente clasificados.
VP VN
Precisiónn
VP
SensitividadP
1 1VN FP
Especificidad TFPN N
Usualmente las reglas de clasificación se basan en la estimación de la probabilidad de
una clase de interés dado el vector de predictores. Suponiendo dos clases etiquetadas 0 y
1, y dado un valor punto de corte pc, la regla se puede expresar como
1 1/
0
ˆ
ˆ 1/
c
c
si P x p
Y
si P x p
Por tanto para cada punto de corte se tiene una regla de clasificación distinta, por lo que
le corresponderá una sensitividad y especificidad. La representación gráfica de la
sensitividad frente a los valores 1-tasa de especificidad recibe el nombre de Curva
Operativa Característica (COR, ROC “Receiver Operating Characteristic ”). El área
bajo la curva (AUC “Area under the curve”) es una medida del rendimiento del modelo
base de clasificación, de modo que cuanto más cercano a 1 mejor será el modelo base.
La figura 2.3 presenta un ejemplo de curva ROC y su área asociada.
16
Figura 2.3. Ejemplo de curva COR. Elaboración propia
17
3. Árboles de clasificación
De entre las distintas metodologías existentes para construir árboles de clasificación, en
este trabajo se utiliza la metodología CART (Breiman, 1984). En los siguientes
apartados se describe detalladamente el proceso de construcción de los árboles de
clasificación.
3.1 Concepto y características de los árboles de clasificación
Entre las diversas metodologías existentes para construir árboles de clasificación y
regresión, este trabajo utiliza la metodología CART de Breiman (1984), y la
implementación que ofrece el paquete rpart de R (Therneau et al. 2017)
Sea Y una variable respuesta cualitativa con K clases, modalidades o grupos 1,..., KC C
y sea 1 ,..., pX X X , p variables predictoras. El problema consiste en establecer una
relación entre Y variables respuesta y las 1,..., pX X variables predictoras, es decir,
determinar una función objetivo f tal que 1 ,..., pY X X , de modo que dado un caso
o individuo éste se pueda asignar a una de las clases con el menor error posible. Por
tanto, lo que se investiga es la determinación de una regla de decisión con el mayor
grado de acierto posible.
Para abordar este problema se necesita un conjunto de datos, que se dividirán
aleatoriamente en dos conjuntos: una muestra de entrenamiento o aprendizaje y una
muestra test. La muestra de entrenamiento se usará para entrenar el modelo, es decir,
para obtener un método que clasifique a un nuevo individuo en alguna de las
modalidades o grupos de la variable respuesta, mientras que la muestra test se usará
para estimar la capacidad de generalización del modelo construido.
Considere una muestra de aprendizaje, L, dada por:
1 1 , ,..., ,n nL x y x y
donde 𝑥𝑖 representa un elemento de la realización muestral de X , 1 ,...,i Ky C C y n el
tamaño muestral de L. Las variables predictoras X pueden tener naturaleza cualitativa o
cuantitativa.
El método que se utiliza en el presente trabajo consiste en realizar una partición del
espacio muestral de las variables predictoras a través de la obtención de un conjunto de
reglas de decisión. Este conjunto de reglas se puede representar gráficamente mediante
una figura que representa un árbol. De ahí, la denominación que adoptan estos modelos.
18
El mecanismo de crecimiento de un árbol de clasificación se realiza mediante un
procedimiento de división binaria recursiva, el cual se explicará en apartados
posteriores. De esta forma se tendrá un conjunto de 𝑀 nodos terminales, asociados a
M regiones 1,..., MR R que constituyen una partición del espacio predictor, así que a
cada nodo (o región) se le asignará una de las clases con el objetivo de hacer una
predicción a partir de una observación dada.
Para el desarrollo del algoritmo de construcción, se presentan seguidamente varias
definiciones.
tn : Número de observaciones en el nodo t
( )n k : Número de observaciones pertenecientes a la clase , 1,2,kC k K .
k : 1, 2,..., :k K Probabilidades a priori, se definen como la probabilidad de que una
observación pertenezca a la clase k. Si son desconocidas, que es lo habitual, pueden ser
estimadas mediante las frecuencias relativas:
k
n k
n .
( )tn k : Número de observaciones de la clase kC pertenecientes al nodo t .
( )v X : Clase a la que pertenece un caso cuyo vector de variables predictoras es X.
:d t Decisión en el nodo t, para todo caso que pertenezca al nodo t.
3.2 Conceptos asociados al árbol
En este apartado se definen algunos conceptos relacionados con el árbol de clasificación
que serán de utilidad para el desarrollo del método.
– Probabilidad asociada al nodo : ,t p t Pr X t es la probabilidad de que una
observación se encuentre en el nodo t.
Si k son conocidas, se puede estimar mediante la expresión:
K
k 1
t
k
n kp t
n k
Si k son desconocidas, se utiliza como estimador:
K K
k 1 k 1
t t tn k n k n k n
p tn n k n n
19
Se puede observar que, en este caso, ( )p t es la proporción de casos del conjunto
de entrenamiento que pertenecen al nodo 𝑡.
– Probabilidad de la clase kC dado el nodo t: ( | ) Pr[ | ]P k t v X k X t , es
decir, la probabilidad de que un individuo pertenezca a la clase 𝐶𝑘 sabiendo que
está en el nodo t.
Si k son conocidas, se puede estimar mediante la expresión:
1
( | )
t
k
K t
kk
n k
n kP k t
n k
n k
Si 𝜋𝑘 son desconocidas, se utiliza como estimador:
1
( | )
K t
kt
t t
n k n k
n n k n kP k t
n n
n
Luego, en el último caso, ( | )P k t es la proporción de casos de entrenamiento
del nodo t que pertenece a la clase KC
En general, la regla de decisión en cada nodo viene definida por la clase más probable
en ese nodo. Es decir:
Cualquier caso perteneciente al nodo t es clasificado en la clase para la que se alcanza
el máximo de las probabilidades de las distintas clases:
1...( ) arg max ( | )k Kd t P k t
En caso de empate en las probabilidades, se elige aleatoriamente una de las clases de
máxima probabilidad.
El error de clasificación en el nodo t se puede medir a través la probabilidad de
clasificación incorrecta para el nodo t:
1 |r t P d t t
Este estadístico se conoce con el nombre de estimador por resustitución, y en general
representa la proporción de individuos del nodo t que no pertenecen a la clase ( )d t
Se define el riesgo del nodo t como:
20
R t p t r t
La definición anterior se puede extender al árbol completo, de modo que el riesgo del
árbol T se define como el estimador por resustitución de la tasa de error esperada del
árbol de clasificación. Suponiendo 𝑀 nodos finales:
1 1
M M
t t
R T p t r t R t
3.3 Elementos necesarios en el algoritmo de construcción
En el apartado anterior se han introducido los conceptos básicos de los árboles de
clasificación. A continuación, se va a definir los elementos necesarios para la
construcción del árbol.
a) Un conjunto Ω de preguntas binarias para hacer las divisiones.
b) Un criterio para evaluar la bondad de las divisiones.
c) Una regla de parada.
d) Una regla para asignar una clase a un nodo terminal.
a) Un conjunto Ω de preguntas binarias para hacer la división.
Inicialmente, en el nodo raíz se encuentran las n observaciones de la muestra de
aprendizaje. El método consiste en dividir el conjunto de entrenamiento en dos. Para
ello se necesita un conjunto de preguntas binarias Ω y seleccionar la más óptima. De
esta forma se tienen dos nodos descendientes, uno a la izquierda Lt y otro a la derecha
tR, que en función de la respuesta a la pregunta, nos decantaremos por uno u otro.
Cada una de las divisiones va a depender de una única variable, que en función de su
naturaleza, tendrán un número diferente de posibles divisiones, de modo que:
Variables binarias, son del tipo 1/0, Sí/No, etc. Sólo existiría una posible
división.
Variables cuantitativas u ordinales, existen infinitas divisiones del tipo:
x c c R
21
Aunque en principio existen infinitas divisiones de este tipo, se pueden
considerar una cantidad finita seleccionando los puntos medios entre dos
observaciones ordenadas de la muestra como posibles puntos de la división.
Variables nominales con B modalidades, las divisiones posibles son:
B B
2 B 1V R 2 2 2
2 12 2
Para seleccionar la división óptima en cada nodo la idea es encontrar la mejor
división. Para cada variable se compararían las p mejores divisiones de las
variables individuales y se selecciona la mejor entre todas ellas. Para todo ello
será necesario realizarlo según algún criterio que mida la bondad de las
divisiones.
b) Un criterio para evaluar la bondad de las divisiones.
Situados en el nodo t, una opción para elegir la mejor división sería seleccionar aquella
que produce una mayor reducción en el riesgo R T . Este criterio puede producir
árboles de bajo rendimiento, por tener muchos nodos finales. Por ello se introdujo el
término de funciones de impureza.
Una función impureza Φ se define en el conjunto de todas las K-tuplas de números (
1,..., kp p ) satisfaciendo 1
0, 1 , 1K
k k
k
p k K p
, con las propiedades:
Φ es un máximo sólo en el punto 1 1
, , K K
Φ logra su mínimo sólo en los puntos 1,0,..,0 , 0,1, ,0 , , 0,0, ,1
Φ es una función simétrica de 1 kp ,..., p
Dada una función de impureza Φ , se define la medida de impureza I t de cualquier
nodo t como:
( (1| ), (2 | ),..., ( | ))I t P t P t P K t
Situados en un nodo t, al realizar la división, una parte de los datos se asigna a la rama
derecha Rt con probabilidad RP t y otra a la rama izquierda Lt con probabilidad
LP t , de forma que, la disminución de la impureza en el nodo t es:
22
∆I(t)= P(t) I(t) – P( Rt ) I( Rt ) – P( Lt )I( Lt )≥0
.
Por tanto, para determinar la división del nodo t, se elegirá la división en la variable que
maximice la reducción de la impureza ∆I.
Existen numerosas funciones de impureza, pero las más habituales son el índice de
diversidad de Gini y la entropía.
– Índice de diversidad de Gini: Dado 1 k(p ,..., p ) se define el índice de diversidad
de Gini como:
2
1
1
, , 1 K
k k j k
k j k
p p p p p
– Entropía: Dado 1 k(p ,..., p ) se define su entropía como:
1
1
, , log( )k k k
k
p p p p
En el caso en que 0kp , se considera 0 log0 = 0.
Una vez realizadas todas las consideraciones, se procede a la construcción del
árbol de construcción.
Para ello, se deben seguir los siguientes pasos:
1. Determinar el nodo raíz, que incluye todos los individuos del conjunto de
entrenamiento.
2. Determinar el par ( , )s t donde s es (variable, división), es decir, la variable
y el punto por donde se realiza la división y t es el nodo donde la queremos
llevar a cabo.
3. Aplicar a cada nodo el paso anterior, hasta que se verifiquen las condiciones
de finalización, punto que vemos a continuación.
c) Una regla de parada
En el proceso de construcción del árbol se necesita un criterio que determine una regla
de parada. Esta regla marcará las condiciones que se tienen que cumplir para que un
nodo no se divida y por tanto sea terminal. En principio podría incluso lograrse un árbol
con un nodo final por cada observación, pero en tal caso se obtiene un modelo muy
23
complejo, que aunque tendría ( ) 0R T , su capacidad de generalización sería baja. En
este caso, se dice que el modelo está sobreajustado a los datos.
Algunos criterios de parada que se podrían considerar son:
1. Mínimo número de casos que debe haber en un nodo para intentar dividirlo
en dos nodos hijos.
2. Mínimo número de casos en un nodo terminal.
3. Las divisiones deben producir una reducción mínima de la función impureza.
Esto es, establecemos un umbral 0 , se declara un nodo terminal t si:
max s S ∆I (s,t) <
donde S es el conjunto de todos los pares (variable, división) que se han
realizado en el árbol.
Supóngase que se han realizado algunas divisiones y hemos llegado a un conjunto de
nodos terminales. El conjunto de divisiones usadas, junto al orden en que hemos hecho
las divisiones determina lo que llamamos un árbol binario T.
d) Una regla para asignar una clase a un nodo terminal
Por último, se requiere una regla de asignación. Para ello se seleccionará una clase que
verifique:
Si tx R se asigna a la clase dC t para la que se alcanza: 1
max ( | )k K
p k t
Para evitar los inconvenientes detectados en el método, tales como el excesivo tamaño
del árbol que conlleva que se ajusta muy bien a los datos con los que ha sido construido,
pero es ineficiente con un conjunto de datos nuevo, se introduce el concepto de poda del
árbol con idea de obtener un modelo mejor.
3.4 Poda del árbol (Pruning)
El tamaño del árbol (número de nodos terminales) es un parámetro que controla la
complejidad del modelo. Un árbol muy pequeño puede que no capture la estructura de
los datos y un árbol muy grande puede sobreajustarse a los datos.
24
Una vez construido un árbol 0T , según se describió en el apartado anterior, se procede a
la poda del mismo, cortando sucesivamente ramas o nodos terminales que representen
poco aporte a la explicación de la variable respuesta, encontrando así el tamaño
adecuado del árbol.
En primer lugar, hay que construir un árbol muy grande 0T permitiendo que el criterio
de división continúe hasta que la regla de parada del criterio de crecimiento del árbol
determine cuáles son los nodos terminales.
A continuación se procede a la poda que parte de un nodo 𝑡. La poda del árbol consiste
en eliminar de 0T todos los descendientes de dicho nodo, esto es, eliminar todo lo que
esté por debajo del nodo t, tal y, como se observa en la Figura 3.1; el árbol original 0T
es el de la izquierda y el árbol podado T el de la derecha. Si se alcanza un subárbol T a
partir de 0T por sucesivas podas de ramas, entonces T es llamado subárbol podado de
0T y denotado por 0 T T . Téngase en cuenta que 0T y T tienen el mismo nodo raíz.
Figura 3.1 Poda del árbol
3.4.1 Secuencia de subárboles
Debido a que un árbol se puede podar por cada uno de sus nodos de forma anidada,
existe una selección de subárboles con tamaño cada vez más pequeños. Una vez creada
la secuencia se tiene que seleccionar cuál es el mejor subárbol.
25
Para ello se define el criterio de coste-complejidad. Este criterio está basado en
considerar una secuencia de árboles indexada por un parámetro de ajuste 𝛼 no negativo.
A cada 𝛼 le corresponde un árbol T ⊆ 𝑇0 tal que:
0
, min , siendo , T T
C T C T C T R T T
donde T es el tamaño de T y R T el riesgo del árbol que podría sustituirse por la
función impureza según se use para la construcción del árbol.
El parámetro α controla el compromiso entre el tamaño del árbol y el ajuste a los
valores dados. Valores altos de α conducen a un tamaño de árbol pequeño y viceversa.
Para cada valor de α, se encuentran subárboles 0 T T que minimizan ,C T .
Cuando 0 , entonces el subárbol T será igual a 0T , pues el árbol coincide con el
inicial.
A pesar de que los valores de α son infinitos, el número de subárboles es finito y se
denotará por m. Esto es debido a que para el intervalo , 1h h el árbol óptimo es el
mismo. De hecho, se puede obtener una familia anidada de subárboles
h
hT y una
serie de valores 1 1 m tales que
h
T T para todo , 1 h h ,
1, 1. h m
3.4.2 Selección del árbol óptimo
Una vez generada la secuencia de subárboles, debe elegirse uno de ellos. A
continuación, se debe disponer de un estimador insesgado del error esperado de cada
subárbol.
El método anterior crea una secuencia decreciente de subárboles anidados
0 1 1 ,T T t donde 1 t es el nodo raíz, es decir, el mínimo subárbol posible de 0T .
El siguiente problema que se plantea consiste en la selección del árbol óptimo.
Para ello, se tiene que seleccionar un árbol de la secuencia que será el que finalmente se
usará para futuros estudios. Para ello, se asocia una medida de error a cada árbol y se
elige aquél que tenga asociado un menor error.
26
Se elige 0 0: min ,0k k k
T C T C T conC T C T
A continuación, por lo tanto se debe disponer de un estimador insesgado del error
(riesgo) esperado de cada subárbol. Este estimador se obtiene mediante validación
cruzada.
Para la construcción del estimador mediante validación cruzada de 𝑘 iteraciones (o k-
fold cross-validation), CVC T , se divide la muestra de aprendizaje L en 𝑘
subconjuntos.
Generalmente se considera el número de iteraciones k = 10, de modo que, para la
primera iteración, se entrena un modelo par k - 1 subconjuntos, dejando fuera el
primero, para posteriormente evaluarlo. Este proceso se lleva a cabo k veces. En la
Figura 3.2 se representa lo expresado anteriormente y representa un proceso de
validación cruzada de 10 iteraciones, en cada una de ellas el conjunto test (azul) va
cambiando y se realiza una estimación en cada caso. Finalmente, se hace una estimación
final ponderando cada una de las estimaciones.
Figura 3.2 Esquema de validación cruzada. Elaboración propia
Una vez que se tiene cada uno de los subconjuntos evaluados para las diferentes
iteraciones, se calcula la media de las 𝑘 medidas obtenidas a través de las iteraciones,
que denotaremos como CVC T . Es habitual utilizar este método cuando la muestra no
es lo suficientemente grande.
27
A pesar de las mejoras introducidas en la técnica, este algoritmo es muy inestable, es
decir, una pequeña variación en el conjunto de datos conlleva un árbol totalmente
distinto.
El estimador C T en función del número de nodos terminales | |
kT , se comporta,
como se observa en la figura 3.3, donde se distinguen tres zonas diferenciadas: un
decrecimiento inicial, a continuación una zona relativamente constante, y por último
crece para valores más elevados de | |
kT .
El método de validación cruzada tiene un riesgo debido a que la estimación se hace en
función del conjunto de entrenamiento. Para evitar la inestabilidad del estimador es
recomendable calibrar la incertidumbre de CVC T mediante el cálculo del error
estándar (SE). El error estándar asociado al estimador CVC T , viene dado por:
1
| |
CV
CV CV
T
C TSE C T C T
L
donde TL es el subconjunto de los datos de la muestra test utilizados para construir el
árbol T.
En la Figura 3.3, se aprecia que el valor mínimo es muy inestable. Una solución
alternativa es seleccionar 1 SE (1 - error estándar) con el objetivo de reducir esta
inestabilidad a la vez que se asegura que el árbol seleccionado sea el más simple con
valor cercano al mínimo. En la Figura 3.4 se observa que el mínimo de (CVC T ) se
alcanza en 0k . A partir del mismo, se calcula 0K
CVSE C T y se selecciona aquel
punto que esté por debajo de la recta de SE con el mínimo número de nodos posibles,
en este caso es 1k .
28
Figura 3.3 Estimador de 𝐶𝐶𝑉(𝑇) en función de los nodos terminales.
Figura 3.4 Estimador de 𝐶𝐶𝑉(𝑇) en función de los nodos terminales con el error estándar 𝑆𝐸
De modo que la regla 1- SE se formula de la siguiente manera:
Si 0K
T : 0K
CVC T = .minK
CVk
C T entonces se selecciona 1K
T con 1k tal que:
1k = max k: k
CVC T ≤ 0K
CVC T + SE ( CVC T )
29
Por tanto, se selecciona el árbol más simple, que será el que tenga menos nodos
terminales (el árbol de mayor subíndice) y que no se desvía más de 1 SE del mínimo.
3.5 Ventajas y desventajas de los árboles
Una vez visto el procedimiento de construcción del árbol se describen algunos aspectos
deseables y no deseables de los modelos.
Entre las características deseables se pueden identificar las siguientes:
• Puede ser aplicado para cualquier estructura de datos a través de una
formulación apropiada del conjunto de cuestiones Ω.
• La clasificación final tiene una forma simple que puede ser almacenada de
manera compacta y clasifica eficientemente nuevos datos.
• La selección de variables se hace paso a paso, automático y reduciendo el coste
de complejidad. Se busca nodo a nodo hasta conseguir la división más
significativa. En cada etapa se intenta extraer la información más relevante de la
parte del espacio que se está trabajando.
• Proporciona, no sólo una clasificación si no también una estimación de la
probabilidad de clasificar un objeto erróneamente.
• Una estructura de datos estandarizados es invariante bajo transformaciones
monótonas de las variables continuas.
• Es muy robusto respecto a los outliers y los puntos mal clasificados en L.
• Es muy fácil su interpretación.
• Los árboles de decisión toma decisiones muy cercanas a las que tomaría un
humano.
• Se pueden visualizar gráficamente.
• Pueden manejar fácilmente predictores cualitativos sin la necesidad de crear
variables ficticias y las posibles interacciones se incluyen automáticamente.
• En conjunto de datos grandes puede revelar estructuras complejas.
• Es una metodología no paramétrica.
30
Entre las características no deseables se pueden identificar las siguientes desventajas:
• Clasifica de manera aleatoria cuando tenemos valores perdidos.
• Aunque la optimalidad se aplique a cada división, esto no significa que el árbol
sea óptimo.
• Las variables predictoras continuas han de ser discretizadas.
• Es posible que las interacciones débiles se impongan a las más fuertes.
• Los árboles grandes tienen tendencias a sobreajustar a los datos.
• Son inestables, es decir, pequeños cambios en los datos iniciales pueden
producir árboles muy distintos.
31
4. Bosques aleatorios (“Random Forests”)
Como se ha indicado en el apartado anterior, una de las desventajas de los árboles de
clasificación es su alta inestabilidad. Las técnicas de agregación o combinación de
modelos, en especial el procedimiento bagging y los modelos de Bosques Aleatorios
(“Random Forests”) reducen considerablemente esa inestabilidad.
Las técnicas de combinación de modelos consisten en la agregación de cierto número de
modelos para obtener una clasificación o predicción a partir de los distintos
clasificadores o predictores previamente generados.
La construcción de cada uno de los modelos elementales puede depender de aspectos
como los siguientes:
• Definición del conjunto de entrenamiento (muestras bootstrap, reponderación).
• Selección de variables.
• Elección del modelo (por ejemplo, todos árboles de decisión, o una mezcla de
modelos de distinta naturaleza).
Los modelos Random Forests se basan en las técnicas bagging, que se presentan en
primer lugar. El término bagging viene de “Bootstrap aggregating”, la técnica fue
propuesta por Breiman (1996).
Un concepto fundamental en este contexto es el de muestra bootstrap. Una muestra
bootstrap es una muestra aleatoria de tamaño n extraída con reemplazamiento a partir de
la muestra disponible. A continuación se define el procedimiento bagging en problemas
de regresión y clasificación.
Sea un conjunto de datos , 1,2, , i i iD D X Y i n y un modelo de predicción
g x para /E Y X x , con X p-dimensional e Y real. Se define el predictor bagged
como el valor esperado del predictor evaluado sobre muestras bootstrap:
* * *
1ˆ ˆ ˆ ; , ,bag ng x E g x E g x D D
32
Este predictor requiere generar todas las muestras bootstrap posibles, lo cual puede ser
inviable en términos computacionales. En general se obtiene una aproximación
mediante la generación aleatoria de un número B de muestras bootstrap.
Algoritmo bagging (regresión)
Para 1, 2,..., b B
1. Generar una muestra bootstrap
2. Calcular * *
1ˆ ; , ,b b
ng x D D
3. Aproximar el predictor bagged mediante * *
, 1
1
ˆ ˆ1
; , ,B
b b
bag B n
b
g x g x D DB
En problemas de clasificación el clasificador agregado se calcula a partir de la votación
de los B clasificadores generados:
* *
1* * *
1
# ; , , , ,
ˆ
b b
n
k j
g x D D jg g g
B
*
, maxˆbag B j
jg x arg g
Una alternativa es trabajar con las estimaciones de las probabilidades, considerar para
cada clase la media de las B probabilidades así calculadas y tomar finalmente la clase de
máxima probabilidad media. En nuestro trabajo se considera la primera versión, y se
recomienda que el número B de muestras bootstrap sea al menos 100.
El bagging tiende a diminuir la varianza del predictor, sobre todo con modelos “poco
estables” como los árboles de decisión o las Redes de Neuronas Artificiales: Breiman
(1996).
ˆbagvar g x var g x
Como inconveniente presenta cierta tendencia a aumentar el sesgo cuadrado, pero no
impide la tendencia a la disminución del Error Cuadrático Medio.
33
La estructura de las muestras bootstrap permite obtener un estimador insesgado del error
de predicción aunque no se disponga de conjunto test. Este estimador, conocido como
estimador OOB (“Out Of Bag” ) se basa en el aprovechamiento de las observaciones no
incluidas en cada muestra bootstrap.
En un problema de clasificación con K clases, se obtiene de la siguiente forma:
Sea un conjunto de entrenamiento , , 1,2,..., ,i i iD D X Y i n donde las clases de
cada caso se identifican mediante las iY .
Algoritmo:
Para b=1 hasta B
1. Generar una muestra bootstrap 𝐷∗ del conjunto 𝐷.
2. Sea */ b i iD D D D D D *
2.1 Construir el modelo bA sobre *D
2.2 Aplicar bA a cada elemento de bD
3. Siguiente b
3.1 Para cada caso iD se consideran las predicciones para dicho caso
proporcionadas por aquellos modelos en cuyo conjunto de entrenamiento no
se incluye iD .
3.2 De forma similar al procedimiento de validación cruzada, se obtiene la
predicción agregada para iD mediante la clase donde más veces es clasificado
dicho caso por los modelos indicados en el párrafo anterior.
1,2, ,
arg max # / i b i i bj K
V A X j D D
4. Se define el estimador OOB : 1
1 n
i i
i
OOB I Y Vn
Por tanto la tasa de error OOB es la proporción de casos cuya clasificación más
frecuente no coincide con su clase real, entre los modelos ajustados sobre muestras
bootstrap que no lo incluyen.
34
Breiman (2001) propuso el algoritmo de los Bosques Aleatorios (Random Forests) a
partir del método bagging. En el paquete randomForests de R (Liaw y Wiener, 2002)
por defecto se construyen 500 árboles. La construcción de cada árbol, dado un conjunto
de entrenamiento de tamaño n con p variables predictoras, se realiza según las
siguientes indicaciones:
1. Seleccionar una muestra con reemplazamiento de tamaño n de la muestra
de entrenamiento (bootstrap)
2. En cada nodo del árbol construido en cada muestra bootstrap, se eligen
aleatoriamente m p variables predictoras, y se elige la mejor división
entre esas m variables.
3. Cada árbol se construye hasta alcanzar un tamaño razonablemente
grande, sin realizar poda.
En la librería randomForest de R por defecto, 1/2m p (problemas de clasificación) o
/ 3m p (problemas de regresión).
La tasa de error del modelo final depende de dos elementos:
– La correlación entre dos árboles cualesquiera del bosque. A mayor
correlación, menor error.
– La fuerza de cada árbol en el bosque. Un árbol con una tasa de error
reducida tasa de error es un clasificador fuerte. Aumentar la fuerza de los
árboles individuales disminuye la tasa de error del bosque
Reducir m reduce tanto la correlación como la fuerza, y viceversa. Este es el único
parámetro a ajustar respecto al cual Random Forests es sensible, puede ser ajustado con
la ayuda de procedimientos de validación cruzada.
A continuación, se detallan algunas de las ventajas de la aplicación de los modelos
Random Forests.
• Proporciona muy buenos resultados en los estudios empíricos.
• Se ejecuta de forma eficiente sobre grandes bases de datos.
• Puede tratar miles de variables sin tener que eliminar ninguna.
• Proporciona estimaciones de la importancia de cada variable.
35
• Genera internamente un estimador insesgado del error de generalización durante
el proceso de construcción (OOB).
• Dispone de un método efectivo de estimación de valores perdidos.
• Se calculan prototipos que dan información sobre la relación entre las variables
y la clasificación.
• Calcula proximidades entre pares de casos que pueden emplearse en análisis de
conglomerados, identificación de outliers, o escalamiento de los datos para
obtener representaciones gráficas.
Para finalizar este apartado se describe el algoritmo que sigue la técnica Random
Forests para cuantificar la importancia de cada variable.
Sean p variables predictoras
Para b=1 hasta B
1. Generar una muestra bootstrap * D del conjunto D
2. Sea */ b i iD D D D D D *
2.1 Construir el árbol bA sobre *D
2.2 Aplicar bA a cada elemento de bD
2.3 Calcular el número de clasificaciones correctas sobre los elementos de bD
# / b b i i i bC A X Y D D
3. Para j=1,2,..,p
3.1 Permutar aleatoriamente los valores de la variable j entre los casos del conjunto
bD
3.2 Calcular de nuevo el número de clasificaciones correctas sobre bD , sea jbC
3.3 Calcular jb b jbR C C
4. Siguiente j
Siguiente b
36
Calcular decrecimiento medio de la precisión para cada variable:
1
1 B
j jb
b
IM RB
Cada decrecimiento medio se divide por la desviación típica de las jbR .
También puede calcularse la medida anterior para cada variable y cada clase. Otra
medida de importancia se basa en el criterio de Gini: cada vez que una variable se elige
para dividir un nodo, el índice de Gini para los dos nodos hijos es menor que el del nodo
padre: la media de todos estos decrecimientos para cada variable es el decrecimiento
medio del índice de Gini.
37
5. Aplicación a una base de datos de microcréditos
5.1. Descripción de la base de datos
En esta primera aplicación se considera un conjunto de datos relativos a microcréditos
de una institución peruana de micro finanzas (EDPYME PROEMPRESA). La base de
datos contiene diversas características sobre microcréditos concedidos a empresas
durante el periodo 1997-2005. Tras eliminar los casos incompletos, el conjunto de
datos final contiene 5,451 casos, de los cuales, 2,673 (49,03%) son créditos exitosos
(los prestatarios pudieron devolver el importe prestado), mientras que 2,778 créditos
(50.97%) son créditos fallidos, entendiendo por tales aquellos créditos en los que se
produjo una demora en los pagos superior a los 15 días. Se realizó una partición
aleatoria del conjunto de datos en muestras de entrenamiento (75%, 4,088 casos) y test
(25%, 1,363 casos). Las tabla 5.1 y 5.2 recogen las 41 variables predictoras.
38
Tabla 5.1 Variables predictoras del conjunto de datos de microcréditos
VARIABLE Descripción
ZONA Lugar geográfico de la agencia o sucursal. Variable dicotómica (0)
Zona centro (1) Extrarradio
ANTIGUO Tiempo del prestatario como cliente de la entidad. Variable numérica
CRED_CONC Créditos concedidos con anterioridad. Variable numérica
CRED_CONC2 Créditos concedidos en el último año. Variable numérica
CRED_DENEG Créditos denegados con anterioridad. Variable numérica
SECTOR Sector de actividad de la microempresa. Variable categórica (0)
Comercio (1) Agricultura (2) Producción (3) Servicio
DEST_CRED Destino del microcrédito. Variable dicotómica (0) Capital de trabajo
(1) Activo Fijo
CLAS_ENT Clasificación del cliente. Variable dicotómica (0) Cliente normal (1)
Cliente con algún tipo de problema
CUOT_TOT Número total de cuotas pagadas en historial de crédito. Variable
numérica
CUOT_MORA Número de cuotas incurridas en morosidad. Variable numérica
MEDIA_MORA Promedio (días) de la morosidad del cliente. Variable numérica
MORA_MAYOR Número de días de la mayor mora del cliente. Variable numérica
SEXO Género del prestatario. Variable dicotómica. (0) Hombre, (1) Mujer
EDAD Edad en el momento de la solicitud del crédito. Variable numérica
E_CIVIL Estado Civil. Variable dicotómica. (0) Soltero, (1) Unidad Familiar
SIT_LAB Situación laboral del cliente. Variable dicotómica (0) Propietario (1)
Dependiente
R1 Rotación Activos = Ingresos Ventas / Total Activo
R2 Productividad = Utilidad Bruta / Costes Operativos
R3 Liquidez = Capacidad Pago / Total Activo
R4 Rotación Liquidez = Capacidad Pago / Ingresos Ventas x 360
R5 Dependencia o Endeudamiento = Total Pasivo / (Total Pasivo + Total
Patrimonio
39
Tabla 5.2 Variables predictoras del conjunto de datos de microcréditos (continuación)
VARIABLE Descripción
R6 Apalancamiento = Total Pasivo / Total Patrimonio
R7 ROA = Utilidad Neta / Total Activo
R8 ROE = Utilidad Neta / Total Patrimonio
GARANT Tipo de garantía aportada por el cliente. Variable dicotómica (0) Crédito Confianza
(1) Garantía real (aval, prenda, hipoteca, etc.)
MONEDA Tipo de moneda en la que se concede el crédito. Variable dicotómica (0) Nuevos
Soles (1) US $
MONTO Importe del microcrédito. Variable numérica
MONTO_RECH Cantidad rechazada por la institución. Variable numérica
DURACION Número de cuotas mensuales del microcrédito solicitado. Variable numérica
INT_MENS Tasa de interés mensual del microcrédito. Variable numérica
VTOCRED_SBS Pronóstico del analista sobre la situación del crédito a su vencimiento. Variable
dicotómica (0) Vigentes (1) Con problemas estimados
PIB Tasa de variación anualizada del Producto Interior Bruto durante la vigencia del
crédito. Variable numérica IPC Tasa de variación anualizada del Índice de Precios al Consumidor durante la
vigencia del crédito. Variable numérica
IE Tasa de variación anualizada del Índice de Empleo durante la vigencia del crédito.
Variable numérica
TC Tasa de variación anualizada de la Tasa de Cambio durante la vigencia del crédito.
Variable numérica
ti Tasa de variación anualizada de los tipos de interés durante la vigencia del crédito.
variable numérica
igb Tasa de variación anualizada del índice general bursátil durante la vigencia del
crédito. variable numérica
agua Tasa de variación anualizada de la tarifa municipal de agua durante la vigencia del
crédito. variable numérica
luz Tasa de variación anualizada de la tarifa municipal de la luz durante la vigencia del
crédito. variable numérica
tfno Tasa de variación anualizada de la tarifa del teléfono durante la vigencia del
crédito. variable numérica
40
5.2. Lectura y preparación de los datos con R
Lectura del conjunto de datos
datos=read.table(file="Microcreditos.txt",header=TRUE) dim(datos)
## [1] 5451 42
Convertir las variables categóricas al tipo factor y definición de sus niveles
datos$Y=factor(datos$Y) levels(datos$Y)=c("Bueno","Fallido") datos$SEXO=factor(datos$SEXO) levels(datos$SEXO)=c("Hombre","Mujer") datos$E_CIVIL=factor(datos$E_CIVIL) levels(datos$E_CIVIL)=c("Soltero","Unidad familiar") datos$ZONA=factor(datos$ZONA) levels(datos$ZONA)=c("Centro","Extrarradio") datos$SECTOR=factor(datos$SECTOR) levels(datos$SECTOR)=c("Comercio","Agricultura", "Producción","Servicios") datos$DEST_CRED=factor(datos$DEST_CRED) levels(datos$DEST_CRED)=c("Capital de trabajo", "Activo fijo") datos$CLAS_ENT=factor(datos$CLAS_ENT) levels(datos$CLAS_ENT)=c("Cliente Normal", "Cliente problemático") datos$SIT_LAB=factor(datos$SIT_LAB) levels(datos$SIT_LAB)=c("Propietario","Dependiente") datos$GARANT=factor(datos$GARANT) levels(datos$GARANT)=c("Crédito confianza", "Garantía real") datos$MONEDA=factor(datos$MONEDA) levels(datos$MONEDA)=c("Nuevos Soles","Dólar USA") datos$VTOCRED_SBS=factor(datos$VTOCRED_SBS) levels(datos$VTOCRED_SBS)=c("Vigente","Con problemas estimados")
Posiciones de las variables del tipo factor
listafac=c(1,2,4,6,7:9,25,27,32,33)
Resumen de las variables numéricas
Resulnum=t(apply(datos[,-listafac],2,quantile)) colnames(Resulnum)=c("Mínimo","Q1","Mediana", "Q3","Máximo") round(Resulnum,2)
## Mínimo Q1 Mediana Q3 Máximo ## EDAD 17.95 34.92 42.24 49.95 74.90 ## ANTIGUO 0.16 1.09 2.00 3.07 6.96 ## R1 0.00 0.31 0.56 0.96 6.33 ## R2 -278.27 1.96 2.84 4.51 126.91
41
## R3 0.00 0.03 0.05 0.09 167.73 ## R4 0.00 0.06 0.09 0.15 102.36 ## R5 0.00 0.00 0.07 0.22 0.66 ## R6 0.00 0.00 0.08 0.28 1.92 ## R7 -8.26 0.06 0.11 0.19 2.49 ## R8 -8.26 0.07 0.13 0.22 2.49 ## CRED_DENEG 0.00 0.00 0.00 1.00 3.00 ## CRED_CONC 1.00 2.00 4.00 7.00 33.00 ## CRED_CONC2 1.00 2.00 3.00 5.00 14.00 ## CUOTAS_TOT 1.00 15.00 28.00 46.00 191.00 ## CUOT_MORA 1.00 5.00 10.00 19.00 58.00 ## MEDIA_MORA 1.00 3.00 5.14 9.43 56.00 ## MORA_MAYOR 1.00 4.50 10.00 22.50 289.00 ## TIPO_OPER 0.00 0.00 0.00 0.00 1.00 ## MONTO 0.06 0.29 0.46 0.87 3.90 ## MONTO_RECH -1.37 0.00 0.00 0.15 8.00 ## DURACION 1.00 5.00 8.00 12.00 21.00 ## INT_MENS 1.80 4.50 5.25 5.75 6.00 ## PIB -107.42 0.17 6.76 13.90 88.13 ## IPC -2.82 1.49 2.20 4.07 13.03 ## IE -43.30 0.93 4.01 7.49 37.41 ## TC -16.01 -6.66 -4.51 -0.49 6.14 ## TI -17.82 1.57 8.36 13.88 75.44 ## IGB -82.21 30.15 46.82 60.50 180.22 ## AGUA 0.00 0.00 3.00 4.50 36.04 ## LUZ -25.75 0.03 4.95 10.51 84.12 ## TFNO -42.29 -8.69 -0.69 0.00 0.00
Tablas de frecuencias de las variables categóricas
apply(datos[,listafac],2,table)
## $Y ## ## Bueno Fallido ## 2673 2778 ## ## $SEXO ## ## Hombre Mujer ## 2280 3171 ## ## $E_CIVIL ## ## Soltero Unidad familiar ## 1565 3886 ## ## $ZONA ## ## Centro Extrarradio ## 2987 2464 ## ## $CLAS_ENT ##
42
## Cliente Normal Cliente problemático ## 4191 1260 ## ## $SECTOR ## ## Agricultura Comercio Producción Servicios ## 674 3812 466 499 ## ## $SIT_LAB ## ## Dependiente Propietario ## 41 5410 ## ## $DEST_CRED ## ## Activo fijo Capital de trabajo ## 698 4753 ## ## $MONEDA ## ## Dólar USA Nuevos Soles ## 523 4928 ## ## $GARANT ## ## Crédito confianza Garantía real ## 2718 2733 ## ## $VTOCRED_SBS ## ## Con problemas estimados Vigente ## 805 4646
Partición de los datos en conjuntos de entrenamiento y test
n=nrow(datos) ient=sample(1:n,floor(n*0.75)) entre=datos[ient,] test=datos[-ient,] dim(entre)
## [1] 4088 42
dim(test)
## [1] 1363 42
Almacenar en formato R los conjuntos de entrenamiento y test
save(entre,test,file="Microcreditos.RData")
43
5.3. Construcción de un árbol de clasificación
Cargar las librerías necesarias
library(rpart)
library(rpart.plot)
library(ROCR)
Lectura de los datos de entrenamiento y test
load(file="Microcreditos.RData") dim(entre)
## [1] 4088 42
dim(test)
## [1] 1363 42
Conversión de la variable respuesta a tipo factor y definición de los niveles
entre$Y=factor(entre$Y) test$Y=factor(test$Y) levels(entre$Y)=c("Bueno","Fallido") levels(test$Y)=c("Bueno","Fallido") table(entre$Y)
## ## Bueno Fallido ## 2028 2060
table(test$Y)
## ## Bueno Fallido ## 645 718
table(entre$Y)+table(test$Y)
## ## Bueno Fallido ## 2673 2778
Construir primero un árbol de clasificación suficientemente grande
set.seed(12345) impagos.rpart <- rpart(Y ~ ., data=entre,cp=0.001)
Lista de subárboles y rendimiento de cada uno (empírico y mediante validación cruzada),también se muestra una representación gráfica donde la línea de puntos es el mínimo de los errores de validación cruzada más su desviación típica
printcp(impagos.rpart,digits=3)
## ## Classification tree:
44
## rpart(formula = Y ~ ., data = entre, cp = 0.001) ## ## Variables actually used in tree construction: ## [1] ANTIGUO CLAS_ENT CRED_CONC2 CUOT_MORA DURACION ## [6] GARANT IGB INT_MENS IPC LUZ ## [11] MEDIA_MORA MONTO MORA_MAYOR R2 R3 ## [16] R5 R7 R8 SEXO TC ## [21] TFNO VTOCRED_SBS ## ## Root node error: 2028/4088 = 0.496 ## ## n= 4088 ## ## CP nsplit rel error xerror xstd ## 1 0.47830 0 1.000 1.043 0.0158 ## 2 0.19034 1 0.522 0.522 0.0138 ## 3 0.02860 2 0.331 0.331 0.0117 ## 4 0.02318 3 0.303 0.327 0.0116 ## 5 0.01282 4 0.280 0.283 0.0109 ## 6 0.01036 5 0.267 0.283 0.0109 ## 7 0.00690 6 0.256 0.280 0.0109 ## 8 0.00321 7 0.250 0.266 0.0107 ## 9 0.00271 9 0.243 0.276 0.0108 ## 10 0.00247 11 0.238 0.276 0.0108 ## 11 0.00222 13 0.233 0.272 0.0108 ## 12 0.00197 20 0.214 0.274 0.0108 ## 13 0.00148 27 0.195 0.273 0.0108 ## 14 0.00131 31 0.189 0.272 0.0108 ## 15 0.00123 34 0.185 0.276 0.0108 ## 16 0.00115 36 0.183 0.277 0.0109 ## 17 0.00100 40 0.178 0.279 0.0109
plotcp(impagos.rpart,col="blue")
45
Tabla visualizada con printcp
cptabla<- impagos.rpart$cptable
Calcular Minx1ES=Min(xerror)+1xstd, necesario para la regla 1-SE
Minx1ES<- min(cptabla[,4])+cptabla[which.min(cptabla[,4]),5] Minx1ES
## [1] 0.2769471
Identificar el CP del árbol lo más pequeño posible pero con xerror<Minx1ES. Este cp se utilizará en la función prune.rpart
indicp<- 1:nrow(cptabla) cprecorte<- cptabla[indicp[cptabla[,4]<Minx1ES][1],1] cprecorte
## [1] 0.003205128
Recorte del árbol con prune.rpart
impagos.rpart2<-prune.rpart(impagos.rpart,cp=cprecorte)
Descripción detallada del árbol recortado
Para cada nodo se muestra:
• número asociado del nodo
• condición que cumple los casos que pertenecen a ese nodo
• número de casos de ese nodo
46
• número de casos incorrectamente clasificados con la regla de decisión asociada al nodo
• probabilidad de cada clase condicionada a ese nodo
El asterisco indica que es un nodo terminal
impagos.rpart2
## n= 4088 ## ## node), split, n, loss, yval, (yprob) ## * denotes terminal node ## ## 1) root 4088 2028 Fallido (0.49608611 0.50391389) ## 2) TFNO>=-5.719583 2876 953 Bueno (0.66863700 0.33136300) ## 4) VTOCRED_SBS=Vigente 2460 552 Bueno (0.77560976 0.22439024) ## 8) DURACION>=2.5 1898 242 Bueno (0.87249737 0.12750263) * ## 9) DURACION< 2.5 562 252 Fallido (0.44839858 0.55160142) ## 18) CLAS_ENT=Cliente problemático 47 0 Bueno (1.00000000 0.00000000) * ## 19) CLAS_ENT=Cliente Normal 515 205 Fallido (0.39805825 0.60194175) ## 38) TC< -7.08382 114 44 Bueno (0.61403509 0.38596491) * ## 39) TC>=-7.08382 401 135 Fallido (0.33665835 0.66334165) * ## 5) VTOCRED_SBS=Con problemas estimados 416 15 Fallido (0.03605769 0.96394231) * ## 3) TFNO< -5.719583 1212 105 Fallido (0.08663366 0.91336634) ## 6) IPC< 1.015445 115 47 Bueno (0.59130435 0.40869565) * ## 7) IPC>=1.015445 1097 37 Fallido (0.03372835 0.96627165) ## 14) LUZ>=13.44726 32 9 Bueno (0.71875000 0.28125000) * ## 15) LUZ< 13.44726 1065 14 Fallido (0.01314554 0.98685446) *
Representación gráfica del árbol recortado
rpart.plot(impagos.rpart2,fallen.leaves=FALSE,cex=0.7)
47
Una animación que reproduce el proceso de construcción del árbol
tree1 <- impagos.rpart2 for(iframe in 1:nrow(tree1$frame)) cols <- ifelse(1:nrow(tree1$frame) <= iframe, "black", "gray") prp(tree1, col=cols, branch.col=cols, split.col=cols) Sys.sleep(0.5)
48
49
50
51
52
53
54
55
La siguiente función permite generar las distintas reglas de clasificación
list.rules.rpart <- function(model) if (!inherits(model, "rpart")) stop("No es un objeto rpart") frm <- model$frame names <- row.names(frm) ylevels <- attr(model, "ylevels")
56
ds.size <- model$frame[1,]$n numreglas=0 for (i in 1:nrow(frm)) if (frm[i,1] == "<leaf>") #Nodos terminales numreglas=numreglas+1 cat("\n") cat(sprintf(" Regla número: %s (nodo %s) ", numreglas,names[i])) cat(sprintf("[yval=%s cover=%d (%.0f%%) prob=%0.2f]\n", ylevels[frm[i,]$yval], frm[i,]$n, round(100*frm[i,]$n/ds.size), frm[i,]$yval2[,5])) pth <- path.rpart(model, nodes=as.numeric(names[i]), print.it=FALSE) cat(sprintf(" %s\n", unlist(pth)[-1]), sep="") list.rules.rpart(impagos.rpart2)
## ## Regla número: 1 (nodo 8) [yval=Bueno cover=1898 (46%) prob=0.13] ## TFNO>=-5.72 ## VTOCRED_SBS=Vigente ## DURACION>=2.5 ## ## Regla número: 2 (nodo 18) [yval=Bueno cover=47 (1%) prob=0.00] ## TFNO>=-5.72 ## VTOCRED_SBS=Vigente ## DURACION< 2.5 ## CLAS_ENT=Cliente problemático ## ## Regla número: 3 (nodo 38) [yval=Bueno cover=114 (3%) prob=0.39] ## TFNO>=-5.72 ## VTOCRED_SBS=Vigente ## DURACION< 2.5 ## CLAS_ENT=Cliente Normal ## TC< -7.084 ## ## Regla número: 4 (nodo 39) [yval=Fallido cover=401 (10%) prob=0.66] ## TFNO>=-5.72 ## VTOCRED_SBS=Vigente ## DURACION< 2.5 ## CLAS_ENT=Cliente Normal ## TC>=-7.084 ## ## Regla número: 5 (nodo 5) [yval=Fallido cover=416 (10%) prob=0.96] ## TFNO>=-5.72 ## VTOCRED_SBS=Con problemas estimados ## ## Regla número: 6 (nodo 6) [yval=Bueno cover=115 (3%) prob=0.41] ## TFNO< -5.72 ## IPC< 1.015
57
## ## Regla número: 7 (nodo 14) [yval=Bueno cover=32 (1%) prob=0.28] ## TFNO< -5.72 ## IPC>=1.015 ## LUZ>=13.45 ## ## Regla número: 8 (nodo 15) [yval=Fallido cover=1065 (26%) prob=0.99] ## TFNO< -5.72 ## IPC>=1.015 ## LUZ< 13.45
Aplicación del modelo sobre el conjunto test, donde se calcula el porcentaje de acierto global, la sensitividad y la especificidad
La sensitividad indica el acierto en la clase de los créditos fallidos.
La especificidad indica el acierto en la clase de los créditos buenos.
confutest<-table(Real=test$Y, Predic=predict(impagos.rpart2,test, type="class")) confutest
## Predic ## Real Bueno Fallido ## Bueno 598 47 ## Fallido 123 595
100*sum(diag(prop.table(confutest)))
## [1] 87.52751
100*diag(prop.table(confutest,1))
## Bueno Fallido ## 92.71318 82.86908
Obtención de la Curva COR en el conjunto test
probabi<- predict(impagos.rpart2,test,type="prob")[,2] prediobj<-prediction(probabi,test$Y) plot(performance(prediobj, "tpr","fpr"),main="CURVA COR TEST. CART") abline(a=0,b=1,col="blue",lty=2)
58
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.9122109
5.4. Construcción de un modelo Bosque Aleatorio
Cargar las librerías necesarias
library(randomForest)
library(ROCR)
Lectura de los datos de entrenamiento y test
load(file="Microcreditos.RData") dim(entre)
## [1] 4088 42
dim(test)
## [1] 1363 42
Con tuneRF se determina el valor de m para el modelo Random Forest, sugiere m=6 (valor por defecto en este caso)
59
set.seed(12345) rf.tune <- tuneRF(x=entre[,-1],y=entre[,1], stepFactor=1.5,plot=TRUE, doBest=TRUE)
## mtry = 6 OOB error = 12.87% ## Searching left ... ## mtry = 4 OOB error = 13.11% ## -0.01901141 0.05 ## Searching right ... ## mtry = 9 OOB error = 13.04% ## -0.01330798 0.05
Modelo Random Forest con m=6
t0<-proc.time()
rf <- randomForest(Y ~ .,data=entre,mtry=6, proximity=FALSE,importance=TRUE, do.trace=TRUE)
## ntree OOB 1 2 ## 1: 19.49% 18.94% 20.03% ## 2: 19.81% 18.80% 20.79% ……………………………………………………… ## 499: 12.28% 8.38% 16.12% ## 500: 12.23% 8.33% 16.07%
t1<-proc.time()
Tiempo empleado en la construcción del modelo
t1-t0
60
## elapsed ## 13.08
Resumen del modelo
Incluye los estimadores OOB de la tasa de error global y para cada clase
rf
## ## Call: ## randomForest(formula = Y ~ ., data = entre, mtry = 6, proximity = FALSE, importance = TRUE, do.trace = TRUE) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 6 ## ## OOB estimate of error rate: 12.23% ## Confusion matrix: ## Bueno Fallido class.error ## Bueno 1859 169 0.08333333 ## Fallido 331 1729 0.16067961
Representación gráfica de la evolución de los errores OOB en función del número de árboles
plot(rf) legend("topleft",col=1:3,lty=1:3, legend=c("OOB",levels(entre$Y)),cex=0.7) grid()
61
Medidas de importancia de las variables
round(importance(rf),2)
## Bueno Fallido MeanDecreaseAccuracy MeanDecreaseGini ## SEXO -0.25 3.51 2.05 4.79 ## EDAD 1.91 2.12 2.90 36.57 ## E_CIVIL 1.14 0.16 1.02 4.16 ## ANTIGUO 10.11 6.82 13.29 39.77 ## ZONA 5.96 1.62 5.79 5.33 ## CLAS_ENT 43.36 26.21 39.22 125.65 ## SECTOR 5.94 3.40 7.01 12.95 ## SIT_LAB 1.69 -0.99 0.90 0.17 ## R1 7.74 3.70 8.87 34.28 ## R2 3.91 1.74 4.28 36.90 ## R3 12.74 0.97 12.67 35.77 ## R4 7.64 -0.13 6.19 39.13 ## R5 9.34 1.54 9.17 28.01 ## R6 10.61 0.12 9.58 28.43 ## R7 9.66 2.12 10.49 34.91 ## R8 9.66 3.49 11.00 34.53 ## CRED_DENEG 1.50 -0.36 1.01 6.38 ## CRED_CONC 8.76 4.80 11.10 25.85 ## CRED_CONC2 9.58 8.74 13.99 56.85 ## CUOTAS_TOT 12.27 6.54 14.78 36.21 ## CUOT_MORA 14.64 3.38 15.62 37.21 ## MEDIA_MORA 9.27 4.29 11.02 37.50 ## MORA_MAYOR 8.96 2.02 9.45 34.21 ## DEST_CRED 6.23 2.94 6.34 7.02 ## TIPO_OPER 0.93 0.12 0.90 3.64 ## MONEDA 0.35 -1.55 -0.71 1.54 ## MONTO 12.26 5.04 12.62 40.95 ## MONTO_RECH -0.17 3.68 2.36 19.34 ## DURACION 24.57 20.88 30.71 69.20 ## INT_MENS 12.70 10.81 15.85 39.92 ## GARANT 10.03 8.24 12.31 13.05 ## VTOCRED_SBS 62.72 69.00 73.61 241.01 ## PIB 17.60 14.07 20.88 51.21 ## IPC 16.27 16.03 20.18 72.20 ## IE 15.40 12.72 18.41 52.95 ## TC 22.32 18.33 24.76 108.69 ## TI 22.07 16.79 25.81 116.63 ## IGB 13.93 11.71 16.94 39.70 ## AGUA 15.14 9.84 16.80 30.08 ## LUZ 25.21 22.60 28.77 156.79 ## TFNO 45.00 27.15 41.96 243.46
Aplicación del modelo sobre el conjunto test, donde se calcula el porcentaje de acierto global, la sensitividad y la especificidad
La sensitividad indica el acierto en la clase de los créditos fallidos
La especificidad indica el acierto en la clase de los créditos buenos
62
confutest<-table(Real=test$Y, Predic=predict(rf,test)) confutest
## Predic ## Real Bueno Fallido ## Bueno 603 42 ## Fallido 124 594
100*sum(diag(prop.table(confutest)))
## [1] 87.82098
100*diag(prop.table(confutest,1))
## Bueno Fallido ## 93.48837 82.72981
Obtención de la Curva COR en el conjunto test
probabi<- predict(rf, test,"prob")[,2] prediobj<-prediction(probabi,test$Y) plot(performance(prediobj, "tpr","fpr"),main="CURVA COR TEST. RF") abline(a=0,b=1,col="blue",lty=2)
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.939482
63
6. Aplicación a una base de datos de créditos concedidos en Alemania
a personas físicas.
6.1 Descripción de la base de datos
En esta aplicación se considera un conjunto de datos disponible en la “UCI Machine
Learning Repository”, denominado “German credit data”, (Lichman, 2013). Los
modelos se han construido sobre una versión de los datos ya disponible en R, en
concreto en el paquete evtree (Grubinger et al., 2014). Se trata de una base de datos
que contiene datos relativos a créditos concedidos a personas. Dichos créditos se han
clasificado en dos categorías, no fallidos (“buenos”) y malos, según que el
solicitante haya tenido o no la capacidad para responder con solvencia. El conjunto
de datos contiene 1,000 observaciones y 21 variables. De los 1,000 casos, 700 son
“buenos”, mientras que 300 son “malos”, por lo que este es un claro ejemplo de
problema de clasificación no balanceada, que requiere aplicar técnicas específicas
que se describen en el siguiente apartado.
A continuación, se presenta una lista de las variables de la base de datos, junto a sus
respectivas definiciones.
64
Tabla 5.3 Variables predictoras del conjunto de datos GermanCredit
VARIABLE Descripción
STATUS
Variable que indica el estado de la cuenta corriente del solicitante
del crédito. Se divide en varias categorías en función del rango de
dinero ahorrado al que pertenezca la cuenta.
DURATION Duración del crédito en meses.Se muestra el mínimo, la media, la
mediana, el máximo, el primer cuartil y el tercer cuartil.
CREDIT_HISTORY
Indica el historial del solicitante. Se divide en categorías entre ellas si
el solicitante tiene pendiente a devolver otros créditos o si ha
cumplido en el pago de sus créditos anteriores.
PURPOSE Indica el fin del crédito solicitado. Entre otros la compra de: coche,
casa o electrodomésticos.
AMOUNT Cantidad de dinero solicitada. Se muestra el mínimo, máximo,
mediana, primer y tercer cuartil.
SAVINGS
Cantidad de dinero ahorrada. Se divide en varias categorías en
función del rango de dinero ahorrado al que pertenezca la cuenta.
Producción (3) Servicio EMPLOYMENT_DURATION
Tiempo que lleva el solicitante en su empleo actual. Se divide en
diversas categorías en función del solicitante está en paro o de si lleva
más o menos de 4/ 7 años en su empleo.
INSTALLMENT_RATE Cuota mensual. Se muestra el mínimo, el máximo, la media, la
mediana, el primer y tercer cuartil.
PERSONAL_STATUS_SEX Indica el estado civil y el sexo del solicitante del crédito.
OTHER_DEBTORS
Indica si el solicitante tiene pendiente otras deudas ya sea como
titular o como avalista.
PRESENT_RESIDENCE Tiempo que lleva el solicitante viviendo en su residencia actual.
PROPERTY
Propiedad del cliente con más valor. Entre otros coche, seguro de
vida o no aplica.
AGE Edad del cliente. Se recoge el mínimo, el máximo, la media, la
mediana el primer y tercer cuartil.
OTHER_INSTALLMENT_PL
ANS
Indica si el solicitante tiene deudas pendiente de pago y si esa deuda
es con una tienda o con un banco.
HOUSING Indica el estado del hogar del solicitante del crédito. Puede tomar los
siguientes valores: propia, alquilada o gratis.
NUMBER_CREDITS
Número de créditos concedidos en el presente del solicitante. Se
muestra el mínimo, el máximo, la media, la mediana, el primer y
tercer cuartil.
65
Tabla 5.4 Variables predictoras del conjunto de datos GermanCredit (continuación)
VARIABLE Descripción
PEOPLE_LIABLE
Número de personas que dependen económicamente del
solicitante.
TELEPHONE Variable binaria que indica si el solicitante tiene número de
teléfono. Toma el valor SI o NO.
FOREIGN_WORKER
Variable binaria que indica si el solicitante es un trabajador
extranjero. Toma el valor SI o NO.
CREDIT_RISK Variable binaria que indica el riesgo del crédito. Es la variable
predictora. Determina si el crédito es bueno o malo.
JOB Condición laboral del solicitante. Se clasifica en función de si es
residente o no, parado o empleado y cualificado o no.
6.2 Tratamiento de datos no balanceados
Se habla de clasificación con datos no balanceados cuando una o más clases de la
variable respuesta se presenta en el conjunto de entrenamiento en proporciones muy
inferiores a las del resto de categorías.
La construcción directa de modelos de clasificación sobre estos datos suele conllevar
bajas tasas de acierto sobre las clases minoritarias, e incluso valores bajos para el
coeficiente AUC en problemas de clasificación binaria.
Dentro de las estrategias existentes para tratar el problema de los datos no balanceados,
en este trabajo se han considerado dos familias de técnicas: Métodos de muestreo y
umbrales de decisión alternativos.
Métodos de muestreo:
Dentro de este tipo de procedimientos, se han aplicado los dos siguientes:
66
• Muestreo en la clase mayoritaria
• Remuestreo en la clase minoritaria
Sean n y N, respectivamente, los totales de casos en las clases minoritarias y
mayoritarias (se supone clasificación binaria) en el conjunto de entrenamiento.
Muestreo en la clase mayoritaria (“Downsampling”):
Se genera un conjunto de datos balanceado de tamaño 2n formado por:
1. Los n casos de la clase minoritaria.
2. Una selección aleatoria de n casos entre los N de la clase mayoritaria.
Remuestreo en la clase minoritaria (“Upsampling”):
Se genera un conjunto de datos balanceado de tamaño 2N formado por:
1. Los N casos de la clase mayoritaria.
2. Una muestra aleatoria con reemplazamiento de tamaño N (lo que se conoce
como muestra bootstrap) extraída del conjunto de los n casos de la clase
minoritaria.
Umbrales de decisión alternativos
Otro método para el tratamiento de datos no balanceados consiste en utilizar umbrales
de decisión alternativos. Las reglas de clasificación binaria como las que proporcionan
CART o Random Forest se pueden definir mediante una expresión donde se compara la
probabilidad estimada de pertenecer a la clase de interés con un punto de corte pc, que
suele ser 0.5 (capítulo 2 de esta memoria). La idea es utilizar otros puntos de corte que
conduzcan a mayores valores para el acierto en la clase minoritaria (en general este
acierto es la sensitividad). La búsqueda del punto de corte no puede efectuarse
directamente sobre el conjunto de entrenamiento, ya que sesgaría las estimaciones de la
capacidad de generalización, por lo que conviene particionar el conjunto de
entrenamiento, para utilizar los que se llama conjunto de validación. El modelo se
construye en los casos distintos al conjunto de validación, y se aplica posteriormente al
conjunto de validación, donde se construye la curva COR. A continuación se trata de
identificar un punto apropiado en dicha gráfica, cuyo umbral de decisión asociado será
utilizado para definir la regla de clasificación alternativa.
En la librería pROC de R (Robin et al., 2011), se dispone de la función coords, que se
puede utilizar para identificar el punto de corte con dos criterios.
67
La opción best.method="closest.topleft" busca el umbral con rendimiento más cercano
al vértice superior izquierdo, matemáticamente se trata de minimizar:
2 21 1 Sensitividad Especificidad
La opción best.method="youden" trata de maximizar el índice J de Youden, que viene
definido por la distancia a la diagonal, matemáticamente se trata de maximizar:
Sensitividad Especificidad
6.3. Construcción de modelos de clasificación sin aplicar procedimientos de
muestreo para datos no balanceados
6.3.1. Árbol de clasificación
Cargar las librerías necesarias
library(rpart)
library (rpart.plot)
library(ROCR)
Lectura de los datos
data("GermanCredit",package="evtree") summary(GermanCredit)datos=GermanCredit prop.table(table(datos$credit_risk))
## ## good bad ## 0.7 0.3
Partición de los datos en conjunto entrenamiento y test
n<- nrow(datos) indin<- 1:n nent<-ceiling(0.7*n) ntest<- n-nent set.seed(13579) indient<- sort(sample(indin,nent)) inditest<- setdiff(indin,indient) datosent<- datos[indient,] datostest<- datos[inditest,] dim(datosent)
## [1] 700 21
68
dim(datostest)
## [1] 300 21
save(datosent,datostest,file="GermanCredit.RData")
Construcción del árbol de clasificación
modelo.rpart<- rpart(credit_risk~ ., data=datosent,method="class", cp=0.0001) plot(modelo.rpart,main="GermanCredit. CP=0.001", uniform=TRUE,compress=TRUE) text(modelo.rpart,col="blue",cex=0.5)
printcp(modelo.rpart,digits=3)
## ## Classification tree: ## rpart(formula = credit_risk ~ ., data = datosent, method = "class", ## cp = 1e-04) ## ## Variables actually used in tree construction: ## [1] age amount ## [3] credit_history duration ## [5] employment_duration installment_rate ## [7] number_credits other_debtors ## [9] other_installment_plans personal_status_sex ## [11] present_residence property ## [13] purpose savings ## [15] status telephone ##
69
## Root node error: 208/700 = 0.297 ## ## n= 700 ## ## CP nsplit rel error xerror xstd ## 1 0.06490 0 1.000 1.000 0.0581 ## 2 0.03846 2 0.870 0.990 0.0580 ## 3 0.01923 4 0.793 0.990 0.0580 ## 4 0.01803 5 0.774 0.971 0.0576 ## 5 0.01202 11 0.644 0.966 0.0575 ## 6 0.01082 15 0.596 0.952 0.0573 ## 7 0.00962 19 0.553 0.971 0.0576 ## 8 0.00721 21 0.534 0.986 0.0579 ## 9 0.00240 23 0.519 1.014 0.0584 ## 10 0.00010 27 0.510 1.053 0.0590
plotcp(modelo.rpart,lty=2,col="blue")
Tabla visualizada con printcp
cptabla<- modelo.rpart$cptable cptabla
## CP nsplit rel error xerror xstd ## 1 0.064903846 0 1.0000000 1.0000000 0.05813021 ## 2 0.038461538 2 0.8701923 0.9903846 0.05796752 ## 3 0.019230769 4 0.7932692 0.9903846 0.05796752 ## 4 0.018028846 5 0.7740385 0.9711538 0.05763390 ## 5 0.012019231 11 0.6442308 0.9663462 0.05754876 ## 6 0.010817308 15 0.5961538 0.9519231 0.05728911 ## 7 0.009615385 19 0.5528846 0.9711538 0.05763390
70
## 8 0.007211538 21 0.5336538 0.9855769 0.05788515 ## 9 0.002403846 23 0.5192308 1.0144231 0.05836914 ## 10 0.000100000 27 0.5096154 1.0528846 0.05897694
Calcular Minx1ES=Min(xerror)+1xstd, necesario para la regla 1-SE
Minxerror1ES<- min(cptabla[,4])+cptabla[which.min(cptabla[,4]),5] Minxerror1ES
## [1] 1.009212
cprecorte<- cptabla[cptabla[,4]<Minxerror1ES,][1,1] cprecorte
## [1] 0.06490385
Recorte del árbol con prune.rpart En este caso, el cp obtenido toma un valor con el cual el árbol recortado se corresponde con elnodo raíz. Por este motivo, se obviará el proceso de poda y se realizará la predicción en el conjunto test con el árbol original sin recortar.
#modelo.rpart2<-prune.rpart(modelo.rpart,cp=cprecorte) #modelo.rpart2 #summary(modelo.rpart2) #cbind(modelo.rpart2$variable.importance) #plot(modelo.rpart2,main=" Arbol recortado", # uniform=TRUE,compress=TRUE) #text(modelo.rpart2,col="blue",cex=0.5) #rpart.plot(modelo.rpart2,fallen.leaves=FALSE,cex=0.7)
Aplicación del modelo sobre el conjunto test, donde se calcula el porcentaje de acierto global, la sensitividad y la especificidad
La sensitividad indica el acierto en la clase de los créditos fallidos
La especificidad indica el acierto en la clase de los créditos buenos
modelo.rpart2=modelo.rpart ct<-table(datostest$credit_risk, predict(modelo.rpart2, datostest,type="class")) ct
## ## good bad ## good 184 24 ## bad 58 34
100*diag(prop.table(ct, 1))
## good bad ## 88.46154 36.95652
100*sum(diag(prop.table(ct)))
## [1] 72.66667
71
Obtención de la Curva COR en el conjunto test
probabiCART<- predict(modelo.rpart, datostest,"prob")[,1] prediobj<-prediction(probabiCART,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"), main="CURVA COR TEST. CART") abline(a=0,b=1,col="blue",lty=2)
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.7021844
6.3.2. Bosque Aleatorio
Cargar las librerías necesarias
library(rpart)
library (rpart.plot)
library(ROCR)
library(randomForest)
Lectura de los datos
data("GermanCredit",package="evtree") summary(GermanCredit)datos=GermanCredit prop.table(table(datos$credit_risk))
72
## ## good bad ## 0.7 0.3
Partición de los datos en conjunto entrenamiento y test
n<- nrow(datos) indin<- 1:n nent<-ceiling(0.7*n) ntest<- n-nent set.seed(13579) indient<- sort(sample(indin,nent)) inditest<- setdiff(indin,indient) datosent<- datos[indient,] datostest<- datos[inditest,] dim(datosent)
## [1] 700 21
dim(datostest)
## [1] 300 21
save(datosent,datostest,file="GermanCredit.RData")
Modelo Random Forest con m por defecto
t1=proc.time() modelo.rf<- randomForest(credit_risk ~ ., data=datosent, importance=TRUE, do.trace=TRUE,ntree=500)
## ntree OOB 1 2 ## 1: 31.40% 20.90% 54.32% ## 2: 31.35% 21.23% 54.26%
………………………………………………………………………………
## 499: 24.00% 9.76% 57.69% ## 500: 24.14% 9.76% 58.17%
(tCPURF=proc.time()-t1)
## user system elapsed ## 1.69 0.07 1.75
print(modelo.rf)
## ## Call: ## randomForest(formula = credit_risk ~ ., data = datosent, importance = TRUE, do.trace = TRUE, ntree = 500) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 4 ## ## OOB estimate of error rate: 24.14%
73
## Confusion matrix: ## good bad class.error ## good 444 48 0.09756098 ## bad 121 87 0.58173077
plot(modelo.rf) legend("topright",col=1:3,lty=1:3,lwd=2, legend=c("OOB",levels(datosent$credit_risk)))
importancias=importance(modelo.rf) importancias[order(-importancias[,3]),]
## good bad MeanDecreaseAccuracy ## status 16.2554587 26.93350350 27.416759 ## duration 12.8188744 8.85399482 15.386364 ## amount 10.8839559 10.55000729 15.045141 ## credit_history 5.4991848 4.67150086 7.043681 ## employment_duration 4.2997211 5.85085949 6.862817 ## age 3.9161682 5.15109172 6.211998 ## savings 3.2775874 5.46735903 6.043320 ## other_debtors 6.2146638 -0.04920484 5.222085 ## purpose 2.5798979 4.73312332 4.943983 ## telephone 1.6128398 4.97033445 4.645714 ## property 4.8741022 0.37426839 4.523189 ## installment_rate 4.8327748 0.75284161 4.363649 ## foreign_worker 0.6678999 4.20960614 3.120855 ## other_installment_plans 2.9576955 0.71192224 2.964304 ## present_residence 2.0344734 1.25694140 2.374279 ## personal_status_sex -0.8259711 4.66378889 2.152205 ## job 2.9271816 -0.71921825 2.030769 ## number_credits 2.8408169 -1.28003213 1.857603
74
## housing 2.4780074 -0.40192721 1.791659 ## people_liable 2.0310681 -0.24278394 1.580329 ## MeanDecreaseGini ## status 32.259019 ## duration 28.917452 ## amount 39.479472 ## credit_history 17.115032 ## employment_duration 15.611169 ## age 28.632388 ## savings 12.735933 ## other_debtors 4.577789 ## purpose 24.544672 ## telephone 4.846240 ## property 13.896661 ## installment_rate 10.673448 ## foreign_worker 1.302937 ## other_installment_plans 7.314953 ## present_residence 11.779242 ## personal_status_sex 11.165875 ## job 8.249276 ## number_credits 5.481811 ## housing 6.509891 ## people_liable 4.002197
datostest.pred <- predict(modelo.rf, datostest)
Resultados de la predicción
ct<- table(observado = datostest$credit_risk, prediccion = datostest.pred) ct
## prediccion ## observado good bad ## good 194 14 ## bad 61 31
100*diag(prop.table(ct, 1))
## good bad ## 93.26923 33.69565
100*sum(diag(prop.table(ct)))
## [1] 75
Obtención de la Curva COR en el conjunto test
#COR probabiRF<- predict(modelo.rf, datostest,"prob")[,1] library(ROCR) prediobj<-prediction(probabiRF,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"), main="CURVA COR TEST. RF") abline(a=0,b=1,col="blue",lty=2)
75
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.7628554
6.4. Construcción de modelos de clasificación aplicando procedimientos de
muestreo para datos no balanceados
Los programas R utilizados en este apartado son muy similares, solo se diferencian en la
forma de generar el conjunto de datos balanceado. A continuación se incluyen las
instrucciones R empleadas para balancear el conjunto de entrenamiento con cada
técnica.
6.4.1. DownSampling
Proceso de construcción del árbol de clasificación
Cargar las librerias necesarias
library(caret)
library(rpart) library (rpart.plot) library(ROCR)
library(randomForest)
76
Lectura de los datos
load(file="GermanCredit.RData") dim(datosent)
## [1] 700 21
dim(datostest)
## [1] 300 21
vd=which(names(datosent)=="credit_risk")
Balaenceo de los datos a partir de DownSample
downSampled = downSample(datosent[, -vd], datosent$credit_risk) dim(downSampled)
## [1] 416 21
names(downSampled)
## [1] "status" "duration" ## [3] "credit_history" "purpose" ## [5] "amount" "savings" ## [7] "employment_duration" "installment_rate" ## [9] "personal_status_sex" "other_debtors" ## [11] "present_residence" "property" ## [13] "age" "other_installment_plans" ## [15] "housing" "number_credits" ## [17] "job" "people_liable" ## [19] "telephone" "foreign_worker" ## [21] "Class"
names(downSampled)[21]="credit_risk" table(downSampled$credit_risk)
## ## good bad ## 208 208
datosent=downSampled
Construcción del árbol de clasificación Se repiten las instrucciones del primer código, en el que se procede a la construcción de un árbol de clasificación sin antes balancear los datos.
modelo.rpart<- rpart(credit_risk~ ., data=datosent,method="class", cp=0.0001) plot(modelo.rpart,main="GermanCredit. CP=0.001", uniform=TRUE,compress=TRUE) text(modelo.rpart,col="blue",cex=0.5)
77
printcp(modelo.rpart,digits=3)
## ## Classification tree: ## rpart(formula = credit_risk ~ ., data = datosent, method = "class", ## cp = 1e-04) ## ## Variables actually used in tree construction: ## [1] age amount duration ## [4] employment_duration other_installment_plans present_residence ## [7] property purpose status ## ## Root node error: 208/416 = 0.5 ## ## n= 416 ## ## CP nsplit rel error xerror xstd ## 1 0.39423 0 1.000 1.125 0.0486 ## 2 0.02885 1 0.606 0.606 0.0451 ## 3 0.02083 2 0.577 0.707 0.0469 ## 4 0.01442 6 0.471 0.635 0.0456 ## 5 0.00962 7 0.457 0.601 0.0450 ## 6 0.00481 12 0.409 0.567 0.0442 ## 7 0.00010 13 0.404 0.577 0.0444
plotcp(modelo.rpart,lty=2,col="blue")
78
Proceso de poda
cptabla<- modelo.rpart$cptable Minxerror1ES<- min(cptabla[,4])+cptabla[which.min(cptabla[,4]),5] Minxerror1ES
## [1] 0.6115094
cprecorte<- cptabla[cptabla[,4]<Minxerror1ES,][1,1] cprecorte
## [1] 0.02884615
modelo.rpart2<-prune.rpart(modelo.rpart,cp=cprecorte) modelo.rpart2
## n= 416 ## ## node), split, n, loss, yval, (yprob) ## * denotes terminal node ## ## 1) root 416 208 good (0.5000000 0.5000000) ## 2) status=... >= 200 DM / salary for at least 1 year,no checking account 150 34 good (0.7733333 0.2266667) * ## 3) status=... < 0 DM,0 <= ... < 200 DM 266 92 bad (0.3458647 0.6541353) *
plot(modelo.rpart2,main=" Arbol recortado", uniform=TRUE,compress=TRUE) text(modelo.rpart2,col="blue",cex=0.5)
79
rpart.plot(modelo.rpart2,fallen.leaves=FALSE,cex=0.7)
Árbol recortado
modelo.rpart2=modelo.rpart ct<-table(datostest$credit_risk, predict(modelo.rpart2, datostest,type="class")) ct
## ## good bad ## good 120 88 ## bad 20 72
Resultados. Sensitividad, Especificidad y porcentaje de acierto global
100*diag(prop.table(ct, 1))
## good bad ## 57.69231 78.26087
100*sum(diag(prop.table(ct)))
## [1] 64
Obtención de la Curva COR en el conjunto test
probabiCART<- predict(modelo.rpart, datostest,"prob")[,1] prediobj<-prediction(probabiCART,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"),
80
main="CURVA COR TEST. CART") abline(a=0,b=1,col="blue",lty=2)
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.6908445
Proceso de construcción del bosque aleatorio
Construcción del bosque calculando el tiempo empleado en ejecutar el proceso
t1=proc.time() modelo.rf<- randomForest(credit_risk ~ ., data=datosent, importance=TRUE, do.trace=TRUE,ntree=500)
## ntree OOB 1 2 ## 1: 33.11% 36.49% 29.87% ## 2: 33.21% 40.15% 26.32%
………………………………………………………………………………… ## 498: 25.48% 28.85% 22.12% ## 499: 25.96% 29.81% 22.12% ## 500: 25.72% 29.33% 22.12%
(tCPURF=proc.time()-t1)
## user system elapsed ## 1.22 0.00 1.22
print(modelo.rf)
81
## ## Call: ## randomForest(formula = credit_risk ~ ., data = datosent, importance = TRUE, do.trace = TRUE, ntree = 500) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 4 ## ## OOB estimate of error rate: 25.72% ## Confusion matrix: ## good bad class.error ## good 147 61 0.2932692 ## bad 46 162 0.2211538
plot(modelo.rf) legend("topright",col=1:3,lty=1:3,lwd=2, legend=c("OOB",levels(datosent$credit_risk)))
importancias=importance(modelo.rf) importancias[order(-importancias[,3]),]
## good bad MeanDecreaseAccuracy ## status 25.4698692 25.11039168 33.5149514 ## duration 13.5626986 6.12867208 13.7084748 ## amount 9.9119124 5.52065577 11.3745926 ## other_installment_plans 9.8481881 4.45029545 9.9626607 ## purpose 6.1761173 7.84743256 9.7183267 ## credit_history 8.7573419 3.29832208 8.7493077 ## age 6.2991386 3.14368929 6.5518946 ## present_residence 3.5844807 4.91086480 6.1071431 ## employment_duration 4.2728359 3.53269032 5.5368565
82
## property 5.9157846 1.59712609 5.3055214 ## job 5.6186898 0.31517290 4.3021870 ## other_debtors 5.4449617 -0.42299930 3.7074279 ## savings 0.4225136 4.55975468 3.6253702 ## number_credits 5.8107304 -1.22128194 3.3522960 ## telephone 0.4199595 3.64282040 3.2900835 ## housing 4.8138650 -0.28523312 3.0693236 ## personal_status_sex 0.7353312 2.51688108 2.4570055 ## people_liable 1.4525063 -0.02566594 0.9518824 ## foreign_worker 0.6108570 0.07702136 0.5130326 ## installment_rate 0.7886071 -1.27356105 -0.4276254 ## MeanDecreaseGini ## status 27.6648869 ## duration 19.6856132 ## amount 26.5034653 ## other_installment_plans 6.4759105 ## purpose 19.0068603 ## credit_history 13.1410739 ## age 18.2391113 ## present_residence 8.4421571 ## employment_duration 9.4160515 ## property 8.9924634 ## job 5.6400405 ## other_debtors 3.8121697 ## savings 8.9074713 ## number_credits 4.0116281 ## telephone 3.3207091 ## housing 5.5676309 ## personal_status_sex 7.0884854 ## people_liable 2.6201607 ## foreign_worker 0.6536493 ## installment_rate 6.9976007
datostest.pred <- predict(modelo.rf, datostest) ct<- table(observado = datostest$credit_risk, prediccion = datostest.pred) ct
## prediccion ## observado good bad ## good 148 60 ## bad 32 60
Resultados. Sensitividad, Especificidad y porcentaje de acierto global
100*diag(prop.table(ct, 1))
## good bad ## 71.15385 65.21739
100*sum(diag(prop.table(ct)))
## [1] 69.33333
83
Obtención de la Curva COR en el conjunto test
probabiRF<- predict(modelo.rf, datostest,"prob")[,1] prediobj<-prediction(probabiRF,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"), main="CURVA COR TEST. RF") abline(a=0,b=1,col="blue",lty=2)
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.7692308
6.4.2. Remuestreo en la clase minoritaria (“UpSampling”)
Proceso de construcción del árbol de clasificación
Cargar las librerias necesarias
library(caret)
library(rpart) library (rpart.plot) library(ROCR)
library(randomForest)
Lectura de los datos
84
load(file="GermanCredit.RData") dim(datosent)
## [1] 700 21
dim(datostest)
## [1] 300 21
vd=which(names(datosent)=="credit_risk")
Balanceo de los datos a partir de DownSample
upSampled = upSample(datosent[, -vd], datosent$credit_risk) dim(upSampled)
## [1] 984 21
names(upSampled)[21]="credit_risk" table(upSampled$credit_risk)
## ## good bad ## 492 492
datosent=upSampled
Construcción del árbol de clasificación Se repiten las instrucciones del primer código, en el que se procede a la construcción de un árbol de clasificación sin antes balancear los datos.
modelo.rpart<- rpart(credit_risk~ ., data=datosent,method="class",cp=0.0001) plot(modelo.rpart,main="GermanCredit. CP=0.001", uniform=TRUE,compress=TRUE) text(modelo.rpart,col="blue",cex=0.5)
85
printcp(modelo.rpart,digits=3)
## ## Classification tree: ## rpart(formula = credit_risk ~ ., data = datosent, method = "class", ## cp = 1e-04) ## ## Variables actually used in tree construction: ## [1] age amount ## [3] credit_history duration ## [5] employment_duration housing ## [7] job other_debtors ## [9] other_installment_plans personal_status_sex ## [11] property purpose ## [13] savings status ## [15] telephone ## ## Root node error: 492/984 = 0.5 ## ## n= 984 ## ## CP nsplit rel error xerror xstd ## 1 0.40447 0 1.000 1.057 0.0318 ## 2 0.01931 1 0.596 0.596 0.0292 ## 3 0.01423 5 0.490 0.533 0.0282 ## 4 0.01016 7 0.461 0.516 0.0279 ## 5 0.00915 9 0.441 0.506 0.0277 ## 6 0.00813 16 0.362 0.498 0.0276 ## 7 0.00610 19 0.337 0.490 0.0274 ## 8 0.00457 22 0.319 0.480 0.0272
86
## 9 0.00305 27 0.291 0.474 0.0271 ## 10 0.00271 29 0.285 0.474 0.0271 ## 11 0.00244 32 0.276 0.480 0.0272 ## 12 0.00203 37 0.264 0.484 0.0273 ## 13 0.00010 38 0.262 0.492 0.0275
plotcp(modelo.rpart,lty=2,col="blue")
Proceso de poda
cptabla<- modelo.rpart$cptable Minxerror1ES<- min(cptabla[,4])+cptabla[which.min(cptabla[,4]),5] Minxerror1ES
## [1] 0.5006814
cprecorte<- cptabla[cptabla[,4]<Minxerror1ES,][1,1] cprecorte
## [1] 0.008130081
modelo.rpart2<-prune.rpart(modelo.rpart,cp=cprecorte) cbind(modelo.rpart2$variable.importance)
## [,1] ## status 89.1070042 ## duration 32.7081748 ## purpose 32.4678087 ## amount 29.2971672 ## age 22.4602337 ## credit_history 20.2642897 ## employment_duration 15.2860861
87
## other_debtors 11.4657942 ## housing 8.7242494 ## savings 8.6623140 ## present_residence 8.6465256 ## telephone 4.7149239 ## installment_rate 4.2968374 ## personal_status_sex 3.8206360 ## property 3.1408220 ## number_credits 3.0541167 ## job 1.4149195 ## people_liable 0.3682995
plot(modelo.rpart2,main=" Arbol recortado", uniform=TRUE,compress=TRUE) text(modelo.rpart2,col="blue",cex=0.5)
rpart.plot(modelo.rpart2,fallen.leaves=FALSE,cex=0.7)
88
modelo.rpart2=modelo.rpart ct<-table(datostest$credit_risk, predict(modelo.rpart2, datostest,type="class")) ct
## ## good bad ## good 168 40 ## bad 43 49
Resultados. Sensitividad, Especificidad y porcentaje de acierto global
100*diag(prop.table(ct, 1))
## good bad ## 80.76923 53.26087
100*sum(diag(prop.table(ct)))
## [1] 72.33333
Obtención de la Curva COR en el conjunto test
probabiCART<- predict(modelo.rpart, datostest,"prob")[,1] prediobj<-prediction(probabiCART,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"), main="CURVA COR TEST. CART") abline(a=0,b=1,col="blue",lty=2)
89
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.7112772
Proceso de construcción del bosque aleatorio
Construcción del bosque calculando el tiempo empleado en ejecutar el proceso
t1=proc.time() modelo.rf<- randomForest(credit_risk ~ ., data=datosent, importance=TRUE, do.trace=TRUE,ntree=500)
## ntree OOB 1 2 ## 1: 26.39% 33.85% 17.86% ## 2: 25.47% 34.85% 15.25%
………………………………………………………………………………… ## 499: 9.65% 14.02% 5.28% ## 500: 9.55% 14.02% 5.08%
(tCPURF=proc.time()-t1)
## user system elapsed ## 2.58 0.02 2.59
print(modelo.rf)
## ## Call: ## randomForest(formula = credit_risk ~ ., data = datosent, importance = TRUE, do.trace = TRUE, ntree = 500)
90
## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 4 ## ## OOB estimate of error rate: 9.55% ## Confusion matrix: ## good bad class.error ## good 423 69 0.14024390 ## bad 25 467 0.05081301
plot(modelo.rf) legend("topright",col=1:3,lty=1:3,lwd=2, legend=c("OOB",levels(datosent$credit_risk)))
importancias=importance(modelo.rf) importancias[order(-importancias[,3]),]
## good bad MeanDecreaseAccuracy ## status 29.293105 63.14946 60.40610 ## amount 14.612812 52.84664 52.50249 ## purpose 5.007404 49.52581 47.60030 ## duration 16.489885 45.72560 45.91294 ## age 4.459810 44.47733 41.19963 ## credit_history 11.330202 40.20672 37.22453 ## savings 2.961645 35.88971 34.09861 ## employment_duration 4.741200 35.46207 34.04849 ## property 6.186857 34.31460 32.17643 ## installment_rate 2.731290 32.63068 31.40249 ## job 2.609925 32.55214 30.42162 ## present_residence 1.432199 33.85867 30.42107 ## personal_status_sex 1.522872 31.89797 30.23173
91
## other_installment_plans 4.588406 25.16724 23.90675 ## telephone 2.605330 24.29393 23.30215 ## other_debtors 12.351656 22.21189 22.93374 ## number_credits 4.444136 24.46366 22.86209 ## housing 3.037297 22.34031 21.53052 ## people_liable 3.414727 19.84907 19.34346 ## foreign_worker 4.456402 13.25792 13.11592 ## MeanDecreaseGini ## status 72.097003 ## amount 60.675184 ## purpose 41.789261 ## duration 45.761957 ## age 43.706102 ## credit_history 29.688017 ## savings 22.930153 ## employment_duration 24.591080 ## property 21.766414 ## installment_rate 16.768419 ## job 14.874647 ## present_residence 17.775996 ## personal_status_sex 17.528819 ## other_installment_plans 12.082816 ## telephone 8.149427 ## other_debtors 9.115525 ## number_credits 9.412774 ## housing 9.599195 ## people_liable 6.190293 ## foreign_worker 3.246032
datostest.pred <- predict(modelo.rf, datostest) ct<- table(observado = datostest$credit_risk, prediccion = datostest.pred) ct
## prediccion ## observado good bad ## good 186 22 ## bad 48 44
Resultados. Sensitividad, Especificidad y porcentaje de acierto global
100*diag(prop.table(ct, 1))
## good bad ## 89.42308 47.82609
100*sum(diag(prop.table(ct)))
## [1] 76.66667
Obtención de la Curva COR en el conjunto test
probabiRF<- predict(modelo.rf, datostest,"prob")[,1] prediobj<-prediction(probabiRF,datostest$credit_risk) plot(performance(prediobj, "tpr","fpr"),
92
main="CURVA COR TEST. RF") abline(a=0,b=1,col="blue",lty=2)
auc<- as.numeric(performance(prediobj,"auc")@y.values) cat("AUC test= ",auc ,"\n")
## AUC test= 0.7636653
6.4.3 Umbrales de decisión alternativos
Proceso de construcción del árbol de clasificación
Cargar las librerias necesarias
library(caret)
library(rpart) library (rpart.plot) library(ROCR)
library(randomForest)
library(pROC)
Lectura de los datos
load(file="GermanCredit.RData") dim(datosent)
## [1] 700 21
93
dim(datostest)
## [1] 300 21
vd=which(names(datosent)=="credit_risk")
Conjunto de validación
set.seed(12345) ival=sample(1:nrow(datosent),150) datosval=datosent[ival,] datosent2=datosent[-ival,] dim(datosent2)
## [1] 550 21
dim(datosval)
## [1] 150 21
Construcción del árbol de clasificación Se repiten las instrucciones del primer código, en el que se procede a la construcción de un árbol de clasificación sin antes balancear los datos.
modelo.rpart<- rpart(credit_risk~ ., data=datosent2,method="class",cp=0.0001) plot(modelo.rpart,main="GermanCredit. CP=0.001", uniform=TRUE,compress=TRUE) text(modelo.rpart,col="blue",cex=0.5)
printcp(modelo.rpart,digits=3)
94
## ## Classification tree: ## rpart(formula = credit_risk ~ ., data = datosent2, method = "class", ## cp = 1e-04) ## ## Variables actually used in tree construction: ## [1] age amount ## [3] credit_history duration ## [5] employment_duration housing ## [7] job other_installment_plans ## [9] property purpose ## [11] savings status ## ## Root node error: 169/550 = 0.307 ## ## n= 550 ## ## CP nsplit rel error xerror xstd ## 1 0.07101 0 1.000 1.000 0.0640 ## 2 0.04142 2 0.858 0.899 0.0621 ## 3 0.02663 3 0.817 0.888 0.0618 ## 4 0.01775 7 0.669 0.935 0.0628 ## 5 0.01479 10 0.615 1.024 0.0644 ## 6 0.01183 12 0.586 1.024 0.0644 ## 7 0.00888 18 0.515 1.041 0.0647 ## 8 0.00010 20 0.497 1.041 0.0647
plotcp(modelo.rpart,lty=2,col="blue")
Proceso de poda
95
cptabla<- modelo.rpart$cptable #Regla 1-ES Minxerror1ES<- min(cptabla[,4])+cptabla[which.min(cptabla[,4]),5] Minxerror1ES
## [1] 0.9493767
cprecorte<- cptabla[cptabla[,4]<Minxerror1ES,][1,1] cprecorte
## [1] 0.04142012
#Recorte modelo.rpart2<-prune.rpart(modelo.rpart,cp=cprecorte) modelo.rpart2
## n= 550 ## ## node), split, n, loss, yval, (yprob) ## * denotes terminal node ## ## 1) root 550 169 good (0.6927273 0.3072727) ## 2) status=... >= 200 DM / salary for at least 1 year,no checking account 230 28 good (0.8782609 0.1217391) * ## 3) status=... < 0 DM,0 <= ... < 200 DM 320 141 good (0.5593750 0.4406250) ## 6) duration< 31.5 256 97 good (0.6210938 0.3789062) * ## 7) duration>=31.5 64 20 bad (0.3125000 0.6875000) *
summary(modelo.rpart2)
## Call: ## rpart(formula = credit_risk ~ ., data = datosent2, method = "class", ## cp = 1e-04) ## n= 550 ## ## CP nsplit rel error xerror xstd ## 1 0.07100592 0 1.0000000 1.0000000 0.06402326 ## 2 0.04142012 2 0.8579882 0.8994083 0.06205764 ## ## Variable importance ## status duration credit_history savings amount ## 61 24 8 4 2 ## ## Node number 1: 550 observations, complexity param=0.07100592 ## predicted class=good expected loss=0.3072727 P(node) =1 ## class counts: 381 169 ## probabilities: 0.693 0.307 ## left son=2 (230 obs) right son=3 (320 obs) ## Primary splits: ## status splits as RRLL, improve=27.215460, (0 missing)
96
## amount < 6409.5 to the left, improve=11.711980, (0 missing) ## duration < 31.5 to the left, improve=11.245300, (0 missing) ## credit_history splits as RRRRL, improve= 7.289101, (0 missing) ## savings splits as RRLLL, improve= 6.110754, (0 missing) ## Surrogate splits: ## credit_history splits as RRRRL, agree=0.636, adj=0.130, (0 split) ## savings splits as RRLLL, agree=0.611, adj=0.070, (0 split) ## duration < 6.5 to the left, agree=0.598, adj=0.039, (0 split) ## purpose splits as RRRRRRRRLR, agree=0.584, adj=0.004, (0 split) ## ## Node number 2: 230 observations ## predicted class=good expected loss=0.1217391 P(node) =0.4181818 ## class counts: 202 28 ## probabilities: 0.878 0.122 ## ## Node number 3: 320 observations, complexity param=0.07100592 ## predicted class=good expected loss=0.440625 P(node) =0.5818182 ## class counts: 179 141 ## probabilities: 0.559 0.441 ## left son=6 (256 obs) right son=7 (64 obs) ## Primary splits: ## duration < 31.5 to the left, improve=9.751562, (0 missing) ## amount < 8724.5 to the left, improve=6.735208, (0 missing) ## property splits as LRRR, improve=6.139099, (0 missing) ## credit_history splits as RRLLL, improve=4.145158, (0 missing) ## age < 25.5 to the right, improve=3.490901, (0 missing) ## Surrogate splits: ## amount < 6613 to the left, agree=0.822, adj=0.109, (0 split) ## ## Node number 6: 256 observations ## predicted class=good expected loss=0.3789062 P(node) =0.4654545 ## class counts: 159 97 ## probabilities: 0.621 0.379 ## ## Node number 7: 64 observations ## predicted class=bad expected loss=0.3125 P(node) =0.1163636 ## class counts: 20 44 ## probabilities: 0.312 0.688
97
rpart.plot(modelo.rpart2, fallen.leaves=FALSE,cex=0.7)
modelo.rpart2=modelo.rpart probvalidac=predict(modelo.rpart, datosval,type="prob")[,2] library(pROC) rfvalidROC = roc(datosval$credit_risk, probvalidac, levels = levels(datosval$credit_risk)) rfvalidROC
## ## Call: ## roc.default(response = datosval$credit_risk, predictor = probvalidac,levels = levels(datosval$credit_risk)) ## ## Data: probvalidac in 111 controls (datosval$credit_risk good) < 39 cases (datosval$credit_risk bad). ## Area under the curve: 0.7503
Se busca el punto de corte, mediante los dos criterios previamente presentados. En este caso, ambos coinciden.
pc1 = coords(rfvalidROC, x = "best", ret="threshold", best.method="closest.topleft") pc2 = coords(rfvalidROC, x = "best", ret="threshold", best.method="youden") pc1
## [1] 0.1175676
98
pc2
## [1] 0.1175676
Aplicación del modelo al conjunto test
probabitest=predict(modelo.rpart2, datostest,type="prob")[,2] preditest = factor(ifelse(probabitest < pc1, "good", "bad")) ct<-table(datostest$credit_risk, preditest) ct
## preditest ## bad good ## good 79 129 ## bad 65 27
ct=ct[c(2,1),] ct
## preditest ## bad good ## bad 65 27 ## good 79 129
Resultados. Sensitividad, Especificidad y Porcentaje de acierto global
100*diag(prop.table(ct, 1))
## bad good ## 70.65217 62.01923
100*sum(diag(prop.table(ct)))
## [1] 64.66667
Proceso de construcción del bosque aleatorio
Construcción del bosque calculando el tiempo empleado en ejecutar el proceso
modelo.rf<- randomForest(credit_risk ~ ., data=datosent2, importance=TRUE, do.trace=TRUE,ntree=500)
## ntree OOB 1 2 ## 1: 38.89% 21.60% 68.49% ## 2: 34.82% 23.94% 58.00% ## 3: 33.58% 22.34% 58.14%
………………………………………………………………………………… ## 498: 25.64% 9.19% 62.72%
99
## 499: 25.82% 9.19% 63.31% ## 500: 25.82% 9.19% 63.31%
print(modelo.rf)
## ## Call: ## randomForest(formula = credit_risk ~ ., data = datosent2, importance = TRUE, do.trace = TRUE, ntree = 500) ## Type of random forest: classification ## Number of trees: 500 ## No. of variables tried at each split: 4 ## ## OOB estimate of error rate: 25.82% ## Confusion matrix: ## good bad class.error ## good 346 35 0.09186352 ## bad 107 62 0.63313609
plot(modelo.rf) legend("topright",col=1:3,lty=1:3,lwd=2, legend=c("OOB",levels(datosent$credit_risk)))
probvalidac=predict(modelo.rf, datosval,type="prob")[,2] rfvalidROC = roc(datosval$credit_risk, probvalidac, levels = levels(datosval$credit_risk)) rfvalidROC
100
## ## Call: ## roc.default(response = datosval$credit_risk, predictor = probvalidac, levels = levels(datosval$credit_risk)) ## ## Data: probvalidac in 111 controls (datosval$credit_risk good) < 39 cases (datosval$credit_risk bad). ## Area under the curve: 0.8555
pc1 = coords(rfvalidROC, x = "best", ret="threshold", best.method="closest.topleft") pc2 = coords(rfvalidROC, x = "best", ret="threshold", best.method="youden") pc1
## [1] 0.32
pc2
## [1] 0.32
rfvalidROC = roc(datosval$credit_risk, probvalidac, levels = levels(datosval$credit_risk)) rfvalidROC
## ## Call: ## roc.default(response = datosval$credit_risk, predictor = probvalidac, levels = levels(datosval$credit_risk)) ## ## Data: probvalidac in 111 controls (datosval$credit_risk good) < 39 cases (datosval$credit_risk bad). ## Area under the curve: 0.8555
pc1 = coords(rfvalidROC, x = "best", ret="threshold", best.method="closest.topleft") pc2 = coords(rfvalidROC, x = "best", ret="threshold", best.method="youden") pc1
## [1] 0.32
pc2
## [1] 0.32
Resultados. Sensitividad, Especificidad y porcentaje de acierto global
100*diag(prop.table(ct, 1))
## bad good ## 70.65217 62.01923
100*sum(diag(prop.table(ct)))
101
## [1] 64.66667
6.5. Resultados de los distintos métodos
Las tabla 6.1 y 6.2 contienen los indicadores obtenidos sobre el conjunto test para cada
una de las técnicas consideradas, la primera fila se refiere a los datos originales sin
balancear.
Tabla 6.1 Medidas de rendimiento (conjunto test) para los modelos CART aplicados a los datos
GermanCredit
AUC %Acierto global
%Sensitividad %Especificidad EMC
Datos originales 0.702 72.67 36.96 88.46 1.03
DownSampling 0.691 64.00 78.26 57.69 0.62
UpSampling 0.711 72.333 53.26 80.77 0.84
Punto de corte 0.750 64.67 70.65 62.02 0.71 Elaboración propia
Tabla 6.2 Medidas de rendimiento (conjunto test) para los modelos Random Forests aplicados a los datos
German Credit.
AUC %Acierto global
%Sensitividad %Especificidad EMC
Datos originales 0.763 75.00 33.69 93.27 1.04
DownSampling 0.769 69.33 65.22 71.15 0.81
UpSampling 0.764 76.67 47.83 89.42 0.79
Punto de corte 0.855 64.67 70.65 62.02 0.71 Elaboración propia
En la tablas 6.1 y 6.2., se observa el claro incremento en el valor de la sensitividad
para los tres métodos de tratamiento de datos no balanceados. Dependiendo del
criterio que se desee maximizar, puede ser preferible una técnica u otra. Si el interés
principal es el máximo valor posible de la sensitividad, se optaría por el método
DownSampling aplicado a los árboles de clasificación. También se pueden definir
criterios que tengan en cuenta costes de clasificación incorrectos. En este caso para
el banco puede ser mucho más costoso conceder un crédito a un cliente que no pueda
afrontar los pagos, que denegar un crédito a un cliente solvente.
Por ejemplo, el criterio coste esperado de clasificación incorrecto (Expected
Misclassification Cost) se define como sigue:
102
/ /EMC P bueno P denegar bueno Coste denegar bueno
/ Cos /P malo P conceder malo te conceder malo
/ 1P denegar bueno Especificidad
/ 1P conceder malo Sensitividad
Por ejemplo, definiendo / 5P conceder malo , / 1P denegar bueno , es decir,
es cinco veces más costoso conceder créditos a clientes insolventes que al contrario,
las tablas 6.1 y 6.2, muestran el valor de dicho criterio en la última columna.
Se observa que según este criterio, los métodos elegidos serian, DownSampling para
árboles de clasificación y Punto de Corte para Random Forests ya que son aquellos
en los que se produce un menor error.
El criterio AUC no depende del punto de corte utilizado, puesto que se calcula a
partir de las probabilidades estimadas de que el crédito sea malo. Sin embargo, la
discrepancia que existe para los valores AUC de las filas 1 y 4 de cada tabla se debe
al hecho de haber particionado el conjunto de entrenamiento, por lo que se refieren a
modelos construidos sobe conjuntos distintos.
103
7. Conclusiones y posibles aplicaciones futuras
Los árboles de clasificación son modelos de aprendizaje estadístico supervisado que
ofrecen diversas ventajas, especialmente la posible interpretación mediante reglas de
decisión que pueden ser representadas gráficamente. Sin embargo, su construcción debe
ser realizada cuidadosamente, algo de especial importancia debido a la alta variabilidad
de esta técnica. Los métodos de agregación de modelos, particularmente los Bosques
Aleatorios, pueden resolver estas limitaciones, y además aportan elementos importantes
como la medición de la importancia de cada variable.
Estas técnicas se aplican en una gran variedad de escenarios, por ejemplo: diagnóstico
de enfermedades, detección de correos electrónicos “spam”, identificación de
transacciones fraudulentas con tarjetas de crédito, construcción de sistemas de
reconocimientos de caracteres, análisis de información espacial.
En este trabajo se han desarrollado estos modelos sobre dos conjuntos de datos relativos
a créditos, con un gran rendimiento en el primer conjunto de datos. Para el segundo se
ha observado la necesidad de aplicar métodos específicos para el tratamiento de datos
no balanceados, lo que ha mejorado de forma importante los resultados respecto al
tratamiento original de los datos.
Toda la construcción se ha realizado sobre el entorno de programación R, un producto
de libre distribución muy utilizado hoy en día en la Minería de Datos.
Este trabajo puede continuar en el futuro en líneas como las siguientes:
– Construir árboles (y bosques aleatorios) de regresión.
– Aplicar otras técnicas de tratamiento de datos no balanceados, por ejemplo el
método SMOTE para sintetizar (generar artificialmente) nuevos casos.
– Trabajar con bases de datos de gran volumen (Big Data), mediante estrategias de
computación paralela u otro tipo de procedimientos.
En la actualidad los departamentos de riesgo de algunos bancos trabajan con algoritmos
de aprendizaje estadístico para estudiar la concesión de créditos. Sin embargo, según
Sanz (2015), la aplicación de estos modelos aún no está muy extendida en España, por
lo que cabe esperar en los próximos años un crecimiento en el uso de este tipo de
modelos de ayuda a la decisión, ya sea mediante árboles o bien mediante otras técnicas
alternativas. De acuerdo a la misma fuente, será necesario todavía completar la
información suministrada por los algoritmos con la posible intervención de expertos en
la materia. Los árboles de clasificación son modelos de aprendizaje estadístico
supervisado que ofrecen diversas ventajas, especialmente la posible interpretación
mediante reglas de decisión que pueden ser representadas gráficamente. Sin embargo,
su construcción debe ser realizada cuidadosamente, algo de especial importancia debido
a la alta variabilidad de esta técnica. Los métodos de agregación de modelos,
104
particularmente los Bosques Aleatorios, pueden resolver estas limitaciones, y además
aportan elementos importantes como la medición de la importancia de cada variable.
105
8. Referencias bibliográficas
Breiman, L., Friedman, J.H., Olshen, R.A., y Stone, C.J. (1984). Classification and
Regression Trees. Wadsworth, Belmont, CA.
Breiman, L. (1996). Bagging predictors. Machine Learning 24, 123-140.
Breiman, L. (2001). Random Forests. Machine Learning, 45 (1): 5-32, 2001.
Thomas Grubinger, Achim Zeileis, Karl-Peter Pfeiffer (2014). evtree: Evolutionary
Learning of Globally Optimal Classification and Regression Trees in R. Journal of
Statistical Software, 61(1), 1-29. URL http://www.jstatsoft.org/v61/i01/.
Hastie, T., Tibshirani, R., y Friedman, J. (2009). The elements of statistical learning: Data
Mining, Inference and Prediction. Springer Verlag.
James G, Witten D., Hastie, T. y Tibshirani, R (2013). An introduction to statistical
learning with application in R. Springer Verlag.
Liaw, A. and M. Wiener (2002). Classification and Regression by randomForest. R
News 2(3), 18--22.
Lichman, M. (2013). UCI Machine Learning Repository [http://archive.ics.uci.edu/ml].
Irvine, CA: University of California, School of Information and Computer Science.
R Core Team (2017). R: A language and environment for statistical computing. R
Foundation for Statistical Computing, Vienna, Austria.
URL https://www.R-project.org/.
Robin,X., Turck, N., Hainard,A., Tiberti,N., Lisacek,F., Sanchez, J.C. and Müller, M.
(2011) pROC: an open-source package for R and S+ to analyze and compare ROC
curves. BMC Bioinformatics, 12, p. 77.
DOI: 10.1186/1471-2105-12-77 http://www.biomedcentral.com/1471-2105/12/77/
Sanz, E. (2015) http://www.elconfidencial.com/vivienda/2017-06-04/hipoteca-prestamos-algoritmos-seguros-bancos_1383183/ (último acceso 13 Junio 2017)
Therneau, T., Atkinson, B. and Brian Ripley (2017). rpart: Recursive Partitioning and
Regression Trees. R package version 4.1-11.
https://CRAN.R-project.org/package=rpart
106
Torgo, L. (2010). Data Mining with R, learning with case studies Chapman and
Hall/CRC. URL:
http://www.dcc.fc.up.pt/~ltorgo/DataMiningWithR (último acceso 15 Mayo 2017)