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
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("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
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
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
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
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
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
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
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
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
