Dominar la Predicción de Precios de Automóviles con Modelos de Regresión Avanzados: Una Guía Integral
Tabla de Contenidos
- Introducción
- Visión General del Conjunto de Datos
- Importación de Datos y Exploración Inicial
- Limpieza y Preprocesamiento de Datos
- Selección y Codificación de Características
- División de Entrenamiento y Prueba
- Escalado de Características
- Construcción y Evaluación de Modelos de Regresión
- Comparación del Rendimiento de los Modelos
- Conclusión
Introducción
La analítica predictiva empodera a las empresas para anticipar tendencias futuras, optimizar operaciones y mejorar los procesos de toma de decisiones. La predicción de precios de automóviles es un ejemplo quintesencial donde los modelos de aprendizaje automático pueden prever los precios de los vehículos basándose en atributos como la marca, especificaciones del motor, tipo de combustible y más. Esta guía te conduce a través de la construcción de una tubería de modelos de regresión completa, desde el preprocesamiento de datos hasta la evaluación de múltiples algoritmos de regresión.
Visión General del Conjunto de Datos
El conjunto de datos de Predicción de Precios de Automóviles en Kaggle es un recurso rico que contiene 205 entradas con 26 características cada una. Estas características abarcan varios aspectos de los automóviles, como el número de puertas, tamaño del motor, caballos de fuerza, tipo de combustible y más, todos los cuales influyen en el precio de mercado del automóvil.
Características Clave:
CarName
: Nombre del automóvil (marca y modelo)FuelType
: Tipo de combustible utilizado (por ejemplo, gasolina, diésel)Aspiration
: Tipo de aspiración del motorDoornumber
: Número de puertas (dos o cuatro)Enginesize
: Tamaño del motorHorsepower
: Potencia del motorPrice
: Precio de mercado del automóvil (variable objetivo)
Importación de Datos y Exploración Inicial
Primero, importamos el conjunto de datos usando pandas y echamos un vistazo preliminar a la estructura de los datos.
1 2 3 4 5 6 7 |
import pandas as pd # Cargar el conjunto de datos data = pd.read_csv('CarPrice.csv') # Mostrar las primeras cinco filas print(data.head()) |
Salida de Muestra:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
car_ID symboling CarName fueltype aspiration doornumber \ 0 1 3 alfa-romero giulia gas std two 1 2 3 alfa-romero stelvio gas std two 2 3 1 alfa-romero Quadrifoglio gas std two 3 4 2 audi 100 ls gas std four 4 5 2 audi 100ls gas std four carbody drivewheel enginelocation wheelbase ... horsepower peakrpm citympg \ 0 convertible rwd front 88.6 ... 111.0 5000 21 1 convertible rwd front 88.6 ... 111.0 5000 21 2 hatchback rwd front 94.5 ... 154.0 5000 19 3 sedan fwd front 99.8 ... 102.0 5500 24 4 sedan 4wd front 99.4 ... 115.0 5500 18 highwaympg price 0 27 13495.0 1 27 16500.0 2 26 16500.0 3 30 13950.0 4 22 17450.0 |
Limpieza y Preprocesamiento de Datos
Manejo de Datos Numéricos Faltantes
Los valores faltantes pueden sesgar significativamente el rendimiento de los modelos de aprendizaje automático. Primero abordamos los datos numéricos faltantes imputando con el valor medio.
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np from sklearn.impute import SimpleImputer # Identificar columnas numéricas numerical_cols = list(np.where((X.dtypes == np.int64) | (X.dtypes == np.float64))[0]) # Inicializar el imputador imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean') imp_mean.fit(X.iloc[:, numerical_cols]) # Imputar datos numéricos faltantes X.iloc[:, numerical_cols] = imp_mean.transform(X.iloc[:, numerical_cols]) |
Manejo de Datos Categóricos Faltantes
Para las variables categóricas, los valores faltantes se imputan utilizando la estrategia más frecuente.
1 2 3 4 5 6 7 8 9 |
# Identificar columnas categóricas string_cols = list(np.where((X.dtypes == np.object))[0]) # Inicializar el imputador para datos categóricos imp_freq = SimpleImputer(missing_values=np.nan, strategy='most_frequent') imp_freq.fit(X.iloc[:, string_cols]) # Imputar datos categóricos faltantes X.iloc[:, string_cols] = imp_freq.transform(X.iloc[:, string_cols]) |
Selección y Codificación de Características
Eliminación de Características Irrelevantes
La columna car_ID
es un identificador único y no contribuye al poder predictivo del modelo. Por lo tanto, se elimina.
1 2 |
# Eliminar la columna 'car_ID' X.drop('car_ID', axis=1, inplace=True) |
Codificación One-Hot de Variables Categóricas
Los algoritmos de aprendizaje automático requieren una entrada numérica. Por lo tanto, las variables categóricas se transforman utilizando la Codificación One-Hot.
1 2 3 4 5 6 7 8 9 10 11 12 |
from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # Reidentificar columnas categóricas después de eliminar 'car_ID' string_cols = list(np.where((X.dtypes == np.object))[0]) # Aplicar Codificación One-Hot columnTransformer = ColumnTransformer( [('encoder', OneHotEncoder(), string_cols)], remainder='passthrough' ) X = columnTransformer.fit_transform(X) |
Antes de la Codificación:
- Forma: (205, 24)
Después de la Codificación:
- Forma: (205, 199)
División de Entrenamiento y Prueba
Dividir el conjunto de datos en conjuntos de entrenamiento y prueba es crucial para evaluar el rendimiento del modelo.
1 2 3 4 5 6 7 8 9 |
from sklearn.model_selection import train_test_split # Realizar la división de entrenamiento y prueba X_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.20, random_state=1 ) print(f"Forma del conjunto de entrenamiento: {X_train.shape}") print(f"Forma del conjunto de prueba: {X_test.shape}") |
Salida:
1 2 |
Forma del conjunto de entrenamiento: (164, 199) Forma del conjunto de prueba: (41, 199) |
Escalado de Características
El escalado de características asegura que todas las características contribuyan por igual al rendimiento del modelo. Aquí, utilizamos la Estandarización.
1 2 3 4 5 6 7 8 9 |
from sklearn import preprocessing # Inicializar StandardScaler sc = preprocessing.StandardScaler(with_mean=False) sc.fit(X_train) # Transformar los datos X_train = sc.transform(X_train) X_test = sc.transform(X_test) |
Construcción y Evaluación de Modelos de Regresión
Exploraremos varios modelos de regresión, evaluando cada uno basado en la puntuación R².
1. Regresión Lineal
La Regresión Lineal sirve como un modelo de referencia.
1 2 3 4 5 6 7 8 9 10 11 |
from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # Inicializar y entrenar el modelo model = LinearRegression() model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión Lineal Puntuación R²: {r2:.2f}") |
Puntuación R²: 0.097
Interpretación: El modelo explica aproximadamente el 9.7% de la varianza en los precios de los automóviles.
2. Regresión Lineal Polinómica
Para capturar relaciones no lineales, introducimos características polinómicas.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from sklearn.preprocessing import PolynomialFeatures # Inicializar PolynomialFeatures poly = PolynomialFeatures(degree=2) X_train_poly = poly.fit_transform(X_train) X_test_poly = poly.transform(X_test) # Entrenar el modelo model = LinearRegression() model.fit(X_train_poly, y_train) # Predecir y evaluar y_pred = model.predict(X_test_poly) r2 = r2_score(y_test, y_pred) print(f"Regresión Lineal Polinómica Puntuación R²: {r2:.2f}") |
Puntuación R²: -0.45
Interpretación: El modelo rinde peor que el modelo base, explicando -45% de la varianza.
3. Regresión con Árbol de Decisión
Los Árboles de Decisión pueden modelar relaciones complejas al particionar los datos.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.tree import DecisionTreeRegressor # Inicializar y entrenar el modelo model = DecisionTreeRegressor(max_depth=4) model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión con Árbol de Decisión Puntuación R²: {r2:.2f}") |
Puntuación R²: 0.88
Interpretación: Una mejora significativa, explicando el 88% de la varianza.
4. Regresión con Bosque Aleatorio
Random Forest agrega múltiples Árboles de Decisión para mejorar el rendimiento y mitigar el sobreajuste.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.ensemble import RandomForestRegressor # Inicializar y entrenar el modelo model = RandomForestRegressor(n_estimators=25, random_state=10) model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión con Bosque Aleatorio Puntuación R²: {r2:.2f}") |
Puntuación R²: 0.91
Interpretación: Rendimiento excelente, explicando el 91% de la varianza.
5. Regresión AdaBoost
AdaBoost combina aprendices débiles para formar un predictor fuerte enfocándose en los errores.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.ensemble import AdaBoostRegressor # Inicializar y entrenar el modelo model = AdaBoostRegressor(random_state=0, n_estimators=100) model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión AdaBoost Puntuación R²: {r2:.2f}") |
Puntuación R²: 0.88
Interpretación: Comparable al Árbol de Decisión, explicando el 88% de la varianza.
6. Regresión XGBoost
XGBoost es un potente marco de boosting de gradiente conocido por su eficiencia y rendimiento.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import xgboost as xgb # Inicializar y entrenar el modelo model = xgb.XGBRegressor( n_estimators=100, reg_lambda=1, gamma=0, max_depth=3, learning_rate=0.05 ) model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión XGBoost Puntuación R²: {r2:.2f}") |
Puntuación R²: 0.89
Interpretación: Rendimiento robusto, explicando el 89% de la varianza.
7. Regresión de Vectores de Soporte (SVR)
SVR es efectivo en espacios de alta dimensionalidad pero puede tener un rendimiento inferior con conjuntos de datos más grandes.
1 2 3 4 5 6 7 8 9 10 |
from sklearn.svm import SVR # Inicializar y entrenar el modelo model = SVR() model.fit(X_train, y_train) # Predecir y evaluar y_pred = model.predict(X_test) r2 = r2_score(y_test, y_pred) print(f"Regresión de Vectores de Soporte (SVR) Puntuación R²: {r2:.2f}") |
Puntuación R²: -0.03
Interpretación: Rendimiento deficiente, explicando -3% de la varianza.
Comparación del Rendimiento de los Modelos
Modelo | Puntuación R² |
---|---|
Regresión Lineal | 0.10 |
Regresión Lineal Polinómica | -0.45 |
Regresión con Árbol de Decisión | 0.88 |
Regresión con Bosque Aleatorio | 0.91 |
Regresión AdaBoost | 0.88 |
Regresión XGBoost | 0.89 |
Regresión de Vectores de Soporte (SVR) | -0.03 |
Perspectivas:
- Regresión con Bosque Aleatorio supera a todos los demás modelos con una puntuación R² de 0.91, lo que indica que explica el 91% de la varianza en los precios de los automóviles.
- Regresión Lineal Polinómica tuvo el peor desempeño, incluso peor que el modelo base, lo que sugiere sobreajuste o una transformación inadecuada de las características.
- Regresión de Vectores de Soporte (SVR) tuvo dificultades con este conjunto de datos, posiblemente debido a la alta dimensionalidad posterior a la codificación.
Conclusión
El modelado predictivo para la predicción de precios de automóviles subraya la importancia de seleccionar el algoritmo adecuado y realizar un preprocesamiento exhaustivo de los datos. En nuestra exploración:
- Los modelos de Árbol de Decisión y Bosque Aleatorio demostraron un rendimiento excepcional, con Bosque Aleatorio superando ligeramente a los demás.
- Los métodos de ensamble como AdaBoost y XGBoost también mostraron resultados sólidos, destacando su eficacia en el manejo de conjuntos de datos complejos.
- Los modelos lineales, especialmente cuando se extienden a características polinómicas, no siempre garantizan un mejor rendimiento y, a veces, pueden degradar la eficacia del modelo.
- Regresión de Vectores de Soporte (SVR) puede no ser la mejor opción para conjuntos de datos con alta dimensionalidad o donde los patrones no lineales son menos pronunciados.
Conclusiones Clave:
- Preprocesamiento de Datos: Manejar valores faltantes y codificar variables categóricas son pasos cruciales que influyen significativamente en el rendimiento del modelo.
- Escalado de Características: Asegura que todas las características contribuyan de manera equitativa, mejorando la eficiencia de los algoritmos basados en gradientes.
- Selección de Modelos: Los métodos de ensamble como Bosques Aleatorios y XGBoost a menudo ofrecen un rendimiento superior en tareas de regresión.
- Evaluación de Modelos: La puntuación R² es una métrica valiosa para evaluar qué tan bien las predicciones se aproximan a los resultados reales.
Emprender la predicción de precios de automóviles utilizando modelos de regresión avanzados no solo mejora la precisión predictiva sino que también equipa a las partes interesadas con insights accionables sobre la dinámica del mercado. A medida que el campo del aprendizaje automático continúa evolucionando, mantenerse al día con los últimos algoritmos y técnicas sigue siendo esencial para entusiastas y profesionales de los datos por igual.