Aprendizaje automático: regresión lineal
Regresión
El término regresión se usa cuando intenta encontrar la relación entre variables.
En Machine Learning y en el modelado estadístico, esa relación se usa para predecir el resultado de eventos futuros.
Regresión lineal
La regresión lineal utiliza la relación entre los puntos de datos para dibujar una línea recta a través de todos ellos.
Esta línea se puede utilizar para predecir valores futuros.
En Machine Learning, predecir el futuro es muy importante.
¿Como funciona?
Python tiene métodos para encontrar una relación entre puntos de datos y dibujar una línea de regresión lineal. Le mostraremos cómo usar estos métodos en lugar de pasar por la fórmula matemática.
En el siguiente ejemplo, el eje x representa la edad y el eje y representa la velocidad. Hemos registrado la edad y la velocidad de 13 coches cuando pasaban por una cabina de peaje. Veamos si los datos que recopilamos podrían usarse en una regresión lineal:
Ejemplo
Comience dibujando un diagrama 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()
Resultado:
Ejemplo
Importe scipy
y dibuje 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()
Resultado:
Ejemplo explicado
Importa los módulos que necesites.
Puede obtener información sobre el módulo Matplotlib en nuestro Tutorial de Matplotlib .
Puede aprender sobre el módulo SciPy en nuestro Tutorial SciPy .
import matplotlib.pyplot as plt
from scipy
import stats
Cree las matrices que representan los valores de los ejes x e 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]
Ejecute un método que devuelva algunos valores clave importantes de la regresión lineal:
slope, intercept, r,
p, std_err = stats.linregress(x, y)
Cree una función que use los valores slope
y
intercept
para devolver un nuevo valor. Este nuevo valor representa dónde en el eje y se colocará el valor x correspondiente:
def myfunc(x):
return slope * x + intercept
Ejecute cada valor de la matriz x a través de la función. Esto dará como resultado una nueva matriz con nuevos valores para el eje y:
mymodel = list(map(myfunc, x))
Dibujar el diagrama de dispersión original:
plt.scatter(x, y)
Dibujar la línea de regresión lineal:
plt.plot(x, mymodel)
Muestre el diagrama:
plt.show()
R de Relación
Es importante saber cómo es la relación entre los valores del eje x y los valores del eje y, si no hay relación la regresión lineal no puede usarse para predecir nada.
Esta relación, el coeficiente de correlación, se llama
r
.
El r
valor varía de -1 a 1, donde 0 significa que no hay relación y 1 (y -1) significa 100% relacionado.
Python y el módulo Scipy calcularán este valor por usted, todo lo que tiene que hacer es alimentarlo con los valores x e y.
Ejemplo
¿Qué tan bien encajan mis datos en una regresión 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)
Nota: El resultado -0.76 muestra que existe una relación, no perfecta, pero indica que podríamos usar la regresión lineal 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 de 10 años.
Para hacerlo, necesitamos la misma myfunc()
función del ejemplo anterior:
def myfunc(x):
return slope * x + intercept
Ejemplo
Prediga la velocidad de un automóvil de 10 años:
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)
El ejemplo predijo una velocidad de 85,6, que también pudimos leer en el diagrama:
¿Mal ajuste?
Creemos un ejemplo donde la regresión lineal 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 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()
Resultado:
¿Y la r
para la relación?
Ejemplo
Debería obtener un r
valor muy bajo.
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)
El resultado: 0,013 indica una relación muy mala y nos dice que este conjunto de datos no es adecuado para la regresión lineal.