Aprendizaje automático - Regresión lineal
- Página Anterior Gráfico de Dispersión
- Página Siguiente Regresión Polinómica
Regresión
Cuando intenta encontrar relaciones entre variables, se utiliza el término "regresión" (regression).
En el aprendizaje automático y el modelado estadístico, esta relación se utiliza para predecir los resultados de eventos futuros.
Regreso lineal
El regreso lineal dibuja una línea recta entre todos los puntos de datos utilizando la relación entre los puntos de datos.
Esta línea se puede usar para predecir valores futuros.

En el aprendizaje automático, la predicción del futuro es muy importante.
Principio de funcionamiento
Python proporciona algunos métodos para encontrar relaciones entre puntos de datos y dibujar líneas de regresión lineal. Le mostraremos cómo usar estos métodos en lugar de formulas matemáticas.
En el siguiente ejemplo, el eje x representa la antigüedad del automóvil y el eje y representa la velocidad. Hemos registrado la antigüedad y la velocidad de 13 automóviles que pasaron por el peaje. Vamos a ver si los datos que hemos recopilado pueden usarse para el regreso lineal:
Ejemplo
Primero dibujar el gráfico de dispersión:
import matplotlib.pyplot as plt x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] plt.scatter(x, y) plt.show()
Resultados:

Ejemplo
Importar scipy
y dibujar la línea de regresión lineal:
import matplotlib.pyplot as plt from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x): return slope * x + intercept mymodel = list(map(myfunc, x)) plt.scatter(x, y) plt.plot(x, mymodel) plt.show()
Resultados:

Ejemplo de explicación
Importar los módulos necesarios:
import matplotlib.pyplot as plt from scipy import stats
Crear un array que represente los valores del eje x y del eje y:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
Ejecutar un método que devuelve algunos valores clave importantes del regreso lineal:
slope, intercept, r, p, std_err = stats.linregress(x, y)
Crear un que utiliza slope
y intercept
La función de valores devuelve nuevos valores. Estos nuevos valores representan la posición en el eje y donde se colocará el valor correspondiente del eje x:
def myfunc(x): return slope * x + intercept
Ejecutar cada valor del array x mediante la función. Esto generará un nuevo array en el que el eje y tendrá nuevos valores:
mymodel = list(map(myfunc, x))
Dibujar el gráfico de dispersión original:
plt.scatter(x, y)
Dibujar la línea de regresión lineal:
plt.plot(x, mymodel)
Mostrar gráfico:
plt.show()
R-Squared
Es importante saber cuán buena es la relación entre los valores del eje x y los valores del eje y, si no hay relación, el regreso lineal no se puede usar para predecir nada.
Esta relación se mide con un valor llamado cuadrado de r (r-squared).
El rango del valor cuadrado de r es de 0 a 1, donde 0 indica no relacionado y 1 indica 100% relacionado.
El módulo Python y Scipy calcularán este valor por usted, todo lo que tiene que hacer es proporcionar los valores de x e y a él:
Ejemplo
¿Cómo se ajustan mis datos en el regreso lineal?
from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) print(r)
Notas:El resultado -0.76 indica que existe alguna relación, pero no una relación perfecta, pero indica que podemos usar el regreso lineal 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 de un automóvil de 10 años de antigüedad.
Para esto, necesitamos lo mismo que en el ejemplo anterior myfunc()
Función:
def myfunc(x): return slope * x + intercept
Ejemplo
Predicción de la velocidad de un automóvil de 10 años de antigüedad:
from scipy import stats x = [5,7,8,7,2,17,2,9,4,11,12,9,6] y = [99,86,87,88,111,86,103,87,94,78,77,85,86] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x): return slope * x + intercept speed = myfunc(10) print(speed)
La velocidad de predicción del ejemplo es de 85.6, también podemos leerlo en la imagen:

¿适配度糟糕?
Creemos una instancia en la que el regreso lineal no es el mejor método para predecir valores futuros.
Ejemplo
Estos valores en el eje x e y causarán una muy mala adecuación en la regresión lineal:}
import matplotlib.pyplot as plt from scipy import stats 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] slope, intercept, r, p, std_err = stats.linregress(x, y) def myfunc(x): return slope * x + intercept mymodel = list(map(myfunc, x)) plt.scatter(x, y) plt.plot(x, mymodel) plt.show()
Resultados:

¿y el valor de r-squared?
Ejemplo
Deberías haber obtenido un valor muy bajo de r-squared.
import numpy from scipy import stats 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] slope, intercept, r, p, std_err = stats.linregress(x, y) print(r)
Resultados: 0.013 indica una relación muy mala y nos dice que el conjunto de datos no es adecuado para la regresión lineal.
- Página Anterior Gráfico de Dispersión
- Página Siguiente Regresión Polinómica