Machine Learning - Modelo de Regresión Lineal Multiple
ANALITICA PARA LA TOMA DE DECISIONES
Practica 2
25 / 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
2). REGRESIÓN LINEAL
Caso de estudio
Se realiza el entrenamiento del modelo de regresión lineal utilizando varias variables a diferencia de la practica 1. Tenemos un caso de Regresión Lineal Multiple.
- Las variables: horsepower, displacement, weight se tomarán como características
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/002_Machine_Learning_Regresion_Lineal_Multiple/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 |
3). 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 en las tres variables
df_auto.drop(['car name'], axis=1, inplace=True)
df_auto = df_auto.rename(columns={'mpg':'target'})
# Mentiene solo las que no tienen valor faltante. De cada columna
df_auto = df_auto[df_auto['horsepower'].notna() \
& df_auto['displacement'].notna() \
& df_auto['weight'].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
Gráfico de dispersión - Relación entre variables
variables = ['target', 'horsepower', 'displacement', 'weight']
fig, axes = plt.subplots(1, 3, figsize=(9.1, 2))
for i, variable in enumerate(['horsepower', 'displacement', 'weight']):
correlation = df_auto['target'].corr(df_auto[variable])
sns.scatterplot(data=df_auto, x=variable, y='target', ax=axes[i])
axes[i].set_title(f'Corr: {correlation:.2f}')
axes[i].set_xlabel(variable)
axes[i].set_ylabel('target')
plt.tight_layout()
plt.show()
Gráfico de pares - Análisis global de relaciones
variables = ['horsepower', 'displacement', 'weight']
# Crear un gráfico de pares con 'target' como otra dimensión
sns.set(style="ticks")
pairplot = sns.pairplot(df_auto, vars=variables, hue='target', diag_kind="kde", height=1.4, aspect=1.9)
plt.suptitle("Gráfico de Pares con Correlaciones y variable objetivo", y=1)
plt.subplots_adjust(top=0.85)
# Agregar valores de correlación numérica (opcional)
correlation_matrix = df_auto[variables].corr().values
for i, (ax_row, variable_row) in enumerate(zip(pairplot.axes, variables)):
for j, (ax_col, variable_col) in enumerate(zip(ax_row, variables)):
correlation = correlation_matrix[i, j]
text_color = 'black'
font_size = 12
ax_col.annotate(f"Corr: {correlation:.2f}", xy=(0.5, 0.95), xycoords='axes fraction',
ha='center', va='center', fontsize=font_size, color=text_color)
plt.show()
4). MARCO DE VALIDACIÓN
Separaración. Variables de entrada de la Variable objetivo
df_rlsm = df_auto[['target', 'horsepower', 'displacement', 'weight']]
y = df_rlsm['target']
x = df_rlsm.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("Tamaño del dataset de validación: ", x_test.shape)
Tamaño del dataset de entrenamiento: (313, 3) Tamaño del dataset de validación: (79, 3)
Parametros. Regresión Lineal multiple
La regresión lineal multiple tiene varias variables predictoras y 1 variable dependiente. A partir del conjunto de datos anterior, consideremos el efecto de: {caballos de fuerza, desplazamiento, peso} 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_rlsm = LinearRegression()
modelo_rlsm.fit(x_train, y_train)
print("Coeficientes: ", modelo_rlsm.coef_)
print("\nIntercepto: ", modelo_rlsm.intercept_)
Coeficientes: [-0.04328646 -0.00881229 -0.00520866] Intercepto: 45.40354328129037
5). 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_rlsm.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 (R2squared) %.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: 18.01 RMSE 4.24 Mean absolute error: 3.51 mean absolute percentage error: 0.16 Variance score (R2squared) 0.65 R2-adjusted: 0.63
Lectura de las metricas
Mean squared error: 18.01 En promedio, las predicciones del modelo tienen un error cuadrático de 18.01 unidades en comparación con los valores reales. El modelo tiene algún error en sus predicciones, pero es relativamente bajo
RMSE 4.24 En promedio, las predicciones tienen un error de aproximadamente 4.24 millas por galón. [Se presenta en unidades de la variable objetivo]
Mean absolute error: 3.51 En promedio, las predicciones tienen un error absoluto de aproximadamente 3.51 millas por galón.
mean absolute percentage error: 0.16 En promedio, las predicciones tienen un error porcentual absoluto de aproximadamente el 16%. El MAPE mide la precisión relativa del modelo en términos porcentuales.
Variance score (R2squared): 0.65 Indica que el modelo explica el 65% de la variabilidad en las millas por galón. Es relativamente bueno
R2-adjusted: 0.63 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 razonablemente bueno en la predicción de la variable objetivo en comparación con los valores reales en el conjunto de datos de prueba. Las métricas sugieren que el modelo tiene un buen ajuste y que las predicciones están en línea con los valores reales en términos de error cuadrático, error absoluto y dispersión.