Proyecto 1662
Proyecto 1662
Título en español: Título del Trabajo Fin de Máster: Bootstrap y métodos de ensamblado
en modelos de regresión y clasicación
English title: Master's Thesis title: Bootstrap and ensemble methods in regression and
clasication techniques
Modalidad: A Modalidad A
Autor/a: Sergio Gómez Vilas, Universidad de Santiago de Compostela
Recomendaciones:
Otras observaciones:
iv
v
Resumen ix
3. Ensamblado y Bootstrap 27
3.1. Bagging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.1.1. Bootstrap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.2. Metología del Bagging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1.3. Random Forest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2. Boosting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.1. Adaptative Boosting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2.2. Gradient Boosting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3. Stacking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1. Stacking multinivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
vii
viii ÍNDICE GENERAL
Resumen en español
Los modelos de aprendizaje estadístico supervisado han demostrado ser una poderosa herramienta
en el campo de la modelización estadística de tipo predictivo para tratar datos de distinto tipo y campo
cientíco de estudio. Dependiendo de la naturaleza del problema y de los datos que este nos proporciona
disponemos de una amplia gama de técnicas estadísticas para extraer información de valor. A su
vez, los métodos de ensamblado han aprovechado distintas técnicas matemáticas como el Bootstrap
o los algoritmos de optimización para mejorar signicativamente las capacidades predictivas de los
modelos de aprendizaje estadístico. En el presente trabajo trataremos de realizar una aproximación
a los distintos modelos de aprendizaje estadístico supervisado existentes tratando de describirlos de
la forma más parsimoniosa y clara posible. También nos acercaremos a las principales técnicas de
ensamblado estadístico existentes revisando la bibliografía con el objetivo de explicar sus principales
características subyacentes y los casos de uso en los que son de utilidad. En el apartado nal se tratará
de implementar algunos de ellos con el n de compararlos a la hora de enfrentarnos a conjuntos de
datos reales.
English abstract
Supervised statistical learning models have shown to be a powerful tool in the eld of predictive
statistical modeling to process data of dierent types and from distinct science branches. Depending
on the nature of the problem and the data it provides us, we have a wide range of statistical techniques
to extract valuable information. Simultaneously, ensemble methods have taken advantage of dierent
mathematical techniques such as Bootstrap or optimization algorithms to signicantly improve the
predictive performance of statistical learning models. In the present document we will try to make an
approach to the dierent supervised statistical learning models trying to describe them as most clear
and parsimonious way possible. We will also dicuss the main statistical ensemble techniques reviewing
the bibliography focused on explaining their main underlying characteristics and the use cases where
they are useful. In the nal section we will try to implement some of them in order to compare their
results when facing real data sets.
ix
x RESUMEN
Capítulo 1
El aprendizaje estadístico se puede entender como el conjunto de técnicas matemáticas que tratan de
entender y explotar, es decir obtener conocimiento, de los datos que se generan en un entorno concreto.
Tratar de entender los datos es algo fundamental, ya que sin saber cómo operan y la información que
aportan a un determinado objetivo no se podría obtener valor en forma de conocimiento a partir de
los mismos. Por lo tanto, la obtención de valor a partir de los datos depende fuertemente de que las
técnicas utilizadas para entender los datos sean correctas y no presenten sesgos a la hora de evaluarlos.
Cuando hablamos de explotar la información que aporta un determinado conjunto de datos concreto,
una de las principales fortalezas de los aprendizaje estadístico es la posibilidad de predecir eventos
futuros basándonos en la elaboración de modelos que se entrenan con datos de eventos pasados. Por
lo tanto, uno de los principales objetivos del aprendizaje estadístico desarrollar modelos que permitan
la obtención de predicciones futuras.
1
2 CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE ESTADÍSTICO
El análisis descriptivo: Que englobaría todas las técnicas que pretenden describir y analizar
un grupo de datos, sin realizar inferencias sobre la población a la que pertenecen. Incluyendo
tanto técnicas puramente numéricas como grácas.
Métodos de reducción de la dimensión: Son un conjunto de técnicas que pretenden reducir
en el conjunto de datos el número de variables que aportan información relevante a cerca del
mismo. Se pueden destacar entre otras el análisis de componentes principales (PCA) y el análisis
factorial.
Análisis clúster: Comprende un grupo de técnicas que tratan de agrupar el conjunto de datos
en subgrupos homogéneos que no son conocidos a priori. Destacan los métodos jerárquicos y el
método de los centroides.
Técnicas de detección de valores atípicos: Se trata de un conjunto de técnicas muy utilizadas
en el campo de la minería de datos y que pretenden encontrar datos anómalos en el conjunto
de datos con el que se trabaja. Los datos atípicos tienen propiedades diferentes respecto a la
mayoría del conjunto que pueden generar errores durante los posibles análisis que se realicen y
que la información que se extraiga de ellos sea errónea. Aunque algunos de los métodos anteriores
de aprendizaje no supervisado se pueden utilizar para la detección de datos anómalos destacamos
aquí las técnicas basadas en distancias entre datos cómo la basada en la distancia de Mahalanobis.
Si hablamos en términos de complejidad, un modelo complejo es aquel que incluye una gran cantidad
de predictores. A medida que la complejidad aumenta el error asociado al sesgo disminuye, pero
como contraparte la varianza del modelo también aumenta, sucediendo lo equivalente al disminuir
la complejidad (el sesgo aumenta y la varianza disminuye). Cuando la varianza del modelo aumenta
signicativamente el modelo corre el riesgo de producir sobreajuste. Este fenómeno implica que el
modelo se adapta perfectamente a los datos de entrenamiento pero falla sistemáticamente al tratar de
hacer predicciones sobre otros datos distintos. En el caso de un modelo con varianza reducida y sesgo
elevado estaríamos ante un modelo incapaz de predecir debido a su pobre ajuste.
Se hace pues necesario en todo modelo alcanzar un equilibrio que permita reducir notablemente el
sesgo del modelo en base a incrementar la complejidad del mismo pero sin hacerlo excesivamente para
4 CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE ESTADÍSTICO
evitar caer en el sobreajuste. En la gura 1.1 podemos observar grácamente la relación entre el sesgo,
la varianza y el error total del modelo en función de la complejidad.
Figura 1.1: Relación entre el error total del modelo y su complejidad. Representadas la curvas de la
varianza y del sesgo. Fuente: Elaboración propia a partir de imagen sin copyright
En lo referido a la forma de seleccionar los valores óptimos de los hiperparámetros del modelo se
podría realizar una tercera partición de datos para la validación de los mismos, conllevando una pérdida
acusada de datos. No obstante existen diferentes técnicas que emplean el remuestreo de los datos de
entrenamiento permitiendo obtener submuestras a partir de la muestra de entrenamiento diferentes a la
de entrenamiento. Estas submuestras obtenidas por remuestreo permitirán evaluar los hiperparámetros
sin necesidad de realizar una ternera partición de datos. Una de las técnicas más utilizada es sin
duda la Validación Cruzada (CV), aunque también son punteros métodos basados en remuestreo
Bootstrap. Aunque este último tiene tiene gran relevancia, postergaremos su descripción al capítulo
4 debido a su gran importancia a la hora de construir modelos de ensamblado.
Validación Cruzada
La validación cruzada es una técnica matemática que se utiliza para cuanticar el error de predic-
ción de un modelo de aprendizaje estadístico mediante el remuestreo de los datos de entrenamiento.
Existen varios tipos de validación cruzada de los cuales el más simple es el LOOCV (Leave One Out
Cross Validation) que, como su nombre indica, consiste en realizar un ajuste sobre el conjunto de
entrenamiento n − 1 y utilizar la observación restante para evaluar la predicción. Se iteraría n veces
cubriendo el set de entrenamiento completo, lo cual puede ser muy costoso computacionalmente.
1.3. CONSTRUCCIÓN Y EVALUACIÓN DE MODELOS DE APRENDIZAJE ESTADÍSTICO 5
Una segunda variante de la validación cruzada es la K-Fold Cross Validation que trata de
resolver el problema de ajustar un modelo por observación del set de entrenamiento. En lugar de ello,
segmenta el conjunto de datos en K−grupos y reproduce un procedimiento análogo al anterior de
LOOCV pero en lugar de ajustar un modelo por observación lo hace por cada uno de los K−grupos.
n
P
(yi − y˜i )
2
R̃ = 1 − i=1
Pn (1.1)
(yi − y˜i )2
i=1
A partir de esta la tabla 1.1 podemos extraer las tasas de acierto de positivos y negativos, TPR
(también conocido como Sensibilidad) y TNR (también conocido como Especicidad) respectiva-
mente:
TP TP
TPR = = (1.2)
P TP + FN
6 CAPÍTULO 1. INTRODUCCIÓN AL APRENDIZAJE ESTADÍSTICO
Matriz de confusión
TN TN
TNR = = (1.3)
N TN + FP
TP + TN TP + TN
ACC = = (1.4)
P +N TP + TN + FP + FN
Sin embargo cuando las clases no están balanceadas se debe de usar la Precisión Balanceada
(BA) o la F1 Score:
TPR + TNR
BA = (1.5)
2
2T P
F1 = (1.6)
2T P + F P + F N
Capítulo 2
En términos generales, por lo tanto, el objetivo del modelo de regresión es utilizar las observaciones
medidas de (Y, X) para ajustar un modelo mediante mínimos cuadrados ordinarios que explique la
relación entre las mismas y permita predecir una en función de la otra:
Objetivo descriptivo: Determinar en que modo la variable Y depende de la variable X . Esto
permite conocer el tipo de dependencia entre variables que tenemos. Por ejemplo una dependencia
de tipo lineal u otra de tipo cuadrático.
Objetivo predictivo: con un modelo ya construido determinando de que manera la variable X
modula los valores de la variable Y podremos utilizar dicho modelo para realizar predicciones del
valor que tome la variable respuesta en función de los valores conocidos de la variable explicativa.
Un ejemplo claro de problema de regresión podría ser explicar el valor de la vivienda en función
del porcentaje de pobreza de la población. Este ejemplo sería modelable y comprobable gracias a que
se encuentra en el data set Boston de la librería MASS. de R En este caso, nuestra Y sería el valor
de la vivienda el cual vendría determinado por el porcentaje de pobreza de la zona en la que se sitúa
dicha vivienda que sería nuestra variable X , o variable predictora, en función de la cual variarían los
valores de Y observados.
7
8 CAPÍTULO 2. MODELOS DE APRENDIZAJE ESTADÍSTICO
Y = β0 + β1 X1 + β2 X2 + · · · + βp Xp + ε (2.2)
donde β0 es el intercepto, que se corresponde con los valores de Y cuando x = 0. β1 , · · · , βp
representa el vector de parámetros que se deben determinar y que otorgarán los pesos a cada predictor
del modelo determinado por el vector de variables explicativas x. Además ε es el componente de error
que está sujeto a una serie de hipótesis que serán mencionados en el siguiente apartado en el que se
repasan las hipótesis que debe seguir el modelo.
ε ∈ N (0, σ 2 ) (2.4)
El modelo de regresión lineal múltiple se ajusta por el método de método de mínimos cuadrados
minimizando la suma de los cuadrados de los residuos del modelo:
n
(2.5)
X 2
mı́n (yi − β0 − β1 X1i − · · · − βp Xpi )
β0 ,β1 ,...,βp
i=1
donde Xpi corresponde a los valores de cada predictor enumerado con p para cada observación i
dada y βp es el valor de los coecientes.
A continuación presentamos un cuadro elaborado a partir de Thiele, J., & Markussen, B. (2012)
[22] :
2.1. MODELOS DE REGRESIÓN 9
Gaussiana Identidad 2 µ i = x⊤
i β
exp(x⊤
i β)
Binomial Logit µi = 1+exp(x⊤i β)
Poisson Identidad x⊤
i β
Gamma Inversa x⊤
i β
−1
Regresión logística
La regresión logística un modelo muy utilizado en estadística aplicada y en aprendizaje estadístico
debido a su gran sencillez en la implementación a la gran cantidad de problemas que se presentan
con respuesta binaria. Por ejemplo, en el caso de la bioestadística la clasicación entre enfermo o no
enfermo atendiendo a una serie de variables presentaría una distribución de la variable de respuesta
que encaja en lo que comentamos anteriormente.
Cuando nos encontramos ante un problema en el que la variable respuesta puede caer en dos
categorías cerradas A o B (presencia o ausencia, éxito o error...) que generalmente se representan como
0 o 1 la variable de respuesta Y se distribuye de acuerdo a una función de distribución Bernouilli, donde
podríamos llamar a 1 éxito y a 0 fracaso. Dada esta situación, lo que se hace con la regresión logística
es modelar la probabilidad de que Y pertenezca a cada categoría. Es decir, en lugar de predecir un
valor como se hacía en la regresión lineal, se predice la probabilidad de que una variable respuesta
pertenezca a una categoría.
A diferencia de lo que sucedía con la regresión lineal, la variable respuesta del modelo de regresión
logística deberá adoptar valores entre 0 y 1. Si para un problema en el cual la respuesta debe tomar
un valor entre 0 y 1, tratamos de modelarlo con una recta de regresión es demostrable que nuestra
variable dependiente tomará valores fuera del rango del espectro de probabilidad. Por este motivo, la
regresión logística utiliza la propiamente llamada función logística, la cual establece una relación
entre la variable respuesta y la variable explicativa de la forma E(Y |x) = p(x), donde p(x) es:
donde β = β1 + · · · + βn representa los pesos del modelo y β0 representa el sesgo del modelo.
Los parámetros del modelo son ajustados mediante optimización. Debido a que la función logística
permite obtener resultados en formato probabilístico, respuestas en el rango [0,1], lo cual facilita la
interpretación, necesitamos una función inversa para poder calcular ajustar los coecientes de regresión,
aquí entra en juego la función logit. Se puede ajustar el modelo de forma sencilla usando esta
transformación logarítmica de la forma:
P (x)
logit(p) = log = β0 + β1 X1 + β2 X2 + · · · + βP XP (2.7)
1 − P (x)
Para estimar los coecientes de la regresión logística se usa el estimador de máxima verosimilitud
que consiste en buscar aquellos parámetros β para los cuales la probabilidad predicha para cada
individuo P̂ (xi ) usando 2.6 sea lo más verosimil posible. Se trata de hallar los β̂ que sustituyendo con
sus valores los parámetros del modelo 2.7 este arroje unas probabilidades P (xi ) próximas a 1 si la
característica dicotómica está presente y 0 si no lo está en el individuo i.
Esto se consigue con el set de parámetros β que maximiza la función de verosimilitud de los
datos de entrenamiento que es expresada como el producto de las probabilidades predichas para las n
observaciones:
n n
(2.8)
Y Y
ℓ(X|P ) = P (xi ) (1 − P (xi ))
i=1,yi =1 i=1,yi =0
Dónde (X, y) son los datos de entrenamiento. X es una matriz de observaciones de las variables
predictoras donde cada columna corresponde con un predictor y las observaciones de la primera co-
lumna tienen valor 1. y es el vector de respuestas de dimensión n, xi es el vector de observaciones para
los predictores (correspondiente a una la i de la matriz X ) e yi son las observaciones de la variable
respuesta.
Y = f (X1 , . . . , Xp ) + ε (2.9)
donde f es una función suave de las variables predictoras del modelo. Gran parte de estos modelos se
los conoce como modelos locales debido a que ajustan el modelo para una determinada observación
en función de los datos cercanos a la misma. Para que la denición de un modelo local sea correcta y
permita predecir correctamente deberemos entrenarlo con numerosas observaciones.
Regresión local
La regresión local es una técnica que se utiliza para ajustar modelos a los datos en una ventana de
tamaño jo en lugar de en el conjunto de datos completo. Se puede hacer de forma manual, especicando
2.1. MODELOS DE REGRESIÓN 11
el tamaño de la ventana y el número de datos que se utilizarán en cada paso, o de forma automática,
utilizando un algoritmo que seleccione el tamaño de la ventana y el número de datos de forma dinámica.
Una de las formas de modelar la regresión local más destacable es la regresión polinómica local
ponderada .
Propuesta por Cleveland (1979)[7], la regresión polinómica local ponderada es una técnica que
trata de ajustar curvas polinómicas para pequeñas ventanas del total de los datos (curvas polinómicas
locales) centradas en cada paso en un punto x0 distinto. Con cada uno de los ajustes locales se estima el
valor predicho para x0 y así se va construyendo la curva de regresión. Las curvas polinómicas locales se
ajustan utilizando mínimos cuadrados ponderados por pesos (por sencillez usamos el caso univariante,
es decir, con un sólo predictor):
n
(2.10)
X
mı́n (Yi − β0 − β1 (x0 − Xi ) − . . . − βd (x0 − Xi )d )2 Kh (x0 − Xi )
β0 ,β1 ,...,βd
i=1
Donde d es el grado del polinomio utilizado para la estimación local, x0 es el punto donde se centra
el ajuste local y el término Kh (x0 − Xi ) corresponde a la función que otorga los pesos:
1 x0 − Xi
Kh (x0 − Xi ) = K (2.11)
h h
donde K es una función tipo núcleo (Kernel) que por norma general suele ser una función de
densidad de media 0. El hiperparámetro ventana, h, se usa para suavizar la curva y es el que regula el
número de observaciones que entran en cada ajuste polinómico local. Este hiperparámetro de ventana
es uno de los hiperparámetros más importantes y para su selección existen distintos procedimientos
entre los que destacan la validación cruzada y validación cruzada generalizada (CV y GCV por sus
siglas en inglés) o los selectores plug-in.
Cabe destacar debido a a la importancia del algoritmo en el aprendizaje estadístico, que si usamos
como función núcleo una densidad uniforme centrada en el 0, por ejemplo U(−1, 1), (otorgando los
mismos pesos a cada dato) y usando un polinomio de grado d = 0 (tomando la media local) estaremos
ante el algoritmo K-NN o K-vecinos más próximos para construir una regresión de forma no
paramétrica. Este algoritmo también se utiliza al igual que los métodos aplicados en este apartado
para construir clasicadores, aunque nos estamos centrando en la regresión en el presente apartado.
Splines
Los Splines son un conjunto de funciones polinómicas sobre las que imperan restricciones en los
puntos de unión entre las mismas denominados nodos. Estos nodos dividen el rango del predictor X
en regiones para las cuales se ajusta un polinomio en cada una, lo que implica que se ajustará una
función polinómica en cada uno de los segmentos delimitados por los nodos. Con lo cual la función de
regresión se conformará por un conjunto de funciones continuas en sus intervalos de denición.
Regresión con Splines:
En vez de ajustar un polinomio, que posiblemente acabase siendo una función bastante comple-
ja, a lo largo de todo el espacio denido por la matriz de predictores X , se divide el espacio de
predictores en subintervalos y se ajustan polinomios de menor grado paso a paso. Los puntos
que dividen el espacio de predictores se conocen como nodos. La función se construye ajustan-
do polinomios de orden d e incluyendo ciertas restricciones que permitan que los Splines sean
derivables hasta el orden d − 1. Habitualmente se suele optar por el conocido Spline cúbico
12 CAPÍTULO 2. MODELOS DE APRENDIZAJE ESTADÍSTICO
natural debido a que es continuo en el espacio delimitado por los nodos, en los que se anula su
segunda y tercera derivada que implica que en los subintervalos extremos es lineal, lo cual reduce
notablemente la variabilidad del spline en los extremos.
Para un espacio de datos situado en el intervalo [a, b] donde a < t1 < t2 . . . < tn < b un Spline
cúbico natural tendría una forma:
g(t) = ai + bi (t − ti ) + ci (t − ti )2 + di (t − ti )3 (2.12)
i=1
cuadrado), que ajusta los datos mientras que el término λ g ′′ (t)2 dt es el que penaliza g(x)
haciendo que disminuya la variabilidad y suavizando por consiguiente la curva resultante. Dado
que la segunda derivada de la función g en el punto t mide la variación de la pendiente de la
función que al ser integrada arroja la variación total de la pendiente. Si la curva ajustada es
suave, la pendiente que coincide con la primera derivada g ′ (t), tendrá un valor constante y por
consiguiente la penalización será menor, ocurriendo al contrario en caso de que la variación de
la pendiente sea grande. Por último el término λ es el parámetro que regula la penalización.
Para valores de λ cercanos a 0 no se introducirá apenas penalización en la función y tenderá
a ajustarse totalmente a los datos de entrenamiento mientras que para valores altos tenderá a
suavizar la función.
P-Splines: Una forma de construir la regresión con Splines es a través de los Splines Pena-
lizados. Los más utilizados son los P-Splines[9] son un tipo de Splines que tratan de ajustar
la función de regresión utilizando el menor número de parámetros (menor que los splines de
suavizado) y en los que la selección del número de nodos no afecta tanto como en los Splines
de regresión. Son Splines de bajo rango en los que el tamaño de la base es mucho menor que
el número de datos lo que los hace computacionalmente más ecientes. La introducción de las
penalizaciones disminuye la importancia de la elección de localización y cuantía de los nodos.
Para los P-Splines la penalización empleada suele ser de orden d = 2. Esta forma de modelar
utiliza una base de B-Splines que son un conjunto de splines que se unen en p nodos internos
con propiedades bastante deseables entre las que destaca no ser afectados por el efecto frontera
que incrementa la variabilidad de las predicciones en estos puntos y que padecen otros métodos
de suavizado.
2.2. ÁRBOLES DE DECISIÓN 13
Los GAM permiten ajustar funciones no lineales en cada predictor Xp y al ser modelos aditivos
permiten estudiar el efecto de estos en la variable Y . Su mayor limitación viene de que, debido a su
carácter aditivo, no contemplan las interacciones entre predictores de forma automática y habría que
introducir esta interacción en el modelo de forma manual mediante un nuevo predictor que contemple
esta interacción.
En el caso de los problemas de clasicación, cada nodo del árbol contiene una pregunta sobre los
datos, y cada rama representa una respuesta posible a esa pregunta. El árbol se construye a partir de
los datos de entrenamiento, de modo que cada pregunta se selecciona de tal manera que maximice la
separación entre las clases de datos.
En el caso de los problemas de regresión, cada nodo del árbol contiene una decisión sobre los datos,
y cada rama representa un valor posible de la variable objetivo. El árbol se construye de modo que
cada pregunta se seleccione de tal manera que minimice la varianza de los datos.
Pueden ser muy sensibles a los cambios en los datos de entrada, lo que puede dar lugar a resultados
impredecibles.
Pueden crear modelos muy complejos que no se pueden interpretar fácilmente.
Pueden ser propensos al sobreajuste de los datos.
Cuando queremos predecir una variable respuesta, ya sea continua o categórica, en función de una
serie de variables explicativas podemos aplicar un árbol de decisión. El árbol de decisión es un modelo
de aprendizaje estadístico que consiste en distribuir las observaciones de un determinado set de datos
mediante bifurcaciones en las que se toman decisiones, generando una estructura de árbol que naliza
al alcanzar el nodo en el que no se puede dividir más, conocido como nodo terminal. Existen dos
subtipos de árboles de decisión: aquellos en los que la variable respuesta es continua, conocidos como
árboles de regresión, y el otro subgrupo que corresponde a aquellos en los que la variable respuesta es
categórica, conocidos como árboles de clasicación.
El n último de los árboles de decisión es llegar a los terminales (R1 , R2 , . . . , Rn ) y que estos sean
lo más ables, en términos predictivos, que sea posible. A pesar del sencillo proceso que describimos
antes, en el que para valores clave de los predictores se iban generando sucesivas bifurcaciones hasta
llegar a nodos terminales, necesitamos un método de ajuste que nos permita identicar el valor óptimo
en el cual generar la división en un nodo dado.
Para el caso de los árboles de regresión el criterio usado con más frecuencia es la suma de residuos
al cuadrado (RSS):
J X
(2.16)
X
RSS = (yi − ŷRj )2
j=1 i∈Rj
En la ecuación 2.16 el objetivo es encontrar las J regiones que minimizan el RSS, donde ŷRj es la
media de la respuesta de la variable en la región Rj e yRi es una observación para la variable respuesta.
2.2. ÁRBOLES DE DECISIÓN 15
Figura 2.1: Arbol de regresión. Fuente: James, Gareth, et al., 2013. [17]
Para ello, y como no es posible encontrar todas las posibles divisiones para el conjunto de variables
predictoras se recurre al Recursive Binary Splitting.
El Recursive Binary Splitting es un algoritmo que trata de encontrar en cada una de sus iteraciones
el predictor Xj y el punto de corte s tal que las observaciones en las regiones {X|Xj < s} y {X|Xj ≥ s},
se obtiene la mayor reducción posible del RSS. Cabe destacar que en cada división el algoritmo evalúa
un único predictor mediante una decisión binaria (¾Es X1 > 4? Si/No) y que no tiene en cuenta la
inuencia de la división actual sobre las divisiones futuras.
Donde p̂mk es la proporción de varianza para la clase k en el nodo m. Cuando esta proporción es
cercana a 0 o a 1 el nodo contiene mayoritariamente observaciones de una determinada clase por
lo que p̂mk (1 − p̂mk ) será muy pequeño. Por lo tanto el índice de Gini (G) informa de la pureza
del nodo a razón de cuanto más puro sea, menor será (G).
Information Gain, Cross Entropy: Es una medida para cuanticar el desorden del sistema.
Haciendo referencia a la explicación anterior en este caso el desorden se corresponde con la
impureza del nodo.
K
(2.18)
X
D=− p̂mk log(p̂mk )
k=1
Por lo tanto si D es cercano a cero estaremos ante un nodo de alta pureza. Podemos observar
cómo, al igual que en la fórmula para el índice de Gini, para valores p̂mk la pureza del nodo
aumenta.
Chi Cuadrado: Es un método que trata de comparar los nodos hijo con los nodos padre me-
diante un contraste de bondad de ajuste Chi Cuadrado. Para ello se usa como hipótesis nula la
distribución esperada para cada clase en el nodo parental.
X (Frecuencia Observadak − Frecuencia Esperada )2
χ2 = k
(2.19)
k
Frecuencia Esperadak
Cuanto mayores sean los valores de χ2 mayor evidencia de la diferencia entre los nodos compa-
rados.
A grandes rasgos cada uno de los puntos representa una neurona que realiza una operación sencilla
y está conectada las neuronas de la capa anterior y a las de la capa siguiente de forma ponderada
mediante pesos para regular la importancia de la información propagada. Estos pesos representados
por las echas grises se podrían equiparar a un modelo de regresión lineal, como los tratados en el
apartado 1.1 a los coecientes de regresión para cada variable predictora de modo que entre la neurona
X1 y la neurona A1 se podría estar ponderando el envío de la información de la forma:
Input = w1 X1 + w2 X2 + w3 X3 + w4 X4 + ε (2.20)
donde representamos la información llegada a la neurona A1 (Figura 2.2) como Input. Esta entrada
es la suma ponderada de los pesos w para cada variable predictora de la anterior capa (neuronas
{X1 , X2 , X3 , X4 }). Por último, el término ε representa el sesgo. Si a lo anterior le añadimos que dentro
de la neurona se realiza un segundo proceso sencillo llamado función de activación tendríamos explicado
el funcionamiento de la neurona.
La neurona por lo tanto es un elemento de la red que recibe la suma ponderada por los pesos de cada
una de las neuronas de la capa anterior y en función del resultado de esta suma se aplica una función
de activación que producirá una salida con destino a la siguiente capa. De forma pormenorizada:
Input = XW + ε (2.21)
Donde en lugar se usar el sumatorio de de los pesos ponderados se representa el producto vectorial
en el que X es el vector de valores de entrada, W el vector de los pesos y ε el sesgo.
Figura 2.2: Red neuronal de una sola capa oculta. Fuente: James, Gareth, et al., 2013. [17]
a = g(XW + ϵ) (2.22)
En la capa de entrada, o input layer, la función de activación es sencilla: sale lo mismo que entra ya
que lo que se quiere es únicamente pasar al siguiente nivel el valor de los predictores. En las siguientes
capas (intermedias y de salida) se suelen utilizar otras funciones de activación cómo la función Identidad
en problemas de regresión, ya que devuelve la entrada, o como la función Softmax en problemas de
clasicación ya que transforma las salidas a una representación en forma de probabilidades lo cual es
muy útil.
Aunque la red neuronal simple supuso un gran avance en el aprendizaje estadístico, sólo se podía
2.3. REDES NEURONALES 19
usar para el procesamiento de patrones sencillos. Sin embargo, la investigación demostró que se podían
combinar múltiples capas intermedias ocultas y que al hacerlo la red era más efectiva a la hora de
de modelar patrones muchos más complejos que con el perceptrón simple. De hecho se considera a la
red neuronal multicapa como un aproximador universal para cualquier función [15]. A esta adición de
múltiples capas para modelar problemas más complejos se la considera el inicio de lo conocido como
deep learning.
La estructura de un perceptrón multicapa consta de varias capas ocultas. Cada neurona está co-
nectada a todas las neuronas de la capa anterior y a las de la capa posterior. Las neuronas que forman
parte de una misma capa suelen emplear la misma función de activación. A base de combinar múltiple
capas y funciones de activación no lineal, los modelos de red neuronal multicapa pueden aproximar
cualquier función aunque existen limitaciones como el coste computacional.
Figura 2.4: Representación de una red neuronal multicapa. Fuente: Banco de imágenes sin copyright
https://www.pngegg.com/
La mayoría de las funciones de activación suelen ser sencillas y convertir el valor insertado a la
neurona salidas que toman valores en los rangos (0,1) o (-1,1). Cuando el valor de salida de la neurona
es 0 se dice que está inactiva debido a que no transmite ninguna información a la siguiente capa. Las
funciones de activación más empleadas son:
Rectied linear unit (ReLU): Sólo si el input está por encima de cero. Mientras el valor de
entrada está por debajo de cero, el valor de salida es cero, pero cuando es superior, el valor de
salida aumenta de forma lineal con el de entrada.
ReLU(x) = máx(x, 0)
Softmax: Transforma las salidas a una representación en forma de probabilidades, de tal manera
20 CAPÍTULO 2. MODELOS DE APRENDIZAJE ESTADÍSTICO
Error medio absoluto: MAE, por sus siglas en inglés, consiste en promediar el error absoluto
de todas las predicciones del modelo. Es más robusto frente a los outliers que el MSE y se formula
de la siguiente forma:
n
1X
L(w, b) = |ŷi − yi |
n i=1
Log loss: Es la función de coste utilizada para problemas de clasicación. Cuando la clasicación
es de tipo binaria, donde la variable respuesta es 1 o 0, y p = P r(y = 1), la función de coste log
loss se dene como:
Para problemas de clasicación con más de dos clases, esta fórmula se generaliza a:
2.3. REDES NEURONALES 21
N −1 K−1
1 X X
Llog (Y, P ) = − log Pr(Y |P ) = − yi,k log pi,k
N i=0
k=0
Minimizar la función log Loss en redes neuronales de clasicación multiclase implicaría intuitiva-
mente que la probabilidad para la clase correcta tiende a 1 mientras que a las clases incorrectas
tenderían a 0.
En el pseudo algoritmo anterior intervienen una serie de métodos matemáticos que enumeraremos
y que sin los cuales la optimización de la red sería imposible de alcanzar:
Backpropagation: La propagación hacia atrás es el algoritmo que permite identicar y cuanti-
car la inuencia que tiene cada peso y sesgo en las predicciones nales de la red. Este algoritmo
usa la regla de la cadena se calcula el gradiente (derivadas parciales de la función) lo cual permite
ver que pesos o sesgos inuyen más en el error de la red.
Descenso de gradiente: Este algoritmo de optimización permite, que una vez identicados
mediante backpropagation, el descenso de gradiente permite ir actualizando los pesos y sesgo del
modelo para reducir su error. Debido al alto coste computacional que tiene el calcular el error
para todas las observaciones de entrenamiento se utiliza una modicación llamada método de
descenso de gradiente estocástico. Esta variante consiste en dividir las observaciones en lotes ,
batch en inglés, y actualizar los parámetros de forma progresiva con cada uno. Cabe destacar que
cada vez que se procesan los todos batch de la red se conoce como época.
Preprocesado: El preprocesado constituye las transformaciones previas que deben aplicarse
sobre las variables del modelo. Destaca la binarización, utilizada sobre variables categóricas, para
transformar variables multinivel en variables dummy de forma que por ejemplo una variable con
4 niveles se transformaría en 4 variables de tipo binario informando de la presencia o no del que
informa cada una. Debemos destacar también, en este caso en el campo de las variables numéricas,
el centrado y la estandarización para evitar diferencias entre escalas de la variables. El centrado
consiste en en restarle a cada valor la media de la variable predictora a la que pertenece. La
estandarización, por su parte, consiste en consiste en transformar los datos de forma que todos
los predictores estén aproximadamente en la misma escala.
22 CAPÍTULO 2. MODELOS DE APRENDIZAJE ESTADÍSTICO
Por último debemos hablar de los principales hiperparámetros que intervienen en la construcción
de redes neuronales en las librerías de R o Python que podríamos tener que ajustar en el momento de
implementación:
Número y tamaño de capas: Mientras que el tamaño de las capas de entrada y salida son
parámetros fáciles de denir, ya que el número de neuronas en estas capas se dene en base al
número de predictores y al número de salidas (una en problemas de regresión y tantas como
clases en problemas de optimización) la tarea complicada en este caso sería denir el número y el
tamaño de las capas intermedias. Es una tarea complicada ya que a mayor número de capas, mayor
número de relaciones y complejidad de las mismas, pero también mayor coste computacional y
por tanto mayor tiempo de entrenamiento.
Learning rate: La tasa de aprendizaje del modelo se reere a cómo de bruscos pueden ser los
cambios en los parámetros del modelo a medida que se optimiza. Es el parámetro más complicado
de establecer ya que si es muy grande el algoritmo puede ir saltando de una región a otra del
problema de optimización sin llegar al mínimo nunca, por el contrario si es muy pequeño el
tiempo de entrenamiento se puede prolongar y no llegar a completarse nunca. Generalmente se
utiliza la tasa más pequeña posible en relación al tiempo de entrenamiento y no se utiliza un
valor constante, sino que se suelen usar valores mayores al principio y menores al nal.
Algoritmo de optimización: Los algoritmos antes mencionados (descenso de gradiente y el
descenso de gradiente estocástico) presentan problemas a medida que se aumentan el tamaño de
las redes (tanto en número como en capas), se pueden dar regiones en las que el gradiente es
muy próximo a cero y el algoritmo se estanque. Para ello se han desarrollado modicaciones del
algoritmo de descenso de gradiente que modican la tasa de aprendizaje en función del gradiente
y subgradiente adaptándolo (aumentando o disminuyendo) en función de la región del espacio
en la que se encuentre. Destacamos el algoritmo l-bfgs [18] utilizado para conjuntos de datos
pequeños y adam [16] para conjuntos de datos grandes.
Regularización: Los métodos de regularización tratan de prevenir el sobreajuste y por tanto
la incapacidad de hacer buenas predicciones del modelo. Destacamos las regularizaciones L1, L2
y el Dropout. Las regularizaciones L1 y L2, conocidas también como weight decay consisten en
evitar que los pesos tomen valores excesivamente elevados evitando que ciertas neuronas tomen
un peso exacerbado en el modelo. el Dropout [21] en cambio consiste que en cada iteración del
entrenamiento, se ponen a cero los pesos de una fracción pequeña de neuronas por capa.
2.4.1. Hiperplano
El hiperplano se dene, dado un espacio p−dimensional, cómo un subespacio plano y afín de
dimensiones p − 1. Por ejemplo para un espacio de dos dimensiones el hiperplano sería un recta.
β0 + β1 x1 + β2 x2 + ... + βp xp = 0 (2.23)
donde para todos los parámetros βp y xp se cumple la ecuación anterior si pertenecen al hiperplano.
En caso de que x = (x1 , . . . , xp ) no satisfaga la ecuación planteada, signicará que x cae a un lado
u otro del hiperplano. Con lo cual se podría probar que el hiperplano de dimensión p − 1 divide el
espacio p−dimensional en dos mitades. Para saber en cual de las dos mitades cae x sólo habría que
determinar si:
β0 + β1 x1 + β2 x2 + ... + βp xp > 0
o
β0 + β1 x1 + β2 x2 + ... + βp xp < 0
f (x) = β0 + β1 x1 + β2 x2 + . . . + βp xp (2.24)
El valor de f (x) además informa de la distancia del dato al hiperplano que separa las categorías.
Dado que si existe un hiperplano que separa de forma perfecta un conjunto de datos, está probado que
existen innitos hiperplanos que también lo hacen.
Figura 2.5: Representación de un hiperplano clasicador de máximo margen y sus vectores de soporte.
Fuente: James, Gareth, et al., 2013. [17]
El método de clasicación de máximo margen se basa en seleccionar, de todos los hiperplanos que
separan los datos en dos categorías, aquel hiperplano que tiene el mayor margen. Entendemos margen
24 CAPÍTULO 2. MODELOS DE APRENDIZAJE ESTADÍSTICO
como la distancia mínima de los datos de entrenamiento al hiperplano. Por consiguiente el clasicador
de máximo margen será aquel hiperplano que tenga la distancia mínima de los datos de entrenamiento
al hiperplano mayor.
Las observaciones (x) cuya distancia al hiperplano corresponde al margen son conocidas como
vectores de soporte ya que son vectores en un espacio p−dimensional y denen al hiperplano con
mayor margen (gura 2.5).
Pero los clasicadores de máximo margen a nivel práctico carecen de interés debido a que son
contadas las ocasiones en las que las clases a las que están sujetos los datos son perfecta y linealmente
separables. Y aún cumpliéndose a nivel práctico estas improbables condiciones se presentan otros in-
convenientes como la escasa robustez, por ejemplo una nueva observación introducida podría romper
la separación perfecta necesaria para separar las clases. Otro inconveniente destacable es que el hiper-
plano se ajusta perfectamente a las observaciones de entrenamiento lo cual lleva casi inevitablemente
al sobreajuste.
n
X
ϵi ≤ C
i=1
ϵi ≥ 0 ∀i
tenemos pues un problema de optimización convexa sujeto a una serie de restricciones donde
β0 , β1 , . . . , βp son los parámetros del hiperplano, ϵ1 , . . . , ϵn son variables de holgura y el parámetro
C , de especial relevancia, controla el número y severidad de las violaciones del margen (y del hiper-
plano) que se toleran en el proceso de ajuste. Si C = 0 estaríamos ante el caso particular de un
clasicador de máximo margen (si y sólo si las clases son perfectamente separables). A medida que el
parámetro C se relaja, o se aproxima a ∞ , menos se penalizan los errores y más observaciones de
entrenamiento podrían ser clasicadas incorrectamente durante el entrenamiento. Cuando C es grande
el margen se expande y caen más observaciones en el pasando así a ser vectores de soporte. Ocurre
al contrario para valores de C pequeños, el margen se contrae reduciendo el número de vectores que
denen el hiperplano dando como resultado un clasicador con menor sesgo pero mayor varianza. El
parámetro C se suele obtener por validación cruzada.
2.4. SUPPORT VECTOR MACHINES (SVM) 25
Se debe destacar de este tipo de clasicador que al ser denido por los vectores que caen en el
margen y no tener en cuenta datos al muy alejados es muy robusto frente a datos anómalos. Una vez
más este método presenta limitaciones, la más destacada es su utilización depende de que el límite de
separación entre las clases a las que se adhieren los datos sea lineal.
Figura 2.6: Representación de cómo el Kernel permite al aumentar la dimensión de los datos cla-
sicarlos. Fuente: medium.com/@apurvjain37/support-vector-machine-s-v-m-classiers-and-kernels-
9e13176c9396
Metodología
Para explicar las operaciones que permiten al clasicador de soporte vectorial convertirse en una
máquina de soporte vectorial, debemos presentar un pequeño detalle. El clasicador de soporte vectorial
se puede expresar como una combinación lineal de productos escalares:
n
(2.26)
X
f (x) = β0 + αi x⊤ xi
i∈S
donde x⊤ xi del vector x del dato a clasicar y el vector xi del i−ésimo dato de entrenamiento.
Además debemos de tener en cuenta que nalmente sólo se van a tener en cuenta los índices que formen
parte del soporte del hiperplano (i ∈ S ). Dada esta forma de expresar los datos podemos mostrar cómo
las máquinas de soporte vectorial transforman la dimensión de los datos. Para ello contamos con unas
funciones denominadas Kernel (K ) que lo que hacen es sustituir el producto vectorial original x⊤ xi
por una función Kernel de los datos que devuelve este producto realizado en una dimensión superior
a la original. Al hacer esta sustitución conocida como truco del Kernel obtendremos los vectores de
soporte y el hiperplano que separa los datos en la dimensión correspondiente a la transformación del
Kernel.
Ensamblado y Bootstrap
Independientemente del los modelos de aprendizaje estadístico que nos planteemos utilizar, ya sea
regresión o clasicación, la elección del modelo concreto a utilizar en cada caso es muy importante. En
todo problema de aprendizaje estadístico tratamos de reducir el sesgo y la varianza del mismo. Para
que un modelo sea exible y el sesgo se reduzca, tratamos de incorporar el mayor número de variables
que tengan un peso signicativo, sin embargo, la incorporación de variables al modelo aumenta la
varianza del mismo, implicando esto último el sobreajuste. Este equilibrio entre varianza y sesgo se
debe tener en cuenta en todos los problemas para tratar de obtener un modelo robusto. Una ventaja que
introducen los modelos de ensamblado es que permiten equilibrar este problema si somos coherentes
en su aplicación. Por ejemplo, en caso de que usemos una serie de modelos de base con una alta
varianza y un sesgo bajo, debemos utilizar un método de ensamblado que entre sus características esté
la tendencia a reducir la varianza en el modelo de aprendizaje fuerte como es el caso del Bagging del
que hablaremos en los siguientes apartados.
Los modelos de ensamblado explicados de forma sencilla buscan acoplar, o ensamblar, una serie de
modelos denominados modelos de aprendizaje débil, o modelos de base, para tratar alcanzar un modelo
en el que se consiga un equilibrio entre sesgo y varianza óptimo. Este modelo conseguido a partir del
ensamblado de múltiples modelos débiles se denomina modelo de aprendizaje fuerte. Para conseguir
los modelos de aprendizaje fuerte se pueden usar diferentes técnicas, una forma es usar un único
modelo de base ajustado de distintas formas (ensamblado homogéneo). Otra forma consiste en usar
como modelos de base distintos modelos de aprendizaje de características distintas que combinados
dan lugar un ensamblado heterogéneo.
Los modelos de ensamblado a los que dedicaremos las siguientes secciones serán el Bagging el
cual resulta de especial interés, ya que combina el ensamblado y el Bootstrap, el Boosting el cual
realiza una estrategia en la que cada modelo depende de los anteriores y el Stacking crea un modelo
de predicción basado en las predicciones de los modelos de base.
3.1. Bagging
El nombre de Bagging propuesto por Breiman, L. (1996)[1] proviene de la amalgama de términos
en inglés Bootstrap Aggregation y es un método de ensamblado que se centra en tratar de reducir la
varianza de los modelos de base que lo conforman. Estos modelos de base podrían ser tanto de regresión
como de clasicación que presenten una elevada varianza. Previamente a explicar cómo funciona este
método de ensamblado tocaremos las principales características del método utilizado para la obtención
de diferentes modelos, el Bootstrap.
27
28 CAPÍTULO 3. ENSAMBLADO Y BOOTSTRAP
3.1.1. Bootstrap
El Bootstrap es una técnica estadística de remuestreo que fue propuesta por Efron (1979)[8] . Esta
técnica trata de solucionar el problema de no tener disponibilidad de una gran cantidad de muestras de
la población a la hora de realizar inferencia estadística. En caso de tener una muestra representativa de
la población los valores para la variable aleatoria que componga esta muestra deberían aparecer en igual
proporción que en la población original. El método Bootstrap utiliza esta muestra representativa de la
población, de tamaño n, para obtener un número elevado de remuestras de igual tamaño, o muestras
Bootstrap, pero usando muestreo con reposición. Al usar el muestreo con reposición se consiguen
remuestras que proviniendo de la muestra original no van a contener los mismo datos. Si la muestra es
representativa, la distribución del estadístico que se desee calcular con estas remuestras será semejante
a la distribución muestral del mismo. El Bootstrap hace uso del método de simulación Monte Carlo y
se pueden jar el número remuestras que se desean obtener.
El Bootstrap puede ser usado como método de validación de un modelo de aprendizaje estadístico.
Se usa para comparar modelos debido a que presenta una menor varianza respecto a otros métodos
como podrían ser la los distintos tipos de validación cruzada. Para llevar a cabo este tipo de validación
se seguiría el proceso similar al descrito en Schomaker & Heumann (2014)[20].
1) Obtener un número elevado B de remuestras a partir de la muestra original usando el proceso
descrito anteriormente.
2) Ajustar un modelo para cada remuestra.
3) Calcular el error del modelo en la remuestra y su error de validación utilizando los datos que
se quedan fuera del remuestreo (aproximadamente el 63,2 % en cada remuestreo) para testear el
modelo.
4) Repetir los pasos 1 a 3 tantas veces como muestras tengamos y obtener el promedio del error
de validación que tendrá debido a las propiedades del Bootstrap menor varianza que el que se
obtuviese a partir de la muestra original de datos.
5) Finalmente se ajusta el modelo con los datos de entrenamiento y se comparan con los obtenidos
usando ajustando los datos remuestreados.
La forma en la que se utiliza el Bootstrap es similar aunque con pequeñas variaciones dependiendo
del contexto. En el siguiente apartado resumimos cómo opera dentro del Bagging y el porqué de la
importancia del método.
2) Se ajusta un modelo w(∗) para cada remuestra. Una ventaja que tiene el Bootstrap es que
este proceso se puede paralelizar al ser los ajustes independientes unos de otros:
w1 (∗), . . . , wL (∗)
3) Para cada predictor(es) obtener la respuesta evaluando cada modelo y promediando las pre-
dicciones obtenidas en el caso de la regresión, o la opción más votada (mayoría simple) en el caso
de la clasicación.
L
1X
SL (∗) = wl (∗), para el caso de la regresión
L
l=1
Para reducir la correlación entre los modelos de base y evitar que el algoritmo de agregación no
suponga ninguna mejora respecto a los modelos de base Random Forest elimina la posibilidad de que
las variables predictoras con más peso estén presentes en todos los modelos dominándolos de una forma
bastante sencilla. Para cada modelo de base hace una selección aleatoria de m predictores, de esta forma
un predictor entre los que se incluyen los que tienen más peso no aparecerán en aproximadamente p−m p
árboles de base. Por consiguiente los árboles generados mediante la selección aleatoria de los predictores
serán más heterogéneos y reducirán la correlación entre ellos. Debemos tener en cuenta que el número
de predictores seleccionados aleatoriamente debe ser siempre inferior al número total de predictores
(m < p) por que si m = p el modelo resultante sería un ensamblado Bagging sin ninguna particularidad
reseñable.
Los resultados del Random Forest van a variar siempre en función del valor de m tomado.Para
calcular el valor óptimo de m se puede recurrir a validación cruzada o a evaluar el error del modelo
con las observaciones que no entran en la remuestra Bootstrap en cada modelo ajustado, lo que se
denomina Out of Bag Error. Una ventaja que debe ser comentada es que debido a que en no todos
los árboles de base están presentes los mismos predictores, el Random Forest es muy robusto frente a
datos faltantes.
30 CAPÍTULO 3. ENSAMBLADO Y BOOTSTRAP
3.2. Boosting
Este método de ensamblado, al igual que el Bagging, trata de ajustar una serie de modelos débiles de
base con el objetivo de crear un modelo de aprendizaje fuerte. A diferencia del método de ensamblado
anterior, los modelos de base del Boosting no son independientes ni se pueden ajustar de forma paralela,
sino que se ajustan de forma iterativa teniendo e cuenta los modelos de base ajustados previamente.
Además este método de ensamblado trabaja con modelos de base con varianza reducida y sesgo elevado,
siendo su objetivo fundamental el reducir este último en cada iteración. Por ejemplo en el caso de los
árboles de decisión, elegiríamos árboles con pocas ramas y poca profundidad, es decir, con un sesgo
alto y una varianza reducida.
3) Se construye el modelo de aprendizaje fuerte G(x) ensamblando los modelos de base anterior-
mente calculados y se calculan las prediciones como:
M
X
G(x) = sign[ αm Gm (x)]
m=1
donde sign es la función que obtiene el si la predicción pertenece a −1 o a +1, recordemos que
esta variable en AdaBoost debe estar codicada como Y ∈ {−1, +1}.
2.2) Se ajusta un árbol para los residuos rim dando lugar a las regiones terminales Rjm
donde j = 1, . . . , Jm .
2.3) Calcular: para j = 1, . . . , Jm .
P
yjm = arg mı́n y xi ∈Rjm L(y − i, F m − 1(xi ) + y)
3.3. Stacking
Para nalizar el apartado referido a los métodos de ensamblado deniremos el Stacking, cuyo
mayor punto de diferencia respecto a los métodos anteriores es el uso de modelos de base de distinto tipo
para llegar al modelo nal de aprendizaje fuerte. El uso de modelos heterogéneos a la hora de ajustar
los modelos de aprendizaje débil, permite aprovechar las distintas ventajas que aportan cada uno de
ellos por separado para ajustar nalmente un modelo fuerte, o metamodelo, en base a las predicciones
de los anteriores. Por ejemplo en un problema de clasicación como modelos de base se podrían ajustar
una máquina de soporte vectorial, una regresión logística u otro clasicador posteriormente que otro
clasicador fuerte como una red neuronal tome los resultados de los clasicadores débiles y arroje las
predicciones nales.
El uso de más de un nivel de ajuste de modelos débiles puede traer problemas por la falta de datos,
debido a las divisiones en las que se debe cortar el set de entrenamiento. Esto se puede solucionar con
técnicas como k-fold cross-training, descrito anteriormente, pero al utilizar esta técnica encarecería el
coste computacional debido al numeroso número de modelos que habría que ajustar.
Capítulo 4
4.1. Librerías de R
Destacaremos la librería Caret[4] de R y algunas de las funciones empleadas para el tratamiento
de los datos y el ajuste de los modelos en el presente capítulo:
Caret[4]: es una librería de R que se utiliza para el procesamiento de datos de aprendizaje au-
tomático y el análisis de clasicación y regresión. La librería proporciona una interfaz unicada para
múltiples algoritmos de aprendizaje automático, lo que permite a los usuarios seleccionar y ajustar
modelos de forma más eciente. También incluye funciones para la evaluación de modelos, el preproce-
samiento de datos y la generación de grácos. El grueso de los análisis y construcción de de modelos del
presente apartado se realizarán con las funciones que proporciona esta librería. Dentro de esta librería
destacaremos algunas de las funciones más relevantes:
trainControl: Esta función nos permitirá seleccionar el método de validación del modelo, en
nuestros problemas elegiremos validación cruzada repetida.
train: Es la función más importante de la librería ya que con ella ajustaremos los diferentes
modelos. El argumento method permite seleccionar una amplia gama de modelos de aprendizaje
estadístico para construir el algoritmo.
Predict: Aunque esta función es del paquete stats será la que nos permita evaluar los modelos
construidos sobre el conjunto de test.
33
34 CAPÍTULO 4. APLICACIÓN DE LOS MODELOS A PROBLEMAS REALES
confusionMatrix: Es la función con la que se pueden obtener las principales medidas de interés
para las predicciones de un modelo de clasicación. Crea una matriz de confusión como la descrita
en el primer capítulo del trabajo y calcula de forma simultánea las medidas de interés.
caretEnsemble: Esta función permite apilar varios modelos de base utilizando un modelo fuerte
como ensamblador para construir un ensamblado tipo Stacking.
4.2. Aplicación
4.2.1. Problema 1
Para el primer problema que vamos a tratar utilizaremos los datos descargados del repositorio de
UCI Machine Learning "Heart Failure" que consiste en un conjunto de datos de carácter médico que
fueron usados en el artículo Chicco, Davide; Jurman, Giuseppe (2020)[6] para tratar de predecir la
eventual muerte de un paciente en seguimiento en función de una serie de predictores. El conjunto
consta de 13 variables, tanto cuantitativas como cualitativas, y un total de 299 observaciones. Las
variables usadas fueron:
División de los datos para entrenamiento y test: Tras haber realizado el preprocesado de los
datos el data set consta de 298 observaciones y hemos conseguido reducir las variables predictoras
a cuatro (age, ejection_fraction, serum_creatinine, serum_sodium). Nuestra variable respuesta
será la muerte del paciente (DEATH_EVENT) y para proceder a ajustar los distintos modelos
primeramente dividimos el conjunto de datos en dos partes. La primera que recogerá un 70 % de
las observaciones se se destinará al set de entrenamiento con el cual se ajustarán los modelos. El
30 % restante de los datos se destinará a al set de test que será utilizado para evaluar la ecacia
de los modelos a la hora de realizar predicciones fuera del conjunto de entrenamiento.
Una vez tenemos los datos separados en el conjunto de entrenamiento y de test pasamos a ajustar
los distintos modelos, en este caso y con la ayuda de la librería Caret:
Regresión Logística
Árbol de clasicación
Red neuronal
SVM con núcleo lineal
Random Forest
Gradient Boosting
Stacking: conformado por un árbol de clasicación, un SVM de núcleo lineal y una red neuronal
como modelos de base ensamblados mediante un Random Forest.
Resultados
En el cuadro 4.1 podemos observar la comparativa para medidas de precisión para los distintos
modelos ajustados. Estas medidas de precisión se calcularon usando una matriz de confusión con
los datos resultado de evaluar los modelos sobre el set de datos de test. Para ello se usó la función
confusionMatrix del paquete Caret[4]. Las medidas que se han tenido en cuenta son la precisión,
la sensibilidad, la especicidad y la precisión balanceada.
Cuadro 4.1: Resultados sobre los datos de test para los modelos entrenados en el problema 1
Modelos Precisión Sensibilidad Especicidad Precisión balanceada
Podemos observar los modelos obtienen unas puntuaciones de rendimiento muy parejas, siendo el
Random Forest el modelo que destaca entre todos. En el gráco 4.1. Cabe destacar que en un primer
momento, el Random Forest fue el modelo que obtuvo las peores puntuaciones en la predicción. Esto
puede explicarse, por que al usar un método de selección de variables por ltrado sbf del paquete
Caret[4] se redujeron notablemente las variables predictoras. Si volvemos al apartado 3.1.3 veremos
que una de las características de los modelos tipo Bagging, y en particular del Random Forest, debido
es que tratan de ajustar modelos de base con un alto componente de varianza. Esto se debe a que son
modelos de ensamblado que se comportan como reductores de esa varianza, por lo que necesitábamos
que los árboles que componen el ensamblado tuviesen numerosos nodos y considerable profundidad,
lo cual reduciendo los predictores a del modelo a cuatro era una tarea imposible. Por lo tanto, para
el entrenamiento del Random Forest se recurrió al conjunto completo de variables predictoras para
conseguir los modelos de base con la máxima varianza posible. Como consecuencia podemos observar
que es el modelo que mayor puntuación obtiene en las predicciones.
Podemos observar en la gura 4.1 de forma gráca y ordenada la puntuación de los diferentes
modelos.
Figura 4.1: Precisión evaluada con datos de test según el modelo utilizado. Donde A.C. un
es Árbol de Clasicación. ST es un modelo de Stacking conformado por un árbol de clasicación, un
SVM de núcleo lineal y una red neuronal como modelos de base ensamblados mediante un Random
Forest. RL es una Regresión Logística. NNET es una red neuronal. GB es un modelo de ensamblado
de Gradient Boosting de tipo estocástico. RF es un Random Forest entrenado con el número máximo
de predictores del modelo.
4.2.2. Problema 2
Para el segundo problema que vamos a tratar volvemos a acudir al repositorio de UCI Machine
Learning, esta vez para descargarnos los datos de Concrete Strength que consiste en un conjunto
de datos relativo a ingeniería de materiales que fueron usados en el artículo Yeh, I.-C. (1998))[23]
para tratar de predecir la resistencia del hormigón (concrete ) en función de una serie de predictores
relativos a los componentes utilizados en la mezcla para fabricar hormigón y el tiempo pasado desde
su fabricación. El conjunto de datos consta de 9 variables de tipo cuantitativo y un total de 1030
observaciones. Las variables usadas fueron:
4.2. APLICACIÓN 37
cement: componente utilizado para la construcción que se endurece a otros materiales para
unirlos. (kg/m3 )
blast_f_r,: Mezcla de óxidos metálicos y dióxido de silicio. (kg/m3 )
y_ash: producto de la combustión del carbón. Se compone de las partículas que se expulsan
de las calderas de carbón junto con los gases de combustión. (kg/m3 )
Water: Augua utiliza para formar la pasta espesa. (kg/m3 )
Superplasticizer: componente utilizado en la fabricación de hormigón de alta resistencia.
(kg/m3 )
coarse_agg: trozos de rocas que se obtienen de los depósitos del suelo. (kg/m3 )
ne_agg: trozos de rocas cuyo tamaño es menor de 4,75 mm. (kg/m3 )
age: Momento en días desde su creación en que se evaluó la muestra. (dias)
concrete strength: Unidad de medida de la resistencia del hormigón.(M P a)
Una vez tenemos los datos separados en el conjunto de entrenamiento y de test pasamos a ajustar
los distintos modelos, en este caso y con la ayuda de la librería Caret:
Regresión Lineal Múltiple
Árbol de regresión
GAM con Spline
Random Forest
Gradient Boosting
Stacking: Conformado por los modelos anteriores como modelos de base exceptuando el Gradient
Boosting y utilizando como modelo de ensamblado un modelo lineal generalizado.
38 CAPÍTULO 4. APLICACIÓN DE LOS MODELOS A PROBLEMAS REALES
Resultados
En el cuadro 4.2 podemos observar la comparativa para medidas de precisión para los distintos
modelos ajustados. Para este problema hemos recurrido a las medidas de precisión pertinentes para
medir el rendimiento de los distintos modelos ajustados en el problema. Una vez más, como en el
problema anterior, las medidas se realizan con las predicciones del modelo construido con los datos
de entrenamiento sobre los datos de test y se comparan con las observaciones reales. Para ello se han
tenido en cuenta como evaluadores del rendimiento el pseudo coeciente de determinación R̃2 ,
la raíz cuadrada del error cuadrático medio (RM SE ) y el error medio absoluto (M AE ).
Cuadro 4.2: Resultados sobre los datos de test para los modelos entrenados en el problema 2
Modelos R̃2 RMSE MAE
Podemos observar los modelos que obtienen mejores resultados son claramente los modelos de
ensamblado estadístico rondando un R̃2 de 0,90. En el gráco de la gura 4.2 podemos observar de
forma gráca y ordenada según el coeciente R̃2 para cada modelo de menor a mayor precisión el
mejor rendimiento señalado para los métodos de ensamblado. En este caso el mejor modelo, evaluado
sobre las predicciones en el test sería el Gradient Boosting.
Al respecto de las puntuaciones obtenidas en la evaluación de los modelos sobre los datos de test,
llama la atención el bajo rendimiento del modelo lineal múltiple. Por lo que nos disponemos a tratar
de explicar el porqué de ello.
Primeramente creamos un gráco de correlaciones entre las variables que se usan en el modelo
(predictores y respuesta) utilizando la función ggpairs de la librería GGally [19]. En la gura 4.3
observamos la baja correlación que hay entre las variables predictoras del modelo respecto a la variable
respuesta, lo cual puede empezar a darnos pistas sobre el bajo rendimiento del modelo. También
podemos concluir, a la vista del gráco, que no existen altas correlaciones entre los predictores del
modelo aunque en ciertas ocasiones sean más altas entre ellos que con la propia variable respuesta, lo
cual es reseñable.
Además de analizar la correlación entre las variables del modelo, analizamos la normalidad de los
errores del modelo para comprobar si se cumple el supuesto de normalidad. A la vista del gráco
QQ-Plot presentado en 4.4 podemos descartar la ausencia de normalidad en los errores del modelo y
el consiguiente cumplimiento del citado supuesto.
Por último y observando el gráco contenido en la gura 4.5 que representa la dispersión de los
residuos respecto a los valores ajustados del modelo podemos detectar uno de los principales problemas
4.2. APLICACIÓN 39
Figura 4.2: Precisión evaluada con datos de test según el modelo utilizado. LM es un modelo
de regresión lineal múltiple. A.R. es un Árbol de Regresión. Gam Sp. es un modelo aditivo generalizado
con Splines. Stack es un modelo de Stacking conformado, una regresión lineal múltiple, un GAM con
Splines, un Árbol de Regresión y un Random Forest. GB es un modelo de ensamblado de Gradient
Boosting de tipo estocástico. RF es un Random Forest entrenado con el número máximo de predictores
del modelo.
Como consecuencia de los puntos explicados anteriormente, el modelo de regresión lineal múltiple
ajustado no es válido y produce unas predicciones pésimas al probarlo en la práctica. Por esta razón
sus medidas de evaluación en los datos de test han resultado tan malas.
40 CAPÍTULO 4. APLICACIÓN DE LOS MODELOS A PROBLEMAS REALES
Figura 4.4: QQ-Plot de los errores del modelo lineal múltiple del problema 2.
Figura 4.5: Gráco que representa la dispersión de los errores del modelo lineal múltiple del problema
2.
Capítulo 5
Conclusiones y reexiones.
En el presente trabajo hemos revisado diferentes técnicas de aprendizaje estadístico supervisado
y sus aplicaciones. Se han revisado tanto técnicas que inicialmente formaron parte de la estadística
clásica como técnicas que surgieron bajo el paradigma del aprendizaje estadístico. En este último
apartado hemos querido probar las diferentes técnicas estudiadas y observar su comportamiento en dos
problemas reales. Aunque el segundo problema quizá se ha podido observar mejor cómo los métodos de
ensamblado mejoran la capacidad del aprendizaje estadístico para aumentar su rendimiento, es posible
que en el primer problema no se haya podido observar debido al tamaño reducido de datos.
Se ha tratado a la par, de estudiar cómo las técnicas de ensamblado junto con el Bootstrap per-
miten combinar las fortalezas de distintos modelos de aprendizaje estadístico con el n de mejorar su
rendimiento y obtener el modelo que mejor se adapte a extraer la máxima cantidad de información de
valor de los datos que tratamos de medir. Hemos visto cómo a través de los métodos de ensamblado
se puede equilibrar el sesgo y varianza de los modelos de aprendizaje estadístico. Cómo partiendo de
un conjunto de modelos con un alto sesgo se pueden obtener muy buenas predicciones utilizando el
Boosting o cómo partiendo de modelos con una elevada varianza se pueden conformar ensamblados
equilibrados, como es el caso del Bagging.
41
42 CAPÍTULO 5. CONCLUSIONES Y REFLEXIONES.
Apéndice A
Código utilizado
1 ##################################################################################
2 ##################################################################################
7 ##################################################################################
8 ##################################################################################
9 ###################################### P1 -- Clasificación
######################
10 #0 - Preanálisis :
11 getwd ()
12 setwd (" G :/ Mi unidad /00 _TFM_22 / TFM / Definitivo_21_07 / Análisis ")
13
14 # Librerías
15 library ( dplyr )
16 library ( ggplot2 )
17 library ( readxl )
18 library ( gmodels )
19 library ( Hmisc )
20 library ( ggthemes )
21 library ( caret )
22 library ( caretEnsemble )
23 library ( kernlab )
24 library ( gam )
25 # library ( MASS ) # Se invocará cuando sea necesaria , entra en conflicto la
función select de dplyr .
26 library ( lmtest )
27 library ( GGally )
28
29 #1 - Cargamos los datos :
30
31 datos_r = read . csv ( ' heart_failure_clinical_records_dataset . csv ' , header = TRUE ,
32 sep = " ," ,
43
44 APÉNDICE A. CÓDIGO UTILIZADO
33 quote = "\"" ,
34 dec = "." )
35
36 # Tenemos 299 observaciones de 13 variables .
37
38 # Análisis Exploratorio :
39
40 # Variables :
41 # - age : Edad del paciente en años
42 # - anaemia : disminución de glóbulos rojos o hemoglobina ( booleana )
43 # - high blood pressure : si el paciente tiene hipertensión ( booleano )
44 # - creatinine phosphokinase ( CPK ) : nivel de la enzima CPK en la sangre ( mcg / L )
45 # - diabetes : si el paciente tiene diabetes ( booleano )
46 # - ejection fraction : porcentaje de sangre que sale del corazón en cada
contracción ( porcentaje )
47 # - platelets : plaquetas en la sangre ( kiloplaquetas / mL )
48 # - sex : mujer u hombre ( binario )
49 # - serum creatinine : nivel de creatinina sérica en la sangre ( mg / dL )
50 # - serum sodium : nivel de sodio sérico en la sangre ( mEq / L )
51 # - smoking : si el paciente fuma o no ( booleano )
52 # - time : período de seguimiento ( días )
53 # - [ target ] death event : si el paciente falleció durante el período de
seguimiento ( booleano )
54
55 glimpse ( datos_r )
56
57 # Transformamos la variables categóricas en factores :
58
59 to_factor = c ( ' anaemia ' , ' high_blood_pressure ' , ' diabetes ' , ' sex ' , ' smoking ' , '
DEATH_EVENT ')
60
61 # lo hacemos con la función lapply
62
63 datos_r [ to_factor ] <- lapply ( datos_r [ to_factor ] , factor )
64
65 # añadimos etiquetas
66
67 # variable v1 is coded 1 , 2 or 3
68 # we want to attach value labels 1= red , 2= blue , 3= green
69
70 datos_r$anaemia <- factor ( datos_r$anaemia ,
71 levels = c (0 ,1) ,
72 labels = c (" no " , " si ") )
73
74 datos_r$diabetes <- factor ( datos_r$diabetes ,
75 levels = c (0 ,1) ,
76 labels = c (" no " , " si ") )
77
78 datos_r$high_blood_pressure <- factor ( datos_r$high_blood_pressure ,
79 levels = c (0 ,1) ,
80 labels = c (" no " , " si ") )
81
82 datos_r$sex <- factor ( datos_r$sex ,
83 levels = c (0 ,1) ,
84 labels = c (" mujer " , " hombre ") )
85
45
127
128 #
129
130 # Se crea una semilla para cada partición y cada repetición : el vector debe
131 # tener B +1 semillas donde B = particiones * repeticiones .
132 particiones = 10
133 repeticiones = 5
46 APÉNDICE A. CÓDIGO UTILIZADO
155
156 # Usaremos las variables predictoras proporcionadas para tratar de ajustar un
modelo capaz de predecir
157 # si el paciente muere o no
158
159 # Regresión Logística
160 # Árbol de clasificación
161 # Red neuronal
162 # SVM
163 # Random Forest
164 # Gradient Boosting
165 # Stacking
166
167 # Creamos el set de entrenamiento y el set de test :
168
169 set . seed (8)
170
171 # Seleccionamos las filas aleatoriamente cogiendo el 80 % de las observaciones
172 filas_entrenamiento <- createDataPartition ( datos$DEATH_EVENT , p =0.7 , list =
FALSE )
173
174 # Creamos el set de entrenamiento
175 trainData <- datos [ filas_entrenamiento ,]
176
177 # Creamos el set de test
178 testData <- datos [ - filas_entrenamiento ,]
179
180
181
182
183 # Creamos la matriz de observaciones de predicciones y el vector de respuestas
47
184
185 x = trainData [ , -1 ]
186 y = trainData [ ,1]
187
188 summary ( x )
189 summary ( y )
190
191
192
193 # DEFINICIÓN DEL ENTRENAMIENTO
194 #===============================================================================
195 # Logística
196 set . seed (12345)
197
198 control_train <- trainControl ( method = ' repeatedcv ' ,
199 number = 5 ,
200 repeats = 5 ,
201 search = ' random ')
202
203
204
205 logist <- train (x , y , method = 'glm ' ,
206 trControl = control_train ,
207 preProcess = " center " ,
208 family = ' binomial ')
209
210
211 summary ( logist )
212
213 # parece que la variable serukm sodim no es significativa en el modelo , lo
ajustamos sin ella :
214
215 logist <- train ( x [ , -4] , y , method = 'glm ',
216 trControl = control_train ,
217 preProcess = " center " ,
218 family = ' binomial ')
219
220 summary ( logist )
221
222 # Test de las predicciones del modelo :
223
224 test_pred_logist <- predict ( logist , newdata = testData )
225 test_pred_logist
226
227 # Matriz de confusión :
228 confusionMatrix ( test_pred_logist , testData [ ,1] , positive = " si " )
229
230
231
232 # parece que la variable age se podría retirar del modelo , lo ajustamos sin
ella :
233
234 # x2 = trainData [ , c (3 ,4) ]
235 # y2 = trainData [ ,1]
236 # T2 = trainData [ , c (1 ,3 ,4) ]
48 APÉNDICE A. CÓDIGO UTILIZADO
237 #
238 # summary ( T2 )
239 #
240 #
241 # logist < - train ( x2 , y2 , method = 'glm ' ,
242 # trControl = control_train ,
243 # preProcess = " center " ,
244 # family = ' binomial ')
245 #
246 # summary ( logist )
247
248
249 ## Test de las predicciones del modelo :
250 #
251 # test_pred_logist <- predict ( logist , newdata = testData )
252 # test_pred_logist
253 #
254 ## Matriz de confusión :
255 # confusionMatrix ( test_pred_logist , testData [ ,1] )
256 #
257 #
258 # Predice mejor el que incluye la edad
259
260 # Árbol de clasificación
261 set . seed (12345)
262
263 control_train <- trainControl ( method = ' repeatedcv ' ,
264 number = 5 ,
265 repeats = 5 ,
266 search = ' random ')
267
268
269
270
271 class_tree <- train (x , y , method =" rpart " , trControl = control_train , preProcess
= " center ")
272 test_pred_class_tree <- predict ( class_tree , newdata = testData )
273 test_pred_class_tree
274
275 confusionMatrix ( test_pred_class_tree , testData [ ,1] , positive = " si ")
276
277
278
279 # NNET
280 set . seed (12345)
281 control_train <- trainControl ( method = ' repeatedcv ' ,
282 number = 5 ,
283 repeats = 5 ,
284 search = ' random ')
285
286
287 nnet <- train (x , y , method = " nnet " , trControl = control_train , preProcess = c ( '
center ' , ' scale ') , tuneLength = 10)
288 nnet$modelInfo
289 nnet$results
290 nnet$bestTune
49
291
292 test_pred_nnet <- predict ( nnet , newdata = testData )
293 test_pred_nnet
294
295 confusionMatrix ( test_pred_nnet , testData [ ,1] )
296
297 # SVM
298 set . seed (12345)
299 control_train <- trainControl ( method = ' repeatedcv ' ,
300 number = 5 ,
301 repeats = 5 ,
302 search = ' random ')
303
304 SVM <- train ( DEATH_EVENT ~. , data = trainData , method =" svmLinear " , trControl =
control_train , preProcess = c (" center " ," scale ") )
305
306 test_pred_SVM <- predict ( SVM , newdata = testData )
307 test_pred_SVM
308
309 confusionMatrix ( test_pred_SVM , testData [ ,1] )
310
311 # RF
312
313 set . seed (12345)
314 control_train <- trainControl ( method = ' repeatedcv ' ,
315 number = 5 ,
316 repeats = 5 ,
317 search = ' random ')
318
319 # Para el randomforest utilizamos todos los predictores disponibles
320
321 mtry <- sqrt ( ncol ( x) )
322 tunegrid <- expand . grid (. mtry = mtry )
323
324 # Creamos el set de entrenamiento y el set de test :
325
326 set . seed (8)
327
328 # Seleccionamos las filas aleatoriamente cogiendo el 80 % de las observaciones
329 filas_entrenamiento_r <- createDataPartition ( datos_r$DEATH_EVENT , p =0.7 , list =
FALSE )
330
331 # Creamos el set de entrenamiento
332 trainData_r <- datos_r [ filas_entrenamiento ,]
333
334 # Creamos el set de test
335 testData_r <- datos_r [ - filas_entrenamiento ,]
336
337
338 x_r = trainData_r [ , -13]
339 y_r = trainData_r [ ,13]
340
341 RF <- train ( x_r , y_r , method = " rf " , trControl = control_train , tuneLength = 15
, metric = ' Accuracy ' , tuneGrid = tunegrid )
342
343
50 APÉNDICE A. CÓDIGO UTILIZADO
397
398 algorithmList <- c ( ' rpart ' , ' svmLinear ' , ' nnet ')
399
400
401 model_base <- caretList ( DEATH_EVENT ~ . , data = trainData , trControl = control
, methodList = algorithmList , metric = " ROC ")
402
403 res <- resamples ( model_base )
404 summary ( res )
405
406
407 # Stack
408 stackControl <- trainControl ( method = " repeatedcv " , number = 5 , repeats = 5 ,
savePredictions = TRUE , classProbs = TRUE , verboseIter = TRUE )
409
410 stack <- caretStack ( model_base , method = " rf " , metric = " Accuracy " , trControl
= stackControl )
411
412 # Predict
413
414 stack_val_preds <- predict ( stack , newdata = testData )
415 stack_val_preds
416
417 confusionMatrix ( stack_val_preds , testData [ ,1] )
418
419
420 ################################################################
421 #########
422 ######### Plots y tablas
423 ################################################################
424
425 Modelos_Clasif = c ( ' R . Logística ' , ' Arbol de Clasificación ' , ' NNET ' , 'SVM ', '
Random Forest ' , ' Gradient Boosting ' , ' Stacking ')
426 Accuracy = round ( c (0.75 , 0.7159 , 0.7614 , 0.7727 , 0.8636 , 0.7614 , 0.7386 )
,2)
427 Sensitivity = round (c (0.4286 ,0.8167 ,0.9167 ,0.9167 ,0.9667 ,0.8833 ,0.8667) ,2)
428 Specificity = round (c (0.9000 ,0.5000 ,0.4286 ,0.4643 ,0.6429 ,0.5000 ,0.4643) ,2)
429 Balanced_Accuracy = round ( c (0.6643 ,0.6583 ,0.6726 ,0.6905 ,0.8048 ,0.6917 ,0.6655) ,2)
430
431 Tabla = rbind ( Modelos_Clasif , Accuracy , Sensitivity , Specificity , Balanced_Accuracy
)
432
433 colnames ( Tabla ) <- Modelos_Clasif
434
435 Tabla = t ( Tabla )
436 Tabla = data . frame ( Tabla )
437 Tabla$Modelos_Clasif <- factor ( Tabla$Modelos_Clasif ,
438 levels = Modelos_Clasif ,
439 labels = c ( ' R . L . ' , ' A . C . ' ,' NNET ' , ' SVM ' , ' RF ' , ' GB ', ' ST '
))
440
441
442 Tabla = Tabla [ order ( Tabla$Accuracy ) ,]
443
444
445
52 APÉNDICE A. CÓDIGO UTILIZADO
446
447
448
449 plot ( Tabla [ ,2] , ylim = c (0:1) , xaxt = " n " , pch =19 , col =2 , xlab = " Modelos " , ylab
= ' Precisión ', cex =1.5)
450 axis (1 , at =1:7 , labels = c ( ' A . C . ' , ' ST ' , ' R . L. ' , ' NNET ' , 'GB ' , ' SVM ' , ' RF ' ) )
451
452
453
454 barplot ( as . numeric ( Tabla [ ,2]) , ylim = c (0 ,1) , xlab = " Modelos " , ylab = ' Precisión ' ,
names . arg = c ( ' A . C . ' , ' ST ' , ' R . L. ' , ' NNET ' , 'GB ' , ' SVM ' , ' RF ' ) ,
455 col = '# FFCC66 ')
456
457 axis (2 , at = seq ( from = 0 , to = 1 , by = 0.1) )
458
459 ########################################################################################
460 ########################################################################################
461 ########################################################################################
468 ########################################################################################
469 #0 - Preanálisis :
470
471 #1 - Cargamos los datos :
472
473 datos_conc = read . csv ( ' Concrete_Data . csv ' , header = T )
474
475 # Datos de salida ( Posibles Variables respuesta )
476 ###################################################################################
477
478 # Cement ( component 1) -- quantitative -- kg in a m3 mixture -- Input Variable
479
480 # Blast Furnace Slag ( component 2) -- quantitative -- kg in a m3 mixture --
Input Variable
481
482 # Fly Ash ( component 3) -- quantitative -- kg in a m3 mixture -- Input Variable
483
484 # Water ( component 4) -- quantitative -- kg in a m3 mixture -- Input Variable
485
486 # Superplasticizer ( component 5) -- quantitative -- kg in a m3 mixture -- Input
Variable
487
53
500
501
502 glimpse ( datos_conc )
503 summary ( datos_conc )
504
505
506 # Comprobamos si hay NA y duplicados
507
508
509 anyNA ( datos_conc )
510
511 nrow ( datos_conc [ duplicated ( datos_conc ) , ])
512
513
514 # No hay NA en nuestros datos .
515
516 # hay datos duplicados asique procedemos a eliminarlos :
517
518 datos_conc = distinct ( datos_conc )
519
520
521
522 # Descartamos los datos relativos al tiempo de seguimiento , ya que el tiempo
durante el que se ha observado al paciente no influye en
523 # el resultado de muerte o supervivencia
524
525
526 ###########################################################################
527
528
529 # ver que varibales presentan varianza proxima a acero
530 datos_conc %> % select ( Cement , blast_f_r , fly_ash , water , superplasticizer ,
coarse_agg , fine_agg , age , cc_strength ) %> % nearZeroVar ( saveMetrics = TRUE )
531
532 # FILTRADO DE PREDICTORES por CV
533 #
=============================================================================
534
535 #
536
54 APÉNDICE A. CÓDIGO UTILIZADO
537 # Se crea una semilla para cada partición y cada repetición : el vector debe
538 # tener B +1 semillas donde B = particiones * repeticiones .
539 particiones = 10
540 repeticiones = 5
541 set . seed (123)
542 seeds <- sample . int (1000 , particiones * repeticiones + 1)
543
544 # Control del filtrado
545 ctrl_filtrado <- sbfControl ( functions = rfSBF , method = " repeatedcv " ,
546 number = particiones , repeats = repeticiones ,
547 seeds = seeds , verbose = FALSE ,
548 saveDetails = TRUE , allowParallel = TRUE )
549 set . seed (234)
550 rf_sbf <- sbf ( cc_strength ~ . , data = datos_conc ,
551 sbfControl = ctrl_filtrado ,
552 # argumentos para el modelo de evaluación
553 ntree = 500)
554
555 rf_sbf$optVariables
556 # Variables predictoras seleccionadas ( cc_strength ,age , blast_f_r , coarse_agg ,
fly_ash , water )
557
558 datos = datos_conc %> % select ( cc_strength ,age , blast_f_r , coarse_agg ,
fine_agg , fly_ash , water )
559
560
561
562
563
564 ###############################################################################
567
568 # Usaremos las variables predictoras proporcionadas para tratar de ajustar un
modelo capaz de predecir
569 # si el paciente muere o no
570
571 # Regresión Lineal Múltiple
572 # Árbol de regresión
573 # Red neuronal
574 # SVM
575 # Random Forest
576 # Gradient Boosting
577 # Stacking
578
579
580 # Estandarizamos los datos debido a las diferencias de escala entre los
diferentes predictores
581 # maxs <- apply ( datos , 2 , max )
582 # mins <- apply ( datos , 2 , min )
583 # datos <- as . data . frame ( scale ( datos , center = mins ,
584 # scale = maxs - mins ) )
585
586
55
587
588
589 # Create a partition for training and testing
590 set . seed (12345)
591 inTrain <- createDataPartition ( y = datos$cc_strength , p = 0.7 , list = FALSE )
592
593 # Create training and test sets
594 training <- datos [ inTrain ,]
595 testing <- datos [ - inTrain ,]
596
597 # usaremos para evaluar
598
599 # R2
600 # RMSE
601 # MAE
602
603 # LM
604 ##################################################################
605
606 set . seed (12345)
607 control_train <- trainControl ( method = ' repeatedcv ' ,
608 number = 5 ,
609 repeats = 5 ,
610 search = ' random ')
611
612 LM <- train ( cc_strength ~ . , data = training , method = 'lm ' ,
613 preProcess = c ( ' center ' , ' scale ') , trControl = control_train )
614
615 maxs <- apply ( datos , 2 , max )
616 mins <- apply ( datos , 2 , min )
617 datos2 <- as . data . frame ( scale ( datos , center = mins ,
618 scale = maxs - mins ) )
619
620 LM2 <- lm ( cc_strength ~ . , data = datos2 )
621
622 summary ( LM2 )
623
624
625 plot ( LM2 )
626
627 # Residuos normales pero leverage
628
629
630 # Predict on the test set
631 pred <- predict ( LM , testing )
632
633 LM_Stat = data . frame ( Model = ' LM ' ,
634 R2 = R2 ( pred , testing$cc_strength ) ,
635 RMSE = RMSE ( pred , testing$cc_strength ) ,
636 MAE = MAE ( pred , testing$cc_strength )
637 )
638
639
640 ##### QUe pasa con el modelo de regresión lineal múltiple ? Diagnóstico :
641
642 summary ( LM2 )
56 APÉNDICE A. CÓDIGO UTILIZADO
643
644 x = LM2$residuals
645 ks . test ( LM2$residuals )
646 ks . test (x , " pnorm " , mean =0 , sd = sd ( x ) ) # el error es normal
647
648 plot ( LM2 )
649
650
651
652
653 # Test Breusch - Pagan :
654
655 plot ( LM2$fitted . values , stdres ( LM2 ) , xlab = ' Valores ajustados ' , ylab = ' Residuos
estandarizados ') # H0 : Los errores no son Homocedásticos
656
657 bptest ( LM2 ) # Se rechaza la homocedasticidad
658
659 ################################################################
660 # Observamos la hipótesis de linealidad
661
662 ggpairs ( datos , lower = list ( continuous = " smooth ") ,
663 diag = list ( continuous = " barDiag ") , axisLabels = " none ")
664
665
666
667
668 # No param
#######################################################################
669 set . seed (12345)
670 control_train <- trainControl ( method = ' repeatedcv ' ,
671 number = 5 ,
672 repeats = 5 ,
673 search = ' random ')
674
675 Gamspline <- train ( cc_strength ~ . , data = training , method = " gamSpline " ,
preProcess = c ( ' center ' , ' scale ') , trControl = control_train , df =6)
676
677 # Predict on the test set
678 pred <- predict ( Gamspline , testing )
679
680 # Evaluate the model
681 GamSp_stat = data . frame ( Model = ' Gam . Sp . ' ,
682 R2 = R2 ( pred , testing$cc_strength ) ,
683 RMSE = RMSE ( pred , testing$cc_strength ) ,
684 MAE = MAE ( pred , testing$cc_strength )
685 )
686
687 # Regression_tree #############################################################
688 set . seed (12345)
689 control_train <- trainControl ( method = ' repeatedcv ' ,
690 number = 5 ,
691 repeats = 5 ,
692 search = ' random ')
693
694 Regre_tree <- train ( cc_strength ~ . , data = training , method = " rpart " ,
preProcess = c ( ' center ' , ' scale ') , trControl = control_train )
57
695
696 # Predict on the test set
697 pred <- predict ( Regre_tree , testing )
698
699 # Evaluate the model
700 Arbol_clas_stat = data . frame ( Model = ' A. R . ' ,
701 R2 = R2 ( pred , testing$cc_strength ) ,
702 RMSE = RMSE ( pred , testing$cc_strength ) ,
703 MAE = MAE ( pred , testing$cc_strength )
704 )
705
706 # Regression_Randomforest ##################################################
707
708 set . seed (12345)
709 RFTrain <- createDataPartition ( y = datos$cc_strength , p = 0.7 , list = FALSE )
710
711 # Create training and test sets
712 RFtraining <- datos [ RFTrain ,]
713 RFtesting <- datos [ - RFTrain ,]
714
715
716
717
718 set . seed (145)
719 control_train <- trainControl ( method = ' repeatedcv ' ,
720 number = 5 ,
721 repeats = 5 ,
722 search = ' random ')
723
724
725 Regre_RF <- train ( cc_strength ~ . , data = RFtraining , method = " rf " , preProcess
= c ( ' center ' , ' scale ') , trControl = control_train )
726
727 # Predict on the test set
728 pred <- predict ( Regre_RF , RFtesting )
729
730 # Evaluate the model
731 RF_stat = data . frame ( Model = ' RF ' ,
732 R2 = R2 ( pred , RFtesting$cc_strength ) ,
733 RMSE = RMSE ( pred , RFtesting$cc_strength ) ,
734 MAE = MAE ( pred , RFtesting$cc_strength )
735 )
736
737
738
739
740 # Gradient Stochastic Boosting ######################################
741 set . seed (12345)
742 control_train <- trainControl ( method = ' repeatedcv ' ,
743 number = 5 ,
744 repeats = 5 ,
745 search = ' random ')
746
747
748 BGLM <- train ( cc_strength ~ . , data = training , method = " gbm " , preProcess = c
( ' center ' , ' scale ') , trControl = control_train )
58 APÉNDICE A. CÓDIGO UTILIZADO
749
750 # Predict on the test set
751 pred <- predict ( BGLM , testing )
752
753
754 # Evaluate the model
755 GB_stat = data . frame ( Model = 'GB ' ,
756 R2 = R2 ( pred , testing$cc_strength ) ,
757 RMSE = RMSE ( pred , testing$cc_strength ) ,
758 MAE = MAE ( pred , testing$cc_strength )
759 )
760
761
762 # Stacking ##########################################################
763 # Stacking
764
765 set . seed (12345)
766
767 trainControl <- trainControl ( method =" repeatedcv " ,
768 number =10 ,
769 repeats =5 ,
770 savePredictions = TRUE )
771
772 modelos_base <- c ( ' lm ' ," gamSpline " ," rpart " ," rf ")
773
774
775
776
777 # Ensemble models
778
779
780 set . seed (100)
781 modelos_base_s <- caretList ( cc_strength ~. , data = training ,
782 trControl = trainControl ,
783 methodList = modelos_base )
784
785
786
787 # Combine Predictions from multiple models
788 set . seed (12345)
789
790 stackControl <- trainControl ( method =" repeatedcv " ,
791 number =10 ,
792 repeats =5 ,
793 savePredictions = TRUE )
794
795 # Ensemble the predictions of ` models ` to form a new combined prediction based
on glm
796 stack . glm <- caretStack ( modelos_base_s , method =" glm " , trControl = stackControl ,
preProcess = c ( ' center ' , ' scale ') , tuneLength = 10)
797 print ( stack . glm )
798
799 stack_pred <- predict ( stack . glm , newdata = testing )
800
801
802 # Evaluate the model
59
61
62 BIBLIOGRAFÍA
[18] NOCEDAL, Jorge. Updating quasi-Newton matrices with limited storage. Mathematics of compu-
tation, 1980, vol. 35, no 151, p. 773-782.
[19] SCHLOERKE, Barret; CROWLEY, Jason; COOK, Di. Package 'GGally'. Extension to 'gg-
plot2.'See, 2018, vol. 713.
[20] SCHOMAKER, Michael; HEUMANN, Christian. Model selection and model averaging after mul-
tiple imputation. Computational Statistics & Data Analysis, 2014, vol. 71, p. 758-770.
[21] SRIVASTAVA, Nitish, et al. Dropout: a simple way to prevent neural networks from overtting.
The journal of machine learning research, 2014, vol. 15, no 1, p. 1929-1958.
[22] THIELE, Jan; MARKUSSEN, Bo. Potential of GLMM in modelling invasive spread. CABI Re-
views, 2012, no 2012, p. 1-10.
[23] YEH, I.-C. Modeling of strength of high-performance concrete using articial neural networks.
Cement and Concrete research, 1998, vol. 28, no 12, p. 1797-1808.