Bienvenidos a un nuevo blog sobre Regresión lineal en Machine Learning paso a paso en python

Recuerda que este post tiene una explicación inicial que puedes encontrar aquí donde te explico todas las bases de la regresión lineal

La regresión lineal es un enfoque lineal para modelar la relación entre una respuesta escalar (o variable dependiente o y) y una o más variables explicativas (o variables independientes o x)

Regresión lineal simple

El caso de una variable explicativa se llama Regresión lineal simple (es decir, es una relación lineal entre x e y).

Matemáticamente hablando, todos deben haber escuchado sobre la ecuación de línea recta:

 y = mx + c

donde y es la variable dependiente, x es la variable independiente, m es la pendiente de la línea y c es la intersección con el eje y ( valor de y cuando x = 0 )

La idea central es obtener una línea que mejor se ajuste a los datos. La línea de mejor ajuste es aquella para la cual el error de predicción total (todos los puntos de datos) es lo más pequeño posible.

El error es la distancia entre el punto y la línea de regresión.

El conjunto de datos de muestra para la regresión lineal es el siguiente. 

( Área de incendio forestal (Y) vs temperatura (X) )

Para este post vamos a trabajar con un dataset muy interesante, sobre el consumo de cerveza en jóvenes de Brasil, y donde nos podemos responder preguntas como ¿La temperatura afecta el consumo de cerveza?

Para descargar el dataset puede ir al siguiente link

Ahora si empecemos

  1. Importamos la librerías
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

2. Cargamos los datos

df = pd.read_csv("Consumo_cerveja.csv")
df

3. Vamos a definir las variables con las que vamos a trabajar 

df = pd.read_csv("Consumo_cerveja.csv", decimal=",", thousands=".")
df

4. Definimos las variables de la recta

x = df2.Temperatura
y = df2.consumo

5. Visualizamos 

plt.scatter(x,y,color='m')
#plt.ylim(1, 200000)
plt.show()

6. Calculamos los coeficientes (pendiente e intersección)

Para esto vamos a hacerlo por dos métodos diferentes

6.1 Método con la ecuación de la forma y = a + bx

def estimate_coef(x,y):

## y = b_0 + b_1*x

# number of observations/points
n = np.size(x)

# mean of x and y vector
m_x, m_y = np.mean(x), np.mean(y)

# calculating cross-deviation and deviation about x
SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x

# calculating regression coefficients
b_1 = SS_xy / SS_xx
b_0 = m_y - b_1*m_x

return(b_0,b_1)
print(estimate_coef(x,y))
RESULTADO
(8528.907283947374, 794.8825370060837)

6.2 Método con la correlación y la desviación estándar

def correlation(x,y):
## for dataframe objects,both x amnd y are dataframe objects
return(x.corr(y))
def standard_deviation(a):
## for dataframe objects
return(a.std())
mean = lambda b:b.mean()
def least_squares_fit(x, y):
"""given training values for x and y,
find the least-squares values of alpha and beta"""
beta = correlation(x, y) * standard_deviation(y) / standard_deviation(x)
alpha = mean(y) - beta * mean(x)
return alpha, beta
least_squares_fit(x,y)
RESULTADO
(8528.907283985154, 794.8825370043038)

7. Calculamos los valores pronosticados (mx+c)

b = estimate_coef(x,y)
b
RESULTADO
(8528.907283947374, 794.8825370060837)
y_pred=df2['Temperatura'].apply(lambda a:b[0] + b[1]*a)
y_pred

RESULTADO
0      30229.200544
1 30006.633434
2 28257.891852
3 27590.190521
4 27463.009315
...
936 25401.367123
937 25401.367123
938 25401.367123
939 25401.367123
940 25401.367123
Name: Temperatura, Length: 941, dtype: float64

8. Visualicemos la salida predicha (Cantidad) vs X (Temperatura)

plt.xlabel('temperature')
plt.ylabel('Consumo')
plt.plot(x,y_pred,color= 'm')
plt.show()

Ahora vamos a usar el modelo de regresión de sklearn

  1. Importamos la librería
from sklearn import linear_model

2. Fit de nuestros datos

lm = linear_model.LinearRegression()
model = lm.fit(np.array(x).reshape(-1,1),np.array(y).reshape(-1,1))

3. trabajamos con la variable predict

y_predicted = lm.predict(np.array(x).reshape(-1,1))y_predicted

