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.
Índice
Regresión Polinómica – Teoría
La regresión polinómica es, en realidad, una regresión lineal. El truco está en:
- Calcular atributos polinómicos
- 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
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.
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
- [vídeo] donde explico la regresión lineal y polinómica (en inglés)
- Regresión Lineal
- Error Cuadrático Medio
- Raíz Cuadrada del Error Cuadrático Medio
- Coeficiente de Determinación R2
- LinearRegression: Documentación de la Regresión Lineal en la librería scikit-learn
- PolynomialFeatures: Documentación del preprocesado para crear atributos polinómicos en la librería scikit-learn
¿Cuáles son los datos que debo utilizar para graficar eso?