Regresión polinomial en Python

La regresión es una técnica estadística poderosa que se utiliza para modelar la relación entre una variable independiente y una variable dependiente. Aunque la regresión lineal es una de las formas más comunes de regresión, a menudo encontramos relaciones no lineales entre las variables en el mundo real. Para abordar este desafío, existe la regresión polinomial, que permite modelar relaciones no lineales mediante el ajuste de un polinomio a los datos. En este artículo, aprenderemos cómo realizar una regresión polinomial en Python utilizando la biblioteca Scikit-learn.


¿Qué es la Regresión Polinomial?

La regresión polinomial es una extensión de la regresión lineal en la que se ajusta un polinomio a los datos en lugar de una línea recta. Un polinomio es una función matemática que involucra términos con coeficientes y exponentes. La regresión polinomial puede modelar relaciones más complejas y no lineales entre las variables, lo que la hace útil en muchos problemas del mundo real.

# Importar las bibliotecas necesarias
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Datos de muestra
x = np.array([1, 2, 3, 4, 5, 6])
y = np.array([3, 6, 8, 11, 15, 18])

# Transformar los datos a un polinomio de grado 2
transformer = PolynomialFeatures(degree=2, include_bias=False)
x_poly = transformer.fit_transform(x.reshape(-1, 1))

# Crear el modelo de regresión lineal
model = LinearRegression()

# Entrenar el modelo con los datos transformados
model.fit(x_poly, y)

# Datos para hacer predicciones
x_new = np.array([7, 8])

# Transformar los datos a un polinomio de grado 2
x_new_poly = transformer.transform(x_new.reshape(-1, 1))

# Realizar predicciones
y_pred = model.predict(x_new_poly)

# Crear una línea para el polinomio ajustado
x_fit = np.linspace(1, 8, 100)
x_fit_poly = transformer.transform(x_fit.reshape(-1, 1))
y_fit = model.predict(x_fit_poly)

# Graficar los datos de muestra y el polinomio ajustado
plt.scatter(x, y, label='Datos de muestra')
plt.plot(x_fit, y_fit, label='Regresión Polinomial', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Este código realiza una regresión polinomial de grado 2 utilizando NumPy, scikit-learn y matplotlib. Toma datos de muestra x e y, transforma los datos a un polinomio de grado 2, entrena un modelo de regresión lineal y realiza predicciones. Luego, dibuja los datos de muestra junto con el polinomio ajustado.

Resultado:

Regresión polinomial en python

Implementación en Python paso a paso

A continuación, se presentan los pasos para realizar una regresión polinomial en Python utilizando Scikit-learn:


Importar las bibliotecas

Primero, debemos importar las bibliotecas necesarias:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

Crear los datos

Para este ejemplo, generaremos algunos datos de muestra para realizar la regresión polinomial:

# Datos de muestra
x = np.array([1, 2, 3, 4, 5, 6])
y = np.array([3, 6, 8, 11, 15, 18])

Transformar los datos

Antes de realizar la regresión polinomial, debemos transformar los datos para que se ajusten a un polinomio. Utilizaremos la clase PolynomialFeatures de Scikit-learn para realizar esta transformación:

# Transformar los datos a un polinomio de grado 2
transformer = PolynomialFeatures(degree=2, include_bias=False)
x_poly = transformer.fit_transform(x[:, np.newaxis])

Crear y entrenar el modelo

Ahora que hemos transformado los datos, podemos crear y entrenar nuestro modelo de regresión polinomial:

# Crear el modelo de regresión lineal
model = LinearRegression()

# Entrenar el modelo con los datos transformados
model.fit(x_poly, y)

Realizar predicciones

Con nuestro modelo entrenado, podemos hacer predicciones sobre nuevos datos:

# Datos para hacer predicciones
x_new = np.array([7, 8])

# Transformar los datos a un polinomio de grado 2
x_new_poly = transformer.transform(x_new[:, np.newaxis])

# Realizar predicciones
y_pred = model.predict(x_new_poly)

Visualizar los resultados

Finalmente, podemos visualizar los resultados de nuestra regresión polinomial:

# Crear una línea para el polinomio ajustado
x_fit = np.linspace(1, 8, 100)
x_fit_poly = transformer.transform(x_fit[:, np.newaxis])
y_fit = model.predict(x_fit_poly)

# Graficar los datos de muestra y el polinomio ajustado
plt.scatter(x, y, label='Datos de muestra')
plt.plot(x_fit, y_fit, label='Regresión Polinomial', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

La regresión polinomial es una herramienta útil para modelar relaciones no lineales entre variables. En Python, podemos realizar una regresión polinomial utilizando la biblioteca Scikit-learn, lo que nos permite ajustar un polinomio a los datos y hacer predicciones sobre nuevos valores. Con esta técnica, podemos mejorar la precisión de nuestros modelos y obtener una mejor comprensión de los datos en problemas del mundo real.


Otro ejemplo

En el siguiente ejemplo se realiza una regresión polinomial de grado 2 utilizando los datos x e y. Realiza la transformación de los datos, entrena un modelo de regresión lineal y realiza predicciones. Luego, grafica los datos de muestra junto con el polinomio ajustado.

# Importar las bibliotecas necesarias
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# Datos de muestra
x = np.array([1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22])
y = np.array([100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100])

# Transformar los datos a un polinomio de grado 2
transformer = PolynomialFeatures(degree=2, include_bias=False)
x_poly = transformer.fit_transform(x.reshape(-1, 1))

# Crear el modelo de regresión lineal
model = LinearRegression()

# Entrenar el modelo con los datos transformados
model.fit(x_poly, y)

# Datos para hacer predicciones
x_new = np.array([4, 11, 17])

# Transformar los datos a un polinomio de grado 2
x_new_poly = transformer.transform(x_new.reshape(-1, 1))

# Realizar predicciones
y_pred = model.predict(x_new_poly)

# Crear una línea para el polinomio ajustado
x_fit = np.linspace(1, 22, 100)
x_fit_poly = transformer.transform(x_fit.reshape(-1, 1))
y_fit = model.predict(x_fit_poly)

# Graficar los datos de muestra y el polinomio ajustado
plt.scatter(x, y, label='Datos de muestra')
plt.plot(x_fit, y_fit, label='Regresión Polinomial', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

Resultado:

Regresión polinómica en Python