4. Visualizamos el gráfico (y_predicted vs X (temp)

plt.xlabel('Temperatura')
plt.ylabel('Consumo')
plt.plot(x,y_predicted,color='m')
plt.show()

Validación del modelo de regresión lineal y rendimiento del modelo 

Error cuadrático medio (RMSE)

El error cuadrático medio (RMSE) es la desviación estándar de los residuos (errores de predicción). Los residuos son una medida de qué tan lejos están los puntos de datos de la línea de regresión; RMSE es una medida de la dispersión de estos residuos. En otras palabras, le dice qué tan concentrados están los datos alrededor de la línea de mejor ajuste.

  • importamos la libreria 
from sklearn.metrics import mean_squared_error, r2_score
import math
  • A menor RMSE mejor el modelo
mse = mean_squared_error(y , y_predicted)
print("mean squared error is :",mse)
print("root mean squared error is :",math.sqrt(mse))
RESULTADO
mean squared error is : 5014234.525045369
root mean squared error is : 2239.248651902099

Coeficiente de determinación 

El coeficiente de determinación denotado R ^ 2 o r ^ 2 y pronunciado “R cuadrado”, es la proporción de la varianza en la variable dependiente que es predecible a partir de la (s) variable (s) independiente (s).

  • Cuanto más alto sea el puntaje R2 mejor el modelo
r2_score(y , y_predicted)
RESULTADO
0.33018204933243234

Regresión lineal con descenso del gradiente 

y = mx + c

La pérdida es el error en nuestro valor predicho de m y c . Nuestro objetivo es minimizar este error para obtener el valor más preciso de m y c.

El descenso de gradiente es un algoritmo de optimización iterativo para encontrar el mínimo de una función (aquí es una función de pérdida).

Imagina un valle y una persona sin sentido de dirección que quiere llegar al fondo del valle. Baja por la pendiente y da grandes pasos cuando la pendiente es empinada y pequeños pasos cuando la pendiente es menos empinada. Decide su próxima posición en función de su posición actual y se detiene cuando llega al fondo del valle, que era su objetivo.

Aplicando el enfoque de descenso de gradiente a m y c paso a paso:

Paso 1: inicialmente sea m = 0 yc = 0. Sea L nuestra tasa de aprendizaje. Esto controla cuánto cambia el valor de m con cada paso. L podría ser un valor pequeño como 0.0001 para una buena precisión

Paso 2: Calcule la derivada parcial de la función de pérdida con respecto a m y wrt c, es decir, D_m y D_c

La fórmula es la siguiente

Paso 3: Ahora actualizamos el valor actual de m y c usando la siguiente ecuación

Paso 4: repetimos este proceso hasta que nuestra función de pérdida sea un valor muy pequeño o idealmente 0 (lo que significa 0 error o 100% de precisión). El valor de m y c que nos queda ahora serán los valores óptimos

m = 0
c = 0
L = 0.001  # The learning Rate
epochs = 100 # The number of iterations to perform gradient descent
n = float(len(x)) # Number of elements in X
# Performing Gradient Descent 
for i in range(epochs):
Y_pred = m*x + c # The current predicted value of Y
D_m = (-2/n) * sum(x * (y - Y_pred)) # Derivative wrt m
D_c = (-2/n) * sum(y - Y_pred) # Derivative wrt c
m = m - L * D_m # Update m
c = c - L * D_c # Update c

print (m, c)
y_pred=df['Temperatura'].apply(lambda a:c + m*a)
y_pred.head()

Visualizamos

plt.plot(x,y_pred,color='m')

Evaluamos

mean_squared_error(y , y_pred)
RESULTADO
5014234.525045368

Y listo, esto fue todo por hoy sobre la regresión lineal en Machine Learning paso a paso en python

No me maten si hay algún error, de verdad me tome varios días escribiendo y entendiendo sobre el tema, así que pueden haber errores. Recuerda que puedes dejarme un comentario y estaré muy feliz de recibir tus sugerencias. Graaacias

Puedes encontrar todo el código de este post aquí 

El dataset usado en este post lo puedes encontrar aquí 

Gracias por leerme 💜

Suscribete en mi canal de Youtube

Apoyame para seguir creando contenido y accede a mentorías personalizadas aquí

Gracias por leerme 💜

2 comments on “Regresión lineal en Machine Learning paso a paso

  1. realmente estoy agradecido sobre los conocimientos que compartes me encanta la forma que detallas al escribir cada articulo, me he quedado pegado leyendo cada uno de tus artículos me encanta por que estoy aprendiendo mucho sobre Phyton.
    muchas gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *