Aprendizaje automático - Regresión polinómica
Regresión polinómica (Polynomial Regression)
Si los puntos de datos obviamente no son adecuados para regresión lineal (una línea que pasa entre los puntos de datos), la regresión polinómica puede ser la opción ideal.
Al igual que la regresión lineal, la regresión polinómica utiliza la relación entre las variables x e y para encontrar el mejor método para dibujar la línea de los puntos de datos.

Principio de funcionamiento
Python tiene algunos métodos para encontrar la relación entre los puntos de datos y dibujar la línea de regresión polinómica. Le mostraremos cómo usar estos métodos en lugar de formulas matemáticas.
En el siguiente ejemplo, registramos 18 coches que pasaron por un peaje específico.
Ya hemos registrado la velocidad del coche y el tiempo de paso (horas).
El eje x representa las horas del día, el eje y representa la velocidad:
实例
Primero dibujamos el gráfico 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()
结果:

实例
Importar numpy
y matplotlib
Después de eso, dibujamos la línea de regresión polinómica:
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()
结果:

Explicación del ejemplo
Importar los módulos necesarios:
import numpy import matplotlib.pyplot as plt
Crear un arreglo que represente los valores del eje x y del eje 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 para que podamos construir un modelo polinómico:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
Luego especifiquemos cómo mostrar las filas, comenzamos desde la posición 1 y terminamos en la posición 22:
myline = numpy.linspace(1, 22, 100)
Dibujar el gráfico de dispersión original:
plt.scatter(x, y)
Dibujar la línea de regresión polinómica:
plt.plot(myline, mymodel(myline))
Mostrar gráfico:
plt.show()
R-Squared
Es importante saber cuán buena es la relación entre los valores del eje x y del eje y, si no hay relación, la regresión polinómica no se puede usar para predecir nada.
Esta relación se mide con un valor llamado r cuadrado (r-squared).
El rango del valor cuadrado de r (r-squared) es de 0 a 1, donde 0 significa no relacionado y 1 significa 100% relacionado.
Python y el módulo Sklearn calcularán este valor por usted, todo lo que tiene que hacer es ingresar los arreglos x e y:
实例
¿Cómo se ajusta mi datos en la regresión polinómica?
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)))
Notas:El resultado de 0.94 indica una buena relación, y podemos usar la regresión polinómica en las predicciones futuras.
Predicción de valores futuros
Ahora, podemos usar la información recopilada para predecir valores futuros.
Por ejemplo: intentemos predecir la velocidad del coche que pasa por el peaje a las 17 en punto por la noche:
Para esto, necesitamos lo mismo que el ejemplo anterior: mymodel Arreglo:
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
实例
Predicción de la velocidad del coche pasando por la medianoche a las 17:
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)
La velocidad de predicción del ejemplo es de 88.87, también podemos verlo en el gráfico:

¿Mal ajuste?
Creemos un ejemplo en el que la regresión polinómica no es el mejor método para predecir valores futuros.
实例
x 和 y 轴的这些值会导致多项式回归的拟合度非常差:
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()
结果:

r-squared 值呢?
实例
您应该得到一个非常低的 r-squared 值。
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)))
结果:0.00995 表示关系很差,并告诉我们该数据集不适合多项式回归。