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.
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()
Ejemplo
Importe scipy y dibuje la línea de regresión lineal:
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]
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()
Ejemplo explicado
Importa los módulos que necesites.
Puede obtener información sobre el módulo Matplotlib en nuestro Tutorial de Matplotlib.
Puede obtener información sobre el módulo SciPy en nuestro tutorial de 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 de pendiente e intersección 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 para relaciones
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 valor de r varía de -1 a 1, donde 0 significa que no hay relación y 1 (y -1) significa 100 % de relación.
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)
Note: The result -0.76 shows that there is a relationship, not perfect, but it indicates that we could use linear regression in future predictions.
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 función myfunc() 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(velocidad)
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 para los valores de los ejes x e y obligan a 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()
¿Y la r para las relaciones?
Debería obtener un valor r 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)
The result: 0.013 indicates a very bad relationship, and tells us that this data set is not suitable for linear regression.