Introducción a los modelos supervisados

Nov 7, 2022 | MACHINE LEARNING

La mayoría de los modelos de Machine Learning se pueden dividir en supervisados y no supervisados. Se llaman “supervisados” cuando en el conjunto de datos tenemos unas cuantas variables de predicción y una variable resultado, y nuestro objetivo es definir la función capaz de reproducir la variable resultado (y). Un ejemplo es predecir el precio de una casa en base a su edad, tamaño y lugar. En un modelo no supervisado no disponemos de una variable objetivo, sino que nuestro objetivo es, generalizando, entender la relación entre las variables. Por ejemplo, podríamos utilizar un análisis clúster para definir grupos de casas similares basadas en sus características (edad, tamaño, lugar y precio). En este caso el precio no es nuestro objetivo.

¡No te pierdas ningún nuevo vídeo!

Visita mi canal de Youtube

Pero a continuación vamos a ver que es un modelo supervisado y cómo se desarrolla. Como hemos comentado, un modelo supervisado supone tener una variable objetivo que queremos predecir. Para esta introducción me utilizaré el problema propuesto por Andrew Wolf en su libro “Machine Learning Simplified. El objetivo de nuestro modelo supervisado es predecir el tipo de fruta en base a la altura y al ancho y disponemos de la siguiente tabla:

 En la tabla anterior tenemos una serie de filas y columnas. Las filas son observaciones, es decir que cada una hace referencia una entidad, objeto o persona (en nuestro caso una fruta), mientras que las columnas son variables, o características de esta entidad.

menu importar desde web Power Query

Las variables (columnas) se dividen en variables de entrada (predictoras) y una variable objetivo (resultado). Las variables predictoras se suelen identificar con “X” mientras que la variable objetivo con “Y”. Sin embargo, para las primeras (x), se suele añadir un subíndice para saber de que variable se trata, normalmente representado por j = 1, …., p,  es decir que “j” representa las variables predictoras del número 1 al número “p”, y su representación es “Xj”. En nuestro ejemplo tenemos (p=2) es decir dos variables predictoras (p=2): X1 y X2.

Sin embargo, también tenemos diferentes observaciones. Por ello, para identificar un punto de datos específico (data point) nos referimos al número de fila i = 1, … n. Es decir que un punto de datos específico está representado por xij , es decir el valor de la variable predictora “j” y la observación “i”. A veces podemos encontrar “i” y “j” en el subíndice, o podemos mejor diferenciarlas con “j” en un superíndice y “i” en un subíndice ( ). Por otro lado, si hablamos de la variable objetivo, solo necesitaremos “i” para identificar la observación (o fila): yi. En la tabla anterior, y1, sería “Mandarina”.

Para entender mejor el concepto de observación, podemos visualizar los datos en un gráfico de dispersión (scatter plot) que normalmente se utiliza cuando queremos visualizar diferentes data points de dos variables. Cada eje del gráfico representa una característica (variable de entrada) y cada punto en el gráfico es una observación y es el resultado de la intersección de la altura y del ancho de cada fruta. Para visualizar también la variable resultado, podemos usar un color específico para cada tipo de fruta.

Analizando los datos de gráfico, podemos identificar algún patrón para identificar el tipo de fruta en base a altura y ancho. Observamos que con una anchura mayor que 7 centímetros y una altura de entre 7 y 8, podemos predecir que se trata de una manzana. El objetivo de un modelo supervisado es hacer justo esto, pero de una manera más sistemática y precisa. Para conseguir eso, el modelo necesita aprender una función de predicción capaz de identificar cada tipo de fruta en base a sus características. La función de predicción se puede escribir de una forma muy general como:

Y = f(X) + ε.

En nuestro modelo “Y” es el tipo de fruta que tiene una relación específica (“f”) con una serie de características (“X”). “f” representa una función específica (desconocida) de las variables predictoras mientras que “ε” representa el error aleatorio, que es independiente de “X”. Dicho de otra forma, el tipo de fruta (Y) se puede determinar utilizando una función de las características “X” y el error aleatorio. Aquí es muy importante subrayar el adjetivo “desconocido”, es decir que no conocemos f(x) y el objetivo del científico de datos es generar una función que más se acerque a la función real. Esta función la podemos denominar con el símbolo  y el proceso de aproximarla a f consiste en disminuir el error “reducible”, es decir el error que somo capaces de limitar mejorando nuestra función. Por otro lado, tenemos un error que es “irreducible” (ε) que no es posible predecir utilizando “x”, y por ello no podemos disminuirlo.

La elección de la función de predicción es un paso muy importante en la creación de un modelo supervisado y depende de varios factores, como la naturaleza del problema o el tipo de variables utilizadas. Normalmente, podemos utilizar más de una función para resolver el mismo problema y la elección será en base a sus puntos fuertes y débiles. Pero la mejor manera de elegir la función es utilizar varias y luego escoger la que presente el mejor resultado. No voy a profundizar en como elegir la función a estas alturas, pero sí que merece la pena hacer un inciso sobre las dos principales razones para utilizar un modelo supervisado, que son importantes la hora de elegir una función: predicción o inferencia. En el primer caso, la función a elegir es la con el mayor poder de predicción. En el segundo, la estructura de la función es más importante dado que el objetivo es responder a otras preguntas, como por ejemplo cual es la relación entre cada variable predictora y la variable objetivo. ¿La altura de la fruta es significativa para determinar el tipo? Pero vamos a verlo mejor con un caso práctico.

Para resolver nuestro problema de determinar el tipo de fruta, podemos utilizar KNN (K-Nearest Neighbor), una función que clasifica las observaciones en base a la similitud o cercanía con un cierto número de observaciones. Este número de observaciones utilizadas se representa por “k” y es un parámetro para definir. 

