Regresión Lineal
Esta técnica es uno de las herramientas más sencillas desde las que comenzar nuestro viaje a través del Machine Learning. Como muchos otros modelos, el objetivo es llegar predecir el comportamiento de ciertas variables a través del análisis de un conjunto de datos que hemos recopilado previamente.
1.1 – ¿Qué es la Regresión?
Como muchos otros de los fundamentos del Machine Learning, los orígenes del proceso de regresión se remontan profundamente en el pasado. Francis Galton, primo de Darwin y pionero de la genética, analizaba las tendencias de ciertos parámetros biológicos, específicamente el de la estatura humana. Se dio cuenta de que la naturaleza aborrece los casos extremos y que estos parámetros oscilaban entorno a una media. Incluso los hijos de padres de gran estatura, tendían a ser más pequeños y regresar a esa media.
La naturaleza se expresa con cierto orden. Y es posible analizar las relaciones que existen entre diferentes variables. En líneas generales la regresión nos permite descubrir ese orden y llegar a predecir el valor de una variable, llamada variable dependiente, como puede ser la estatura. Esta predicción se realiza a partir de una o varias variables independientes que, siguiendo nuestro ejemplo, podrían ser el sexo, la altura de los progenitores.
La Regresión Lineal es una técnica utilizada en el Aprendizaje Supervisado, dado que el material de trabajo son datos ya etiquetados. Veámoslo de este modo: si queremos predecir la altura de cualquier individuo a partir de una variable, necesitamos datos en bruto de muchos individuos de los cuales ya conocemos su estatura.

