En este tutorial vamos a ver cómo entrenar un modelo de regresión lineal en Python.
La manera más sencilla de explicar una regresión lineal es:
Una Línea Recta.
Imagina que tienes un conjunto de datos como el de la imagen.
Si te pido que dibujes una línea recta que pase lo más cerca posible de todos los puntos en la imagen...
¿Podrías?
Ese es el objetivo de un modelo de regresión lineal. Aproximar de la mejor manera posible los datos que tenemos (el dataset de entrenamiento) con una línea recta de manera que podamos predecir nuevos valores que no hemos visto antes.
No siempre va a funcionar bien ya que dependiendo del caso habrá muchos puntos que quedan muy lejos de nuestro modelo (la línea recta) pero en Machine Learning es uno de los modelos más simples que hay.
Una regresión lineal simple es el caso en el que nuestro modelo sólo va a recibir una característica a partir de la cual va a predecir el valor que queremos saber.
En el ejemplo anterior, la característica sería los ingresos de los vecinos del bloque y la variable objetivo sería el precio de la vivienda.
El modelo de regresión lineal simple está definido por los coeficientes w0 y w1
, que son los valores que se ajustan durante el entrenamiento.
Una regresión lineal múltiple es aquella en la que tenemos más de una característica de entrada.
Además de los ingresos de los vecinos podríamos, otras cosas que pueden afectar el precio de una vivienda podría ser el número de habitaciones, la antigüedad de la vivienda o la distancia al mar, por ejemplo.
Todas ellas serían características y tendremos un coeficiente del modelo de regresión lineal múltiple por cada característica que tengamos.
La desventaja, es que a partir de dos características de entrada ya no se puede dibujar el resultado 🤷♀️
El ejemplo que más veces te encontrarás a lo largo de tu viaje como ninja de los datos es el de predecir el precio de la vivienda.
Es un clásico.
Es el ejemplo que vamos a abordar hoy y el que hemos estado utilizando en las secciones anteriores.
Vamos a utilizar el dataset de los precios de la vivienda en California y un Notebook de Google Colab. No es necesario que te instales nada, solo te hace falta una cuenta en Google 🙂
Para poder utilizar el dataset directamente en Google Colab sólo tienes que seguir este tutorial.
Para entrenar un modelo de regresión lineal tenemos que tener claro nuestro objetivo:
🎯 Encontrar los coeficientes del modelo que consigan que la línea recta se ajuste lo mejor posible a nuestros datos.
Para ello seguiremos los siguientes pasos:
Esta métrica nos indica el error en nuestra predicción según vamos ajustando los coeficientes del modelo.
El error es la diferencia entre el precio real de la vivienda y el precio que hemos estimado con nuestro modelo de regresión lineal.
En algunas ocasiones la predicción será un precio superior al real y en otras será un precio inferior. Para que los errores no se compensen unos con otros se elevan al cuadrado, así siempre serán positivos y se penalizan más cuanto más grandes son.
Una vez hemos calculado el error cuadrático para cada muestra de nuestro dataset, obtendremos el valor medio sumándolas todas y dividiendo por el número de muestras.
La métrica elegida para este modelo de Machine Learning es el Error Cuadrático Medio (MSE por sus siglas en inglés).
En este caso esta métrica también será la función de coste, que es la función que intentaremos minimizar.
Si conseguimos reducir todo lo que podamos la función de coste habremos conseguido ajustar los coeficientes de nuestro modelo de manera óptima a los datos que tenemos.
Para eso usaremos el algoritmo de descenso de gradiente.
Este algoritmo es capaz de calcular de manera iterativa un mínimo de la función de coste.
Funciona de manera similar a si quisieras bajar una montaña con una venda en los ojos.
alpha
El cálculo del gradiente se realiza para cada uno de los coeficientes del modelo de regresión lineal. Si estamos en el caso de regresión lineal simple sería para w0
y w1
.
En el caso de la función de coste (J(w0,w1)
) que hemos elegido, el gradiente de cada coeficiente se corresponden con estas fórmulas.
Sí, lo que ves ahí son derivadas parciales. Pero que no cunda el pánico que son de las fáciles y además te doy la solución 😉
Cada vez que repitamos el proceso iremos actualizando los coeficientes de nuestro modelo:
alpha
es un hiperparámetro del modelo y en principio es fijo. Se corresponde con "cuanto queremos avanzar" en la dirección del gradiente y se elige antes de comenzar a entrenar el modelo.
No es como los coeficientes que se van actualizando durante el proceso de entrenamiento del modelo.
Cuando hayamos llegado al número de iteraciones que nos habíamos propuesto o el error sea lo suficientemente pequeño, habremos terminado de entrenar nuestro modelo 🙂
Ahora que ya sabemos un poco cómo funciona un modelo de regresión lineal y cómo se entrena vamos a hacerlo en Numpy.
Recordad que partimos del tutorial en el que descargábamos el dataset desde Kaggle a Google Colab así después del último paso de ese tutorial lo siguiente es coger las columnas que nos van a interesar para entrenar el modelo.
import numpy as np # Por si acaso no lo has importado antes ;) x_train = np.array(housing_data['median_income']) y_train = np.array(housing_data['median_house_value'])/10000 # dividimos para que tengan la misma escala
Lo primero que vamos a hacer es definir una función que nos calcule la función de coste para el caso de regresión lineal simple. Es decir predecimos el precio de la vivienda a partir de los ingresos de los vecinos del bloque.
Definimos ahora una función que calcule el gradiente para unos parámetros del modelo determinados w0
y w1
.
Ahora que ya tenemos la función que calcula el coste y la función que calcula el gradiente podemos pasar a implementar el algoritmo de descenso de gradiente:
Para ello necesitaremos:
alpha
Además vamos a guardar el valor de la función de coste en cada iteración para poder ver después qué tal está entrenándose nuestro modelo.
Ya lo tenemos todo listo para entrenar el modelo:
Si quieres dibujar la función de coste solo tienes que hacer esto:
Ahora que ya sabemos implementar de la manera más sencilla posible (aunque no la más eficiente) el entrenamiento de un modelo de regresión lineal simple, vamos a vectorizar nuestra solución para que sea más eficiente y además nos sirva también para regresión lineal múltiple 😊
Para empezar, vamos a volver a cómo calculaba nuestro modelo de regresión lineal múltiple la predicción en función de las características con las que lo alimentamos...
En este ejemplo tenemos 3 características, pero podríamos llegar a tener cientos de miles...
Si has visto ya el tutorial sobre Numpy, ahora es cuando verás por qué el producto escalar era tan importante en Machine Learning...
Podemos representar la regresión lineal multivariable como un producto escalar entre una matriz con los datos de entrada de nuestro dataset y el vector con los coeficientes del modelo.
La matriz con los datos de entrada tendrá las características en las columnas y cada fila de la matriz representa una muestra del dataset.
De la misma manera, el vector con los precios de la vivienda tendrá una fila por cada muestra del dataset.
import numpy as np # Por si acaso no lo has importado antes ;) import math X_train = np.array(housing_data[['median_income','housing_median_age','total_rooms']]) y_train = np.array(housing_data['median_house_value']) # dividimos para que el dinero tenga la misma escala m,n = X_train.shape
Una vez que ya has visto cómo entrenar un modelo de regresión lineal multivariable en Python desde cero con Numpy, te alegrará saber que es mucho más sencillo utilizar las librerías que han sido específicamente para eso.
Los pasos serán los mismos pero con menos líneas de código 🙂