Machine Learning - Modelo de Regresión Lineal Simple
ANALITICA PARA LA TOMA DE DECISIONES
Practica 1
23 / Agosto / 2023
Docente: Ing. Manuela Londoño Ocampo
Realizado por: Javier Elohim Burgos Chaguezac
Facultad de Ingeniería - Departamento de Ingeniería Industrial
1). PREPARACIÓN DEL NOTEBOOK
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
%matplotlib inline
REGRESIÓN LINEAL
Caso de estudio
La industria automovilística es extremadamente competitiva. Con el aumento de los precios del combustible y los consumidores exigentes, los fabricantes de automóviles optimizan constantemente sus procesos para aumentar la eficiencia del combustible. Pero, ¿qué pasaría si se pudiera disponer de un estimador fiable de las millas por galón (mpg) de un coche a partir de algunas especificaciones conocidas sobre el automóvil?
Dispone de un conjunto de datos de características de automóviles de diferentes modelos y marcas. A continuación se detallan las variables disponibles:
- mpg: millas por galón. Esta es la cantidad de combustible consumido por el vehículo particular de una instancia.
- cylinders: Este atributo describe el número de cilindros de cada automóvil
- displacement: Describe la cilindrada del motor
- Horsepower: Potencia de un automóvil
- Weight: Peso de cada automóvil
- Acceleration: Aceleración de automóvil
- Model Year: El año en que se lanzó el modelo de automóvil
- Origin: País de fabricación del automóvil
- Car Name: Nombre del automóvil
Documentación del modelo: https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
Lectura de los datos
# na_values='?' Se especifica que los valores que aparecen como '?' en el archivo CSV deben tratarse como valores faltantes (NaN)
df_auto = pd.read_csv("https://raw.githubusercontent.com/JavierBurgos-web/001_Machine_Learning_RL/main/auto-mpg.csv", na_values='?')
Exploración de los datos
Dataset
df_auto.head()
mpg | cylinders | displacement | horsepower | weight | acceleration | model year | origin | car name | |
---|---|---|---|---|---|---|---|---|---|
0 | 18.0 | 8 | 307.0 | 130.0 | 3504 | 12.0 | 70 | 1 | chevrolet chevelle malibu |
1 | 15.0 | 8 | 350.0 | 165.0 | 3693 | 11.5 | 70 | 1 | buick skylark 320 |
2 | 18.0 | 8 | 318.0 | 150.0 | 3436 | 11.0 | 70 | 1 | plymouth satellite |
3 | 16.0 | 8 | 304.0 | 150.0 | 3433 | 12.0 | 70 | 1 | amc rebel sst |
4 | 17.0 | 8 | 302.0 | 140.0 | 3449 | 10.5 | 70 | 1 | ford torino |
Tamaño del Dataset
df_auto.shape
(398, 9)
Información general del dataset
df_auto.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 398 entries, 0 to 397 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 mpg 398 non-null float64 1 cylinders 398 non-null int64 2 displacement 398 non-null float64 3 horsepower 392 non-null float64 4 weight 398 non-null int64 5 acceleration 398 non-null float64 6 model year 398 non-null int64 7 origin 398 non-null int64 8 car name 398 non-null object dtypes: float64(4), int64(4), object(1) memory usage: 28.1+ KB
Estadísticas descriptivas de los datos
df_auto.describe()
mpg | cylinders | displacement | horsepower | weight | acceleration | model year | origin | |
---|---|---|---|---|---|---|---|---|
count | 398.000000 | 398.000000 | 398.000000 | 392.000000 | 398.000000 | 398.000000 | 398.000000 | 398.000000 |
mean | 23.514573 | 5.454774 | 193.425879 | 104.469388 | 2970.424623 | 15.568090 | 76.010050 | 1.572864 |
std | 7.815984 | 1.701004 | 104.269838 | 38.491160 | 846.841774 | 2.757689 | 3.697627 | 0.802055 |
min | 9.000000 | 3.000000 | 68.000000 | 46.000000 | 1613.000000 | 8.000000 | 70.000000 | 1.000000 |
25% | 17.500000 | 4.000000 | 104.250000 | 75.000000 | 2223.750000 | 13.825000 | 73.000000 | 1.000000 |
50% | 23.000000 | 4.000000 | 148.500000 | 93.500000 | 2803.500000 | 15.500000 | 76.000000 | 1.000000 |
75% | 29.000000 | 8.000000 | 262.000000 | 126.000000 | 3608.000000 | 17.175000 | 79.000000 | 2.000000 |
max | 46.600000 | 8.000000 | 455.000000 | 230.000000 | 5140.000000 | 24.800000 | 82.000000 | 3.000000 |
2). PREPARACIÓN INICIAL DE LOS DATOS
Arreglos
- Line 1. Borrar columna que no se usará
- Line 2. Renombrar a variable objetivo
- Line 3. Excluir valores nulos
df_auto.drop(['car name'], axis=1, inplace=True)
df_auto = df_auto.rename(columns={'mpg':'target'})
df_auto =df_auto[df_auto['horsepower'].notna()]
df_auto.head(3)
target | cylinders | displacement | horsepower | weight | acceleration | model year | origin | |
---|---|---|---|---|---|---|---|---|
0 | 18.0 | 8 | 307.0 | 130.0 | 3504 | 12.0 | 70 | 1 |
1 | 15.0 | 8 | 350.0 | 165.0 | 3693 | 11.5 | 70 | 1 |
2 | 18.0 | 8 | 318.0 | 150.0 | 3436 | 11.0 | 70 | 1 |
Verificar nuevo tamaño del Dataset
df_auto.shape
(392, 8)
Gráfico de dispersión - Relación entre variables
sns.set(style="white")
plt.figure(figsize=(3.5, 2))
sns.scatterplot(data=df_auto, x='horsepower', y='target')
plt.xlabel('Caballos de fuerza')
plt.ylabel('Millas por galón (MPG)')
plt.show()
3). MARCO DE VALIDACIÓN
Separaración. Variable de entrada de la Variable objetivo
df_rls = df_auto[['target', 'horsepower']]
y = df_rls['target']
x = df_rls.drop(['target'], axis =1)
Separación. Datos de entrenamiento y Datos de validación
line 2
- x: Variables de entrada
- y: Variable objetivo, la cuál se trata de predecir
- test_size=0.2 Especifica que el 20% del conjunto de datos se utilizará como conjunto de validación, y el 80% restante se utilizará como conjunto de entrenamiento.
- random_state=42 Es una semilla para el generador de números aleatorios. Esto asegura que la división de datos sea reproducible, lo que significa que si ejecutas el código nuevamente con la misma semilla, obtendrás la misma división de datos.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
print("Tamaño del dataset de entrenamiento: ", x_train.shape)
print("\nTamaño del dataset de validación: ", x_test.shape)
Tamaño del dataset de entrenamiento: (313, 1) Tamaño del dataset de validación: (79, 1)
Parametros. Regresión Lineal Simple
La regresión lineal simple tiene solo 1 variable predictora y 1 variable dependiente. A partir del conjunto de datos anterior, consideremos el efecto de los caballos de fuerza en el 'mpg' del vehículo.
- Line 1. Crea el modelo
- Line 2. Calibra o entrena el modelo de regresión lineal usando los datos de entrenamiento.
modelo_rls = LinearRegression()
modelo_rls.fit(x_train, y_train)
print("Coeficiente: ", modelo_rls.coef_)
print("\nIntercepto: ", modelo_rls.intercept_)
Coeficiente: [-0.16259724] Intercepto: 40.606097600118346
Modelo ajustado. visualización (opcional)
- Realiza predicciones en los datos de entrenamiento x_train, dichas predicciones se almacenan en y_pred_train
- ¿Se ajusta bien la linea de regresión calculada por el modelo?
plt.figure(figsize=(3.5, 2))
y_pred_train = modelo_rls.predict(x_train)
plt.scatter(x_train, y_train, color= 'g')
plt.plot(x_train, y_pred_train, color= 'r')
plt.show()
4). EVALUACIÓN DEL MODELO DE REGRESIÓN LINEAL
Modelo predictivo
- Realiza predicciones en los datos de prueba x_test, dichas predicciones se almacenan en y_pred_test
y_pred_test = modelo_rls.predict(x_test)
Metricas de evaluación
- Calcular metricas de evaluación del modelo de regresión lineal en el conjunto de datos de prueba y_test y y_pred_test
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score, mean_absolute_percentage_error #metricas
import math
# MSE Error cuadratico medio. Entre menor sea el valor, mejor rendimiento del modelo
print("Mean squared error: %.2f" % mean_squared_error(y_test, y_pred_test))
# RMSE Raíz del error cuadratico medio. Cuanto menor sea, mejor será el rendimiento del modelo en términos de precisión y dispersión
print("RMSE %.2f" % math.sqrt(mean_squared_error(y_test, y_pred_test)))
#MAE Error absoluto medio
print("Mean absolute error: %.2f" % mean_absolute_error(y_test, y_pred_test))
#MAPE Error porcentual absoluto medio
print("mean absolute percentage error: %.2f" % mean_absolute_percentage_error(y_test, y_pred_test))
# R2 Coeficiente de determinación. 1 -> Ajuste perfecto
print("Variance score: %.2f" % r2_score(y_test,y_pred_test))
# R2-adjusted R2 ajustado
r2 = r2_score(y_test, y_pred_test)
adj_r2 = 1 - (1-r2)*(len(y_test)-1)/(len(y_test)-x.shape[1]-1)
print("R2-adjusted: %.2f" % adj_r2)
Mean squared error: 22.15 RMSE 4.71 Mean absolute error: 3.78 mean absolute percentage error: 0.18 Variance score: 0.57 R2-adjusted: 0.56
Lectura de las metricas
Mean squared error: 22.15 En promedio, las predicciones del modelo tienen un error cuadrático de 22.15 unidades en comparación con los valores reales. El modelo tiene error en sus predicciones
RMSE 4.71 En promedio, las predicciones tienen un error de aproximadamente 4.71 millas por galón. [Se presenta en unidades de la variable objetivo]
Mean absolute error: 3.78 En promedio, las predicciones tienen un error absoluto de aproximadamente 3.78 millas por galón.
mean absolute percentage error: 0.18 En promedio, las predicciones tienen un error porcentual absoluto de aproximadamente el 18%. El MAPE mide la precisión relativa del modelo en términos porcentuales.
Variance score: 0.57 Indica que el modelo explica el 57% de la variabilidad en las millas por galón.
R2-adjusted: 0.56 Es una versión ajustada del R^2 que tiene en cuenta el número de características en el modelo. En este caso, el R^2 ajustado es muy similar al R^2 sin ajustar.
En general, estos resultados indican que el modelo de regresión lineal tiene un rendimiento moderado en la predicción de las millas por galón (MPG) a partir de la variable 'caballos de fuerza'. El modelo explica alrededor del 57% de la variabilidad en las MPG, pero todavía hay un margen de mejora en términos de precisión y ajuste. Sería importante considerar otras características o técnicas de modelado para mejorar el rendimiento del modelo si es necesario.