1.2 – El modelo de Regresión Lineal
Tomemos el caso de la altura e intentemos crear un algoritmo que nos permita predecir la estatura de una determinada persona a partir de una variable de la que sospechamos que exista una relación: el peso.
El material con el que partimos es un conjunto de estimaciones ya realizadas, mostradas en la gráfica como puntos sobre el plano. Esto es algo característico de la regresión lineal y en general de todo el Machine Learning: necesitamos datos del mundo real con los que trabajar.
Matemáticamente, nuestro objetivo es hallar el valor de un parámetro, que llamaremos \( \theta_1\), el cual multiplica a la variable predictora \(x\) «peso». Este parámetro pondera la relación entre ambas variables y es esperable que sea positivo \( \theta_1 > 0\), es decir, que refleje que, a mayor peso, mayor altura.
Además de este parámetro es necesario incluir un segundo parámetro \( \theta_0\), el llamado sesgo, el cual es necesario también estimar. No tiene una interpretación real al no estar asociado a ninguna variable explicativa, como si tiene \( \theta_1\) que representa la «importancia» de la variable peso. Es por ello que no lo denominamos predictor. Pero es necesario para establecer un punto de partida y permite afinar aun más nuestras predicciones.
Finalmente, todo ello da forma a nuestro modelo de regresión lineal:
$$alturaPredicha = \theta_0 + \theta_1peso$$
Esta expresión es un ejemplo de ecuación lineal, una ecuación que si la graficamos nos devuelve una línea recta sobre el plano.
La expresión general sería esta:
$$\hat{y} = \theta_0 + \theta_1 x_1$$
que devolverá una predicción \(\hat{y}\) de la variable real a predecir \( y \):
Modelo de Regresión Lineal
Imaginemos que hemos tomado el peso y la altura de una clase de 24 alumnos. Nuestro objetivo es crear un modelo que cuantifique la relación entre estas variables y, en última instancia, pueda ser usado para realizar predicciones con otros sujetos que no sean los mismos alumnos. En la gráfica de arriba podréis ver el modelo tanto en su forma gráfica (una línea sobre el plano), como en forma de ecuación lineal y comprobar cómo podemos modificarlo manipulando sus dos parámetros. \( \theta_1\) define la pendiente de la recta, mientras que \( \theta_0\) determina el punto de corte con el eje vertical. Aunque no sea interpretable, si queremos que el modelo/recta de regresión se ajuste a los datos, es necesario tener en cuenta \( \theta_0\).
Poniendo un ejemplo, si suponemos unos parámetros \( \theta_0 = \) 100 y un \( \theta_1 = \) 0.5, la altura que estima este modelo para el caso de un alumno de 80 kilos de peso sería:
\( 110 + 0.5 \cdot 80 = 140 \)
1.3 – Regresión Lineal Múltiple
En regresión lineal lo habitual es utilizar más de una variable predictora. Siguiendo con el ejemplo previo, sospechamos que la edad es otro predictor muy importante para estimar la altura por lo que podemos incluirlo en el modelo:
$$alturaPredicha = \theta_0 + \theta_1peso + \theta_2edad$$
Los modelos de regresión que incluyan más de una variable predictora se conocen como modelos de regresión múltiple. Cada nuevo predictor tendrá su correspondiente parámetro \( \theta \) que cuantifique su relevancia. Mostramos aquí una generalización de la expresión para el caso de \( j \) predictores:
$$\hat{y} = \theta_0 + \theta_1x_1 + \theta_2x_2 \cdots + \theta_jx_j$$
Aunque matemáticamente esta expresión es precisa y sencilla hay que tener en cuenta que su representación gráfica solo es posible cuando contamos con una o dos predictores. Aunque las herramientas visuales pueden ayudarnos a comprender intuitivamente el problema, en muchas ocasiones estas pueden llegar a hacerlo mucho más complejo y es preferible valerse de las expresiones matemáticas.
Regresión Lineal Múltiple
Un modelo de dos parámetros formaría un plano sobre un espacio tridimensional, mientras que para visualizar tres o más predictores se requerirían dimensiones mayores que no son intuitivas de comprender gráficamente. En este plano tridimensional, el modelo forma un plano controlado por los parámetros. \( \theta_0 \) sería el sesgo, \( \theta_1 \) el parámetro asociado al predictor peso y \( \theta_2 \) al de edad. Por simplicidad, en los ejemplos posteriores mostraremos un modelo con un solo predictor más el sesgo.
1.4 – Mínimos cuadrados
El modelo de Regresión Lineal nos ofrece una predicción que podemos comparar con los valores reales. Evidentemente nos interesan una predicción que sea lo más cercana posibles a los datos reales. En términos matemáticos, debemos buscar aquellos valores que minimicen la diferencia entre la variable a predecir \( y \) y la predicción del modelo \( \hat{y} \).
Los mínimos cuadrados es una técnica que permite cuantificar este error o diferencia entre ambos valores. Esta diferencia entre el pronóstico y el valor real se eleva al cuadrado. La razón es que cualquier número elevado al cuadrado es positivo y queremos operar con diferencias positivas sin importar si ese error es por exceso o por defecto. Otra razón es que al elevar al cuadrado las diferencias mayores son más penalizadas.
\( (y -\, \hat{y})^2 \)
La diferencia se calcula para cada uno de las instancias con los que contamos para luego sumarlas todas. Por último es también usual dividir la suma al completo entre el número \( n \) de instancias para obtener el Error Cuadrático Medio (en inglés MSE: Mean Squared Error):
$$\frac{1}{n} \displaystyle \sum_{i=1}^{n} (y_i -\, \hat{y}_i)^2$$
Esta cantidad es la medida del error que debemos reducir al mínimo para acercar las predicciones de nuestro modelo a los datos reales, de ahí el nombre de este método.
Mínimos cuadrados
Al modificar los parámetros del modelo -la pendiente y el punto de corte de la recta- podemos alejarnos o acercarnos a los valores reales. Las líneas punteadas representan las diferencias \( y -\, \hat{y} \) para cada una de las veinticuatro instancias \( i \). Modificar los parámetros para acortar estas diferencias nos devuelve un error menor.
1.5 – La función de pérdida
Los mínimos cuadrados es una de las muchas técnicas utilizadas para cuantificar el error de nuestras predicciones. Todas ellas se agrupan bajo lo que conocemos como función de pérdida (Loss function, o también función de error o función de coste, denotada como \( \mathcal{L}(y, \hat{y}) \). En el caso de los mínimos cuadrados vistos en la página previa la función de pérdida sería
$$ \mathcal{L}(y_i, \hat{y}_i) = \frac{1}{n} \displaystyle \sum_{i=1}^{n} (y_i -\, \hat{y}_i)^2$$
Otra alternativa sería el Error Cuadrático Absoluto:
$$ \mathcal{L}(y_i, \hat{y}_i) = \displaystyle \sum_{i=1}^{n} (y_i -\, \hat{y}_i)^2$$
No existe excesiva diferencia entre una u otra. De momento supondremos que son equivalentes.
Al medir lo equivocado que está nuestro modelo, la función de pérdida permite establecer un criterio de calidad. Recordemos que en gran parte del Machine Learning, aprendizaje implica estimar los valores óptimos de los parámetros. Pero para que sea realmente un aprendizaje de máquina, esta optimización no debe hacerse manualmente sino que debemos buscar un algoritmo que realice esa búsqueda de forma automática.
Función de pérdida
En la gráfica de la derecha podéis ver representada la función de error en forma de gradiente de color y cuyos valores dependen de los dos parámetros utilizados en el modelo de regresión lineal. Así es fácil visualizar lo que podíamos intuir en la sección previa: los valores más bajos de la función de error se encuentran en la zona más oscura, cuando los parámetros tienen un valor entre 110 y 120 para \( \theta_{0} \) y entre 0.8 y 0.6 para \( \theta_{1} \). Son esos valores los que nos interesa para alcanzar un modelo preciso.
1.6 – El gradiente de la función de pérdida
Contamos con un modelo de predicción y un método para evaluar esas predicciones ¿Pero como las optimizamos? ¿Cómo elegimos los valores de los parámetros que minimicen el error? Aquí es donde entra el gradiente de la función de pérdida.
Para cada punto de dicha función podemos calcular su gradiente, es decir, su tendencia a incrementarse o reducirse cuando modificamos los parámetros. Este gradiente es una generalización de lo que en matemáticas se conoce como derivada: el ritmo de cambio de la función respecto a una variable. La derivada nos indica la tendencia de la función, es decir si su valor se incrementa o disminuye. El ejemplo más intuitivo es la velocidad, que no es otra cosa que el ritmo de cambio de la distancia recorrida respecto al tiempo.
En el caso de nuestro ejemplo la función de pérdida \( \mathcal{L} \) depende de dos parámetros \( \theta_0 \) y \( \theta_1 \). Su derivada parcial la denotamos como
$$ \frac{\partial \mathcal{L}}{\partial \theta_j} $$
para el parámetro \( j \). Esta derivada se calcula independientemente para cada parámetro (de ahí lo de parcial) tomando el resto como constantes. La resolución de la derivada se sale de los objetivos de este taller. Simplemente diremos que, usando como función de pérdida el Error Cuadrático Medio descrito en el apartado anterior, la derivada parcial de \( \mathcal{L} \) es:
$$ \frac{\partial \mathcal{L}}{\partial \theta_j} = \frac{1}{n} \displaystyle \sum_{i=1}^{n} -2x_i(y_i – \hat{y}_i)$$
respecto a cada parámetro \( \theta_j \) si \( j \gt 0 \).
Si nos damos cuenta, el cálculo de la derivada es directo.
Derivada de la función de pérdida
Esta gráfica muestra la misma función de pérdida \( \mathcal{L} \) de los apartados anteriores, esta vez respecto al parámetro \( \theta_1 \), manteniendo fijo el otro parámetro \( \theta_0 \) en 110. Para cada valor del parámetro vemos no solo cuanto vale \( \mathcal{L} \) (en magenta), sino el gradiente de la función de pérdida en forma de pendiente o derivada \( \frac{\partial \mathcal{L}}{\partial \theta_j} \) (en morado). En la práctica desconocemos la forma de la función de pérdida, pero sí podemos calcular su valor, y por tanto su derivada para un valor específico del parámetro y así adivinar su tendencia. Podemos comprobar como el punto que nos interesa alcanzar, en el que \( \mathcal{L} \) es mínima, es aquel en el el valor de la derivada sea cercano a 0, cuando la derivada es plana. Es evidente que, si la derivada es positiva, debemos reducir el valor del parámetro para alcanzar ese mínimo. Si la derivada es negativa, es necesario aumentarlo.
1.7 – Descenso del gradiente
Nuestro objetivo es modificar los parámetros de manera que la función de pérdida sea lo mínima posible. Por el cálculo del gradiente del apartado anterior sabemos que el valor del parámetro que buscamos es aquel en el que la derivada parcial de la función de pérdida respecto a dicho parámetro sea lo más cercano posible a 0. Tan solo tenemos que dejarnos guiar por dicho gradiente hasta encontrar ese punto.
Ahora bien, en Machine Learning este proceso es realizado por un algoritmo conocido como Descenso del Gradiente que podemos describir así: nuestro modelo comienza con unos valores aleatorios en los parámetros. Calculamos la derivada de la función de pérdida en ese punto, que nos da la tendencia del error y determinamos si es necesario aumentar o reducir el valor del parámetro. Definimos el nuevo valor del parámetro \( \theta_j’ \) como el valor previo \( \theta_j \) menos una cierta cantidad determinada el gradiente de la función de pérdida.
\( \theta_j’ = \theta_j -\, \alpha \frac{\partial \mathcal{L}}{\theta_j} \)
Comprobamos que si la derivada es negativa, entonces el nuevo valor es ligeramente mayor que el anterior, tal y como indicamos en la sección anterior.
Casi nunca logramos alcanzar los parámetros óptimos en un solo paso. Esta iteración se realiza una y otra vez en bucle, con todos los parámetros cada vez, hasta que finalmente logramos localizar los valores que minimizan la función de pérdida. El valor \( \alpha \) es un metaparámetro conocido como tasa de aprendizaje y determina simplemente el tamaño de la actualización del parámetro en cada iteración. Este metaparámetro es muy importante porque influye directamente en el número de pasos necesarios hasta alcanzar el mínimo error. Un valor desajustado de la tasa de aprendizaje puede hacer que el aprendizaje sea o demasiado lento o demasiado rápido y caótico.
Descenso del gradiente
Pulsa en cualquier punto de la gráfica y el algoritmo irá actualizando en bucle los valores de ambos parámetros hasta alcanzar el punto mínimo de error, el «fondo» del mapa. Podéis ver la ruta que sigue la iteración, el descenso del gradiente. Cuando termina ese descenso podéis ver el valor final del error y el número de iteraciones que han sido necesarias para llegar hasta abajo. También es posible modificar la tasa de aprendizaje \( \alpha \) del parámetro \( \theta_1 \). Si \( \alpha \) es demasiado baja, serán necesarios muchos más pasos hasta alcanzar el mínimo (en la gráfica el número de pasos está limitado a 400). Si por el contrario es demasiado alta, puede que nunca llegue a converger del todo en el mínimo. \( \alpha \) es por tanto un meta-parámetro que es necesario seleccionar a priori «manualmente». Valores habituales suelen oscilar entre 0.01 y 0.1.
1.8 – Descenso del gradiente estocástico
Hemos visto el descenso del gradiente como un proceso iterativo por el que se repiten una y otra vez los siguientes pasos: a) Obtenemos las diferencias entre las predicciones y los valores reales b) Calculamos las derivadas parciales de esos errores respecto a cada parámetro c) Actualizamos a nuevos parámetros a partir de dichas derivadas ponderadas por la tasa de aprendizaje.
Existen dos alternativas a este proceso en lo que respecta al primero de los pasos. La diferencia estriba en la cuantía de datos que se utilizan obtener esas diferencias. En los ejemplos anteriores habíamos dado por hecho que se utiliza la totalidad del conjunto de datos, algo que se conoce como Batch Gradient Descent. Por el contrario, se conoce como Descenso del Gradiente Estocástico o SGD (Stochastic Gradient Descent) a la estrategia de calcular el error a partir de un único dato tomado aleatoriamente. Al no reflejar exactamente el estado global de la optimización sobre todo el dataset, las actualizaciones suelen ser más ruidosas y la trayectoria puede parecer más errática. Su ventaja reside en la rapidez de las iteraciones, especialmente en conjuntos inmensos de datos. El uso de SGD suele implicar un configuración aún más delicada de la tasa de entrenamiento y lo habitual es que los valores sean más bajos frente al Batch Gradient Descent.
En la práctica lo habitual es un compromiso entre estos dos extremos: el uso de lotes o mini-batches de datos para el cálculo del error, logrando un equilibro entre estabilidad y celeridad en la optimización.
Descenso del gradiente estocástico
Podemos observar claramente como la actualización de los parámetros estimando el gradiente a partir de un único datos se refleja en actualizaciones más ruidosas.