Aprendizaje automático - Predicción de precios de vivienda

Al comprar una vivienda, las personas suelen hacer un juicio integral: ubicación, superficie, antigüedad, número de habitaciones, densidad de población, condiciones de transporte, etc. Cada factor influye en el precio, pero esta influencia no es lineal ni única, sino el resultado de una combinación, ponderación y competencia entre factores.

En el aprendizaje automático, elproblema de regresión, en esencia, convierte este "juicio empírico" en un modelo matemático calculable, reutilizable y evaluable.

Este capítulo comenzará desde cero y recorrerá por completo elproceso estándar de aprendizaje automático de predicción de precios de vivienda: comprensión de datos → análisis de características → entrenamiento del modelo → evaluación del modelo → optimización del modelo. El objetivo no es memorizar API, sino entender qué hace cada paso y por qué.


Parte 1: Preparación del proyecto y configuración del entorno

1.1 Herramientas principales utilizadas

  • NumPy: herramienta de cálculo numérico de bajo nivel, proporciona operaciones eficientes con arreglos.
  • Pandas: herramienta central para el análisis de datos tabulares, imprescindible en las etapas iniciales del aprendizaje automático.
  • Matplotlib / Seaborn: visualización de datos, utilizada para comprender la distribución y las relaciones de los datos.
  • Scikit-learn: caja de herramientas de aprendizaje automático, que incluye conjuntos de datos, modelos y métodos de evaluación.

1.2 Instalación de dependencias

pip install numpy pandas matplotlib seaborn scikit-learn

Parte 2: Cargar y comprender el conjunto de datos

Los tutoriales antiguos solían usar el conjunto de datos Boston Housing, pero este ha quedado obsoleto. Aquí se utiliza el recomendado oficialmenteCalifornia Housingconjunto de datos, con el mismo concepto pero datos más estandarizados.

Ejemplo: Cargar datos

import pandas as pd
from sklearn.datasets import fetch_california_housing

# Cargar el conjunto de datos de precios de vivienda de California
data = fetch_california_housing()

# Datos de características (X)
df_features = pd.DataFrame(
    data.data,
    columns=data.feature_names
)

# Variable objetivo (y): mediana del precio de la vivienda
df_target = pd.DataFrame(
    data.target,
    columns=['MedHouseVal']
)

print(df_features.head())
print(df_target.head())

Salida:

   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude
0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23
1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22
2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24
3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25
4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25
   MedHouseVal
0        4.526
1        3.585
2        3.521
3        3.413
4        3.422

En este punto debes tener claros tres puntos:

  • Cada fila son las características estadísticas de una casa
  • Cada columna es una variable que se puede usar para la predicción
  • MedHouseVales el objetivo que queremos predecir

Parte 3: Análisis exploratorio de datos (EDA)

Antes de entrenar el modelo, primero debes responder una pregunta:¿Vale la pena aprender de los datos?

3.1 Estructura de datos y verificación de valores faltantes

Ejemplo: Resumen de datos

print("Dimensiones de las características:", df_features.shape)
print("Dimensión del objetivo:", df_target.shape)

print("\n"Tipos de datos y valores faltantes:")
df_features.info()

print("\n"Estadísticas de valores faltantes:")
print(df_features.isnull().sum())

Conclusión:

  • Tamaño de muestra suficiente (alrededor de 20,000 registros)
  • Todas las características son numéricas
  • Sin valores faltantes, se puede modelar directamente

3.2 Relación entre una característica individual y el precio de la vivienda

El aprendizaje automático no es una caja negra; al menos en la etapa inicial, deberías saber qué está aprendiendo el modelo.

Ejemplo: Relación entre número de habitaciones y precio de la vivienda

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))
plt.scatter(df_features['AveRooms'], df_target['MedHouseVal'], alpha=0.4)
plt.xlabel('Average Rooms')
plt.ylabel('Median House Value')
plt.title('Rooms vs House Price')
plt.grid(True)
plt.show()

Conclusión intuitiva: cuantas más habitaciones, mayor es el precio general de la vivienda, pero existe una dispersión evidente. Esto es precisamente el significado de la existencia del modelo de regresión.

3.3 Análisis de correlación de características

Ejemplo: Mapa de calor de correlación

import seaborn as sns

df_all = pd.concat([df_features, df_target], axis=1)
corr = df_all.corr()

plt.figure(figsize=(10, 8))
sns.heatmap(corr, cmap='coolwarm', center=0)
plt.title('Feature Correlation Heatmap')
plt.show()

El propósito de este paso no es "elegir el modelo", sino confirmar que realmente existe una relación estadística aprendible.


Parte 4: Construcción del primer modelo de regresión

4.1 División del conjunto de entrenamiento y prueba

El modelo no puede usar los mismos datos para aprender y para evaluarse; de lo contrario, los resultados de la evaluación no tienen sentido.

Ejemplo: División del conjunto de datos

from sklearn.model_selection import train_test_split

X = df_features
y = df_target['MedHouseVal']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

print("Conjunto de entrenamiento:", X_train.shape)
print("Conjunto de prueba:", X_test.shape)

4.2 Entrenamiento del modelo de regresión lineal

Ejemplo: Entrenamiento del modelo

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X_train, y_train)

print("Intercepto:", model.intercept_)
print("Coeficientes:")
for name, coef in zip(X.columns, model.coef_):
    print(f"{name}: {coef:.4f}")

La ventaja de la regresión lineal es:alta interpretabilidad, adecuada para comprender la esencia del problema de regresión.


Parte 5: Predicción y evaluación del modelo

5.1 Comparación de resultados de predicción

Ejemplo: Predicción vs. valores reales

y_pred = model.predict(X_test)

result = pd.DataFrame({
    "Actual": y_test.values,
    "Predicted": y_pred
})

print(result.head())

5.2 Cuantificación del modelo mediante métricas de evaluación

Ejemplo: Métricas de evaluación

from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("MSE:", mse)
print("R2:", r2)

Explicación:

  • Cuanto menor sea el MSE, menor será el error de predicción
  • Cuanto más cercano a 1 sea el R², mayor será la capacidad explicativa del modelo

Parte 6: Optimización del modelo – Estandarización y regresión Ridge

6.1 ¿Por qué estandarizar?

Las diferencias de escala entre las características son enormes, lo que puede hacer que el modelo se incline hacia las características con valores numéricos grandes.

Ejemplo: Estandarización de características

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

6.2 Uso de la regresión Ridge para reducir el sobreajuste

Ejemplo: Regresión Ridge

from sklearn.linear_model import Ridge

ridge = Ridge(alpha=1.0)
ridge.fit(X_train_scaled, y_train)

y_pred_ridge = ridge.predict(X_test_scaled)

print("Ridge MSE:", mean_squared_error(y_test, y_pred_ridge))
print("Ridge R2:", r2_score(y_test, y_pred_ridge))

Parte 7: Revisión del flujo completo

Otras extensiones