Regresión Polinómica en Python con scikit-learn

En algunas ocasiones nos encontraremos con datos que siguen una función polinómica. En estos casos, el mejor modelo que podemos usar es la regresión polinómica. Este artículo explica la teoría detrás de la regresión polinómica y cómo usarla en python.

Regresión Polinómica – Teoría

La regresión polinómica es, en realidad, una regresión lineal. El truco está en:

  1. Calcular atributos polinómicos
  2. Usar la regresión lineal que ya hemos visto.

Vamos a verlo con fórmulas, porque creo que va a ser más fácil de entender. Antes poníamos en X todos nuestros atributos y usábamos el método de los mínimos cuadrados para obtener los mejores parámetros W. Antes X era:

X = [x_0, x_1, x_2, x_3, ..., x_N]

Podemos ahora expandir los atributos calculando sus valores polinómicos:

X_{polin\acute{o}mica} = [x_0,  x_1, x_1^2, x_2, x_2^2, ..., x_N, x_N^2]

En este ejemplo, simplemente he elevado al cuadrado cada atributo … lo que puede ser suficiente en algunos casos. Dependiendo del grado del polinomio y si deseamos multiplicar un atributo por otro, podemos expandir X mucho más. Afortunadamente, existen librerías de machine learning que hacen este proceso de expansión automáticamente siguiendo nuestras instrucciones.

¿Cómo hacer una Regresión Polinómica en Python?

Para hacer la regresión polinómica, usaremos la librería scikit-learn. Necesitaremos la clase PolynomialFeatures para que calcule los atributos polinómicos. Después usaremos la clase LinearRegression para hacer la regresión lineal con los datos polinómicos.

Datos de ejemplo

Como datos de ejemplo, he generado una función polinómica de grado 3 a la que le he añadido ruido Gaussiano. La función que he usado es:

y = -100 -5x + 5x^2 + 0.1x^3 + N(0,500)

La siguiente gráfica muestra los datos generados en esta fórmula

Datos para regresión polinómica

Construyendo un modelo de Regresión Polinómica en Python

Para entrenar un modelo de regresión polinómica, vamos a usar una regresión lineal con atributos polinómicos.

# Importamos la clase de Regresión Lineal de scikit-learn
from sklearn.linear_model import LinearRegression 

# para generar características polinómicas
from sklearn.preprocessing import PolynomialFeatures 

pf = PolynomialFeatures(degree = 3)    # usaremos polinomios de grado 3
X = pf.fit_transform(x.reshape(-1,1))  # transformamos la entrada en polinómica

regresion_lineal = LinearRegression() # creamos una instancia de LinearRegression

# instruimos a la regresión lineal que aprenda de los datos (ahora polinómicos) (X,y)
regresion_lineal.fit(X, y) 

# vemos los parámetros que ha estimado la regresión lineal
print('w = ' + str(regresion_lineal.coef_) + ', b = ' + str(regresion_lineal.intercept_))

# resultado: w = [0 -4.54 4.95 0.1], b = -57.52

El resultado de la estimación es:

\hat{y} = -57.52 -4.54x + 4.95x^2 + 0.1x^3

En vez de

y = -100 -5x + 5x^2 + 0.1x^3 + N(0,500)

Podemos ver que tiene algún error en la estimación de los parámetros, pero es normal para los pocos datos que le hemos dado. Sólo ha aprendido con 500 muestras en el intervalo [-50, 50] … y hay muchos polinomios compatibles con estos datos.

Regresión Polinómica

Evaluación del modelo

El código para evaluar el modelo en entrenamiento es el siguiente:

from sklearn.metrics import mean_squared_error # importamos el cálculo del error cuadrático medio (MSE)

# Predecimos los valores y para los datos usados en el entrenamiento
prediccion_entrenamiento = regresion_lineal.predict(X)

# Calculamos el Error Cuadrático Medio (MSE = Mean Squared Error)
mse = mean_squared_error(y_true = y, y_pred = prediccion_entrenamiento)

# La raíz cuadrada del MSE es el RMSE
rmse = np.sqrt(mse)

print('Error Cuadrático Medio (MSE) = ' + str(mse))
print('Raíz del Error Cuadrático Medio (RMSE) = ' + str(rmse))

# calculamos el coeficiente de determinación R2
r2 = regresion_lineal.score(X, y)
print('Coeficiente de Determinación R2 = ' + str(r2))

Y los resultados que nos da son los siguientes:

Error Cuadrático Medio (MSE) = 238896.642324

Raíz del Error Cuadrático Medio (RMSE) = 488.770541588

Coeficiente de Determinación R2 = 0.993254587646

Como podemos ver, las medidas de evaluación del modelo son muy buenas:

  • Un R2 casi perfecto (lo máximo es 1)
  • La Raíz del Error Cuadrático Medio (RMSE), es aproximadamente igual al ruido Gaussiano que introducimos en la función para generar los datos.

Resumen

Esta es la lista de los puntos que hemos cubierto:

  • la regresión polinómica (también conocida como regresión polinomial) no es más que una regresión lineal con atributos polinómicos
  • cómo hacer una regresión polinómica en python
  • evaluación con el error cuadrático medio, el coeficiente de determinación R2 y visualizando datos

Recursos

1 comentario en «Regresión Polinómica en Python con scikit-learn»

Deja un comentario