Aprendizaje automático: regresión polinomial
Regresión polinomial
Si sus puntos de datos claramente no se ajustan a una regresión lineal (una línea recta a través de todos los puntos de datos), podría ser ideal para la regresión polinomial.
La regresión polinomial, como la regresión lineal, utiliza la relación entre las variables x e y para encontrar la mejor forma de dibujar una línea a través de los puntos de datos.
¿Como funciona?
Python tiene métodos para encontrar una relación entre puntos de datos y dibujar una línea de regresión polinomial. Le mostraremos cómo usar estos métodos en lugar de pasar por la fórmula matemática.
En el siguiente ejemplo, hemos registrado 18 automóviles cuando pasaban por una cabina de peaje determinada.
Hemos registrado la velocidad del automóvil y la hora del día (hora) en que ocurrió el rebasamiento.
El eje x representa las horas del día y el eje y representa la velocidad:
Ejemplo
Comience dibujando un diagrama de dispersión:
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
plt.scatter(x, y)
plt.show()
Resultado:
Ejemplo
Importe numpy
y
matplotlib
luego dibuje la línea de Regresión polinomial:
import numpy
import matplotlib.pyplot as plt
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
Resultado:
Ejemplo explicado
Importa los módulos que necesites.
Puede aprender sobre el módulo NumPy en nuestro Tutorial NumPy .
Puede aprender sobre el módulo SciPy en nuestro Tutorial SciPy .
import numpy
import matplotlib.pyplot as plt
Cree las matrices que representan los valores de los ejes x e y:
x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
NumPy tiene un método que nos permite hacer un modelo polinomial:
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
Luego especifique cómo se mostrará la línea, comenzamos en la posición 1 y terminamos en la posición 22:
myline = numpy.linspace(1, 22, 100)
Dibujar el diagrama de dispersión original:
plt.scatter(x, y)
Dibujar la línea de regresión polinomial:
plt.plot(myline, mymodel(myline))
Muestre el diagrama:
plt.show()
R-cuadrado
Es importante saber qué tan bien está la relación entre los valores de los ejes x e y, si no hay relación, la regresión polinomial no se puede usar para predecir nada.
La relación se mide con un valor llamado r-cuadrado.
El valor de r-cuadrado varía de 0 a 1, donde 0 significa que no hay relación y 1 significa 100 % de relación.
Python y el módulo Sklearn calcularán este valor por usted, todo lo que tiene que hacer es alimentarlo con las matrices x e y:
Ejemplo
¿Qué tan bien encajan mis datos en una regresión polinomial?
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
Nota: El resultado 0.94 muestra que hay una muy buena relación y podemos usar la regresión polinomial en futuras predicciones.
Predecir valores futuros
Ahora podemos usar la información que hemos recopilado para predecir valores futuros.
Ejemplo: Intentemos predecir la velocidad de un automóvil que pasa por la cabina de peaje alrededor de las 17:00:
Para hacerlo, necesitamos la misma mymodel
matriz del ejemplo anterior:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Ejemplo
Prediga la velocidad de un automóvil que pasa a las 17:00:
import numpy
from sklearn.metrics import r2_score
x =
[1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y =
[100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
speed = mymodel(17)
print(speed)
El ejemplo predijo una velocidad de 88,87, que también pudimos leer en el diagrama:
¿Mal ajuste?
Vamos a crear un ejemplo donde la regresión polinomial no sería el mejor método para predecir valores futuros.
Ejemplo
Estos valores para los ejes x e y deberían dar como resultado un ajuste muy malo para la regresión polinomial:
import numpy
import matplotlib.pyplot as plt
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
myline = numpy.linspace(2, 95, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
Resultado:
¿Y el valor de r-cuadrado?
Ejemplo
Debería obtener un valor de r cuadrado muy bajo.
import numpy
from sklearn.metrics import r2_score
x =
[89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]
y =
[21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]
mymodel =
numpy.poly1d(numpy.polyfit(x, y, 3))
print(r2_score(y, mymodel(x)))
El resultado: 0,00995 indica una relación muy mala y nos dice que este conjunto de datos no es adecuado para la regresión polinomial.