Aprendizaje automático - Regresión lineal

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:


Ejecutar Ejemplo

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:


Ejecutar Ejemplo

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)

Ejecutar Ejemplo

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)

Ejecutar Ejemplo

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:


Ejecutar Ejemplo

¿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)

Ejecutar Ejemplo

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.