Regresión lineal en Python

En este tutorial vamos a ver cómo entrenar un modelo de regresión lineal en Python.

¿Qué es una regresión lineal y para qué sirve?

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?

Regresión lineal Python

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.

Regresión lineal simple

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.

Modelo regresión lineal simple

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.

Regresión lineal múltiple

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.

Modelo regresión lineal múltiple

La desventaja, es que a partir de dos características de entrada ya no se puede dibujar el resultado 🤷‍♀️

Ejemplo de regresión lineal

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.

¿Cómo entrenar un modelo de regresión lineal?

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:

1️⃣ Definir una métrica que evalúe el error de nuestro modelo.

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.

Error regresión lineal

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.

Función de coste regresión lineal

2️⃣ Conseguir que el error sea lo más pequeño posible: Minimizar la función de coste

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.

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.

  1. Probarías con el pie la dirección de máxima pendiente hacia abajo: Cálculo del gradiente
  2. Darías un pequeño paso en esa dirección: El hiperparámetro alpha
  3. Volverías al paso 1 y repetirías hasta que ya no notas que puedes seguir bajando más.
1️⃣ Cálculo del gradiente

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.

Gradiente regresión lineal
Gradiente regresión lineal

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 😉

2️⃣ Actualizar los coeficientes

Cada vez que repitamos el proceso iremos actualizando los coeficientes de nuestro modelo:

actualizacion-coeficientes-descenso-gradiente

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.

3️⃣ Repetir hasta que el error sea lo suficientemente pequeño

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 🙂

Regresión lineal simple con Numpy

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

Función de coste en Numpy

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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Implementación del descenso de gradiente en Numpy

Definimos ahora una función que calcule el gradiente para unos parámetros del modelo determinados w0 y w1.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

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:

  1. Calcular el gradiente
  2. Actualizar los coeficientes del modelo
  3. Repetir

Para ello necesitaremos:

  1. Unos coeficientes para el modelo iniciales
  2. El número de iteraciones que queremos implementar
  3. Definir el hiperparámetro 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.

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Ya lo tenemos todo listo para entrenar el modelo:

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Si quieres dibujar la función de coste solo tienes que hacer esto:

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Regresión lineal múltiple con Numpy

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 😊

Vectorización

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...

Modelo regresión lineal múltiple

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...

Regresión lineal multivariable vectorizada

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

🥷 Truco en regresión multivariable

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Regresión lineal con Scikit-learn

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 🙂

Membresía requerida

Este contenido está disponible únicamente para suscriptores.

Puedes apuntarte a la plataforma en este enlace

¿Ya eres un ninja? logeate aquí

Accede a todo el contenido premium

Ya no necesitas pagar cientos de euros por un Bootcamp para convertirte en ninja de los datos. Por solo 17€/mes (o menos 🤯), obtén acceso al podcast premium, a todos los tutoriales y a los resúmenes de los libros más top sobre Machine Learning y Ciencia de datos y aprende a tu ritmo.
¡Empieza ahora!
Copyright © 2024  · Datos 🥷 · Todos los derechos reservados