introducción modelos supervisados - knn

 

Para poder predecir el tipo de fruta de una observación, si utilizamos un modelo con K=1, la función buscará la observación más cercana a la que queremos predecir, y el tipo de fruta de esta observación cercana será nuestra predicción. Esto es lo que he hecho en el siguiente gráfico donde podemos ver las áreas de “decisión”, es decir que podemos saber cómo será clasificada una nueva observación en base a su altura y ancho.

    La elección de la función de predicción KNN puede funcionar bien para el objetivo de predecir el tipo de fruta, pero si nuestro objetivo fuera inferencial (digamos para saber si la altura de la fruta es determinante para el tipo), no sería el mejor modelo. De hecho, la función de este modelo primero determina la distancia entre los puntos y luego clasifica un nuevo punto en base al tipo de fruta de los k puntos cercanos. Con este cálculo, no podemos ver claramente si y cómo la altura determina el tipo de fruta. En este caso sería mejor utilizar otra función de predicción, como la regresión logística, dado que esta función permite extrapolar la importancia de las características. A veces nos referimos a este problema como el compromiso entre flexibilidad e interpretación, o precisión e interpretación. Un modelo KNN no infiere ningún patrón o generalización sobre la estructura de los datos, sino que utiliza un enfoque “no-paramétrico” para predecir el tipo de fruta. Por otro lado, una regresión logística infiere que la función de predicción tiene una cierta estructura, limitando la flexibilidad del modelo, pero haciéndolo más interpretable. Este tipo de modelo se llama “paramétrico” porque asume que la función de “x” para predecir “y” tiene una cierta forma, y a partir de ello entrena el modelo para estimar los parámetros de la misma (utilizando una función de coste, que explicaré más adelante).

    Volviendo a nuestro objetivo de predecir el tipo de fruta, una vez decidida la función de predicción, tenemos que valorar el resultado. Como puedes imaginar los métodos utilizados cambian significativamente si valoramos un modelo de clasificación o un modelo de regresión por ejemplo para estimar un valor en lugar de una categoría. En el primer caso, el rendimiento se valorará en base al número de aciertos y en el segundo caso en base a la diferencia entre el valor real y el valor estimado.

    En términos estadísticos (o de machine learning), una “función de coste” (loss function) es el método a través del cual podemos ver la bondad de ajuste de nuestro modelo. Como dice su nombre, esta calcula el “coste” debido al error de nuestro modelo que, cuanto más lejos de la realidad, más coste supondrá. Aquí hay que hacer un inciso. La función de coste puede utilizarse tanto en el mismo modelo para su optimización, como para valorar su ajuste. En el ejemplo anterior, un modelo KNN no tiene una función de coste implícita que mejore su ajuste dado que este tiene una regla fija: asigna la categoría en base a los k vecinos más cercanos. En este caso, lo que podemos hacer es valorar el resultado y cambiar k. Por otro lado, si utilizamos una regresión lineal, por ejemplo, se suele utilizar una función de coste de error cuadrático para definir la línea que mejor se ajusta a los datos, así optimizando el resultado del modelo.

    Sin entrar en demasiados detalles de momento (hablaré de las funciones específicas cuando presentaré diferentes modelos), podemos generalizar nuestra función de coste así:

    L ( ŷ , y )

    donde “L” representa la función de coste, “ŷ” el valor estimado, mientras que “y” es el valor real. En lugar de “ŷ” podrías encontrar en su lugar “f(x)” es decir la función de predicción aplicada a la variable de entrada, cuyo resultado sería “ŷ”. Para nuestro modelo KNN, la función de coste podría ser la tasa de error (miscalculation rate) que se representa matemáticamente de la siguiente manera:

    donde básicamente contamos el número de “no aciertos” desde el primero caso (i=1) hasta el último caso (n) y los dividimos por el número de casos que tenemos (1/n).

    Vemos que en este nuevo conjunto de datos empezamos a ver errores ya que los nuevos tipos de fruta no caen en las áreas correspondientes. Este es un claro problema de sobreajuste (overfitting), es decir que nuestro modelo se ha adaptado demasiado a los detalles y peculiaridades del conjunto de datos de entrenamiento en lugar de adaptarse a los patrones generales que definen el tipo de fruta en base a altura y ancho. El problema contrario sería un subajuste, es decir cuando nuestro modelo es demasiado simple y su predicción es mala. En ejemplo extremo es utilizar el tipo de fruta más presente, manzana, y predecir que todas sean manzanas. Esto, reflejado en nuestro KNN, sería poner k igual al número total de frutos que tenemos, de manera que el algoritmo asigne cada nuevo punto a la categoría más representada.

    Nuestro modelo tiene que encontrar un equilibrio entre unas áreas de decisión sobreajustadas (k = 1) y una única área muy simplificada (k = n). Como podemos ver en la imagen con k = 5, las áreas son más simples que en k = 1 y nos da un ajuste óptimo para predecir un nuevo conjunto de datos. Para definir esta área, lo que se ha hecho es definir diferentes áreas de decisión con diferentes k, aplicar los resultados al conjunto de prueba (test) y elegir el k con menor tasa de error. Este proceso se refiere a la gestión de la complejidad del modelo cuyo objetivo es definir un modelo general con un equilibrio entre sobreajuste y subajuste modificando una serie de “hiper-parámetros”. En nuestro simple modelo el parámetro que modificar es k, es decir el número de puntos cercanos que utilizamos para predecir el tipo de fruta de un nuevo punto. En el gráfico podemos ver como cambia la tasa de error (en los datos de test) al cambiar k, siendo el mejor punto alrededor de 5.

    Puedes descargar la plantilla R con el código que he utilizado en este post, solo tienes que darte de alta!