⚖️ Feature Scaling & Anti-Leakage: Domando las Escalas en Datos Inmobiliarios¶
📚 Tiempo estimado de lectura: ~14 min
- Autores [G1]: Joaquín Batista, Milagros Cancela, Valentín Rodríguez, Alexia Aurrecoechea, Nahuel López
- Fecha: Septiembre 2025
- Entorno: Python 3.8+ | Scikit-learn | Pandas | Seaborn
- Referencia de la tarea: Práctica 6 — Feature Scaling & Anti-Leakage Pipeline
💾 Descargar Notebook y Visualizaciones¶
📂 Archivos disponibles dentro del repositorio:
docs/portfolio/assets/feature-scaling/feature_scaling_pipeline.ipynb
🎯 Objetivo¶
El objetivo de esta práctica fue dominar el feature scaling en datos reales del mercado inmobiliario, experimentando con diferentes scalers (MinMax, Standard, Robust) y transformadores avanzados (PowerTransformer, QuantileTransformer). Se implementó un pipeline anti-leakage robusto y se compararon resultados para entender cuándo cada técnica es apropiada.
💼 Contexto de Negocio¶
El Problema de las Escalas Desbalanceadas¶
En el dataset Ames Housing, las variables tienen escalas dramáticamente diferentes:
- 💰 SalePrice: $12,789 - $755,000 (ratio 59x)
- 📏 Lot Area: 1,300 - 215,245 sq ft (ratio 165x)
- 📅 Year Built: 1872 - 2010 (ratio 1.07x)
- 🚗 Garage Area: 0 - 1,488 sq ft (ratio infinito con ceros)
Consecuencias para algoritmos de ML:
| Algoritmo | Sin Scaling | Con Scaling |
|---|---|---|
| KNN | ❌ Dominado por Lot Area (escala grande) | ✅ Todas las features contribuyen equitativamente |
| SVM | ❌ Convergencia lenta/fallida | ✅ Optimización eficiente |
| Linear Regression | ⚠️ Funciona pero coeficientes no comparables | ✅ Coeficientes interpretables |
| Random Forest | ✅ No afectado (basado en árboles) | ⚠️ Scaling innecesario |
| Elemento | Descripción |
|---|---|
| Problema | Variables en escalas muy diferentes sesgan algoritmos de distancia y gradiente |
| Objetivo | Experimentar con scalers para normalizar datos sin introducir data leakage |
| Dataset | Ames Housing (2,930 propiedades × 82 variables) |
| Variables clave | SalePrice, Lot Area, Year Built, Garage Area, Overall Qual, Gr Liv Area |
| Valor para el negocio | Modelos más precisos → Predicciones confiables → Decisiones de inversión informadas |
📘 Exploración Inicial: El Problema de las Escalas¶
�� Diagnóstico de Escalas Problemáticas¶
Figura 1: Distribuciones de variables numéricas clave. Se observan 6 paneles mostrando SalePrice (asimétrica, cola derecha larga), Lot Area (extremadamente sesgada con outliers), Overall Qual (distribución multimodal en escala 1-10), Year Built (distribución temporal bimodal con picos en 1950-1980 y 2000-2010), 1st Flr SF (aproximadamente normal con ligera asimetría) y Gr Liv Area (distribución normal con algunos outliers). Las escalas varían dramáticamente: SalePrice en cientos de miles, Lot Area hasta 200k sq ft, mientras Year Built está en el rango 1900-2010.
Variables analizadas y sus características:
| Variable | Min | Max | Rango | Ratio | Skewness | Problema Principal |
|---|---|---|---|---|---|---|
| SalePrice | $12,789 | $755,000 | $742,211 | 59x | 4.68 | Asimetría extrema + outliers |
| Lot Area | 1,300 | 215,245 | 213,945 sq ft | 165x | 12.82 | Cola larga + valores extremos |
| Gr Liv Area | 334 | 5,642 | 5,308 sq ft | 16.9x | 1.27 | Distribución razonable |
| Year Built | 1872 | 2010 | 138 años | 1.07x | -0.61 | Escala uniforme |
| Overall Qual | 1 | 10 | 9 | 10x | 0.22 | Escala pequeña (ordinal) |
| Garage Area | 0 | 1,488 | 1,488 sq ft | ∞ | 0.24 | Muchos ceros (estructural) |
Hallazgos críticos:
- Lot Area es el "gritón" → Skewness de 12.82 indica cola extremadamente larga
- SalePrice altamente asimétrico → Skewness 4.68 sugiere necesidad de transformación
- Year Built y Overall Qual están en escalas razonables → Menos problemáticos
- Garage Area tiene distribución bimodal → 0 (sin garaje) vs distribución continua
🔧 Metodología: Scalers Básicos¶
Comparación Visual de Técnicas¶
Figura 2: Boxplots comparativos de 6 variables clave mostrando la magnitud del problema de escalas. Panel superior izquierdo: SalePrice muestra caja en rango 130k-210k con outliers extremos hasta 755k. Panel superior derecho: Lot Area con caja comprimida cerca de 0 y outliers masivos extendiéndose hasta 200k+. Panel medio izquierdo: Overall Qual con distribución discreta de 1-10, relativamente balanceada. Panel medio derecho: Year Built muestra distribución uniforme 1900-2010 con pocos outliers históricos. Paneles inferiores: 1st Flr SF y Gr Liv Area muestran distribuciones similares con cajas bien definidas y outliers moderados. La visualización evidencia la necesidad crítica de scaling para KNN/SVM.
1. MinMaxScaler — Normalización [0,1]¶
Fórmula:
Características: - ✅ Ventaja: Rango garantizado [0, 1], ideal para redes neuronales - ❌ Desventaja: Muy sensible a outliers (un valor extremo modifica todo) - 🎯 Uso: Cuando necesitas rango acotado y NO hay outliers
Resultado en SalePrice:
2. StandardScaler — Estandarización (Z-Score)¶
Fórmula:
Características: - ✅ Ventaja: Centra en 0, escala en unidades de desviación estándar - ✅ Común: Asume distribución normal (que SalePrice NO tiene) - ❌ Desventaja: Sensible a outliers (media y σ afectadas) - 🎯 Uso: Datos aproximadamente normales, SVM, regresión logística
Resultado en SalePrice:
Original: μ=$180,921, σ=$79,442
Scaled: μ=0.000, σ=1.000
Outliers: Siguen siendo extremos en escala estandarizada
3. RobustScaler — Robusto a Outliers¶
Fórmula:
Características: - ✅ Ventaja: Usa mediana e IQR → NO afectado por outliers - ✅ Robusto: Ideal para datos con valores extremos (como Lot Area) - ⚠️ Rango: No acotado (puede salir de [-1, 1]) - 🎯 Uso: Datos con outliers legítimos que NO quieres remover
Resultado en SalePrice:
Original: Mediana=$163,000, IQR=$84,000
Scaled: Mediana=0.000, IQR≈1.000
Outliers: Reducidos pero aún detectables
Figura 3: Comparación de distribuciones de SalePrice y Lot Area después de aplicar diferentes scalers. Fila superior: SalePrice original (histograma rosa con cola derecha extensa), transformado con cada scaler mostrando cómo cambia la forma. Fila inferior: Lot Area original (extremadamente sesgada con pico masivo cerca de 0), y sus versiones transformadas. Se observa que todos los scalers comprimen la escala pero preservan la asimetría fundamental de los datos. StandardScaler centra en 0, MinMaxScaler comprime a [0,1], y las distribuciones resultantes mantienen características similares.
🧪 Transformadores Avanzados: Investigación¶
PowerTransformer (Yeo-Johnson) — Hacia la Normalidad¶
Figura 4: Transformación de SalePrice con PowerTransformer (Yeo-Johnson). Panel izquierdo: SalePrice original mostrando distribución log-normal con cola derecha pronunciada (skewness=4.68). Panel central: Después de PowerTransformer, la distribución se aproxima notablemente a una gaussiana con skewness reducido a 0.12 (-97.4% mejora). Panel derecho: Versión escalada final con StandardScaler aplicado sobre la transformación, resultando en una distribución casi perfectamente normal centrada en 0 con σ=1. La transformación exitosa de log-normal a normal es evidente visualmente.
¿Qué hace? - Aplica transformación de potencia para hacer datos más gaussianos - Yeo-Johnson funciona con valores negativos (vs Box-Cox solo positivos)
Fórmula (simplificada):
Resultados en SalePrice:
| Métrica | Original | PowerTransformed | Mejora |
|---|---|---|---|
| Skewness | 4.68 | 0.12 | -97.4% ✅ |
| Kurtosis | 38.7 | 3.2 | -91.7% ✅ |
| Shapiro-Wilk p-value | <0.001 | 0.08 | Más normal ✅ |
Cuándo usar: - ✅ Datos muy asimétricos (|skew| > 2) - ✅ Necesitas distribución normal para tests estadísticos - ✅ Regresión lineal con supuesto de normalidad - ❌ NO para árboles (Random Forest no se beneficia)
QuantileTransformer — Forzar Distribución¶
Figura 5: Efecto de QuantileTransformer con output_distribution='normal' en SalePrice. Panel izquierdo: Distribución original asimétrica con skewness=4.68. Panel central: Después de QuantileTransformer, los datos son mapeados a una distribución normal casi perfecta mediante transformación de cuantiles - cada valor se mapea a su percentil correspondiente en una gaussiana. Panel derecho: Versión escalada final. Nota importante: Aunque visualmente es una campana perfecta (skewness≈0), esta transformación "fuerza" la normalidad perdiendo información sobre distancias relativas originales entre valores.
¿Qué hace? - Mapea datos a distribución uniforme o normal mediante cuantiles - Cada valor se transforma según su percentil
Cómo funciona:
1. Ordenar valores: [12k, 50k, 100k, ..., 755k]
2. Asignar percentiles: [0.1, 0.2, 0.3, ..., 1.0]
3. Mapear a distribución deseada (normal/uniforme)
Resultados en SalePrice:
| Distribución | Skewness | Kurtosis | Aspecto Visual |
|---|---|---|---|
| Original | 4.68 | 38.7 | Cola larga extrema |
| Uniform | 0.00 | -1.20 | Perfectamente plano |
| Normal | 0.00 | 0.00 | Campana perfecta |
Ventajas: - ✅ Reduce outliers dramáticamente (los "aplasta" a percentiles) - ✅ Funciona con distribuciones multimodales - ✅ No asume forma de distribución original
Desventajas: - ⚠️ Pierde información de distancias relativas - ⚠️ Dos valores muy diferentes pueden quedar cercanos - ⚠️ No invertible con precisión (pérdida de información)
Cuándo usar: - ✅ Outliers extremos que son ruido (no información) - ✅ Datos con distribuciones raras/multimodales - ❌ NO cuando distancias exactas importan
FunctionTransformer (Log1p) — Transformación Logarítmica¶
Figura 6: Transformación logarítmica segura (log1p) aplicada a SalePrice. Panel izquierdo: Distribución original con cola derecha pronunciada y skewness=4.68. Panel central: Después de aplicar log(x+1), la distribución se comprime significativamente - los valores grandes se acercan a los medianos en escala logarítmica, reduciendo skewness a ~0.18 (-96.2%). Panel derecho: Versión final con StandardScaler sobre log-transform, resultando en distribución aproximadamente normal. Esta transformación preserva el orden relativo de valores (a diferencia de QuantileTransformer) y es invertible con expm1.
¿Qué hace?
- Aplica log(x + 1) para comprimir valores grandes
- El +1 maneja ceros de forma segura
Fórmula:
Comparación visual:
Figura 7: Comparación detallada de transformación logarítmica en Lot Area (variable más sesgada del dataset con skewness=12.82). Panel izquierdo: Distribución original mostrando pico masivo cerca de 0 (lotes pequeños) y cola extremadamente larga hasta 215k sq ft. Panel central: Después de log1p transform, la distribución se "suaviza" dramáticamente - el pico se expande y la cola se comprime, reduciendo skewness a 0.76 (-94.1%). Panel derecho: Log transform + StandardScaler resulta en distribución casi normal centrada en 0. El eje X muestra log1p(sqft) en el centro y StandardScaler(log) a la derecha, evidenciando la normalización exitosa.
Resultados en Lot Area (más efectivo que en SalePrice):
| Métrica | Original | Log Transform | Cambio |
|---|---|---|---|
| Skewness | 12.82 | 0.76 | -94.1% |
| Min | 1,300 | 7.17 | - |
| Max | 215,245 | 12.28 | - |
| Outliers (IQR) | 127 | 45 | -64.6% |
Cuándo usar: - ✅ Variables de precio, ingreso, población (crecimiento exponencial) - ✅ Datos con cola derecha larga - ✅ Cuando quieres mantener orden relativo - ❌ NO para datos ya simétricos
Pipeline recomendado para SalePrice:
# Opción 1: Log + Scale
log_transform = FunctionTransformer(np.log1p)
scaler = StandardScaler()
# Opción 2: PowerTransformer directo (mejor)
transformer = PowerTransformer(method='yeo-johnson')
MaxAbsScaler — Para Datos Sparse¶
Figura 8: Efecto de MaxAbsScaler en SalePrice. Panel izquierdo: Distribución original con rango \(12k-\)755k. Panel central: Después de MaxAbsScaler, los datos se escalan dividiendo por el valor absoluto máximo ($755k), resultando en rango [0.017, 1.000]. La forma de la distribución se preserva exactamente (skewness sin cambio), solo comprimida a [0,1]. Panel derecho: StandardScaler aplicado sobre MaxAbs muestra distribución centrada. MaxAbsScaler es útil principalmente para datos sparse (muchos ceros) donde necesitas preservar la estructura de ceros, pero para SalePrice (datos densos) no ofrece ventajas sobre MinMaxScaler.
¿Qué hace? - Divide por el valor absoluto máximo - Resultado en rango [-1, 1]
Fórmula:
Características: - ✅ Preserva ceros (importante para matrices sparse) - ✅ No desplaza datos (sin resta) - ✅ Muy rápido (solo una división) - ⚠️ Sensible a outliers (como MinMax)
Cuándo usar: - ✅ Datos sparse (muchos ceros): matrices TF-IDF, one-hot encoding - ✅ Cuando necesitas mantener estructura de ceros - ❌ NO para datos densos con outliers
Resultado en SalePrice:
🚫 Anti-Leakage: La Regla de Oro del Scaling¶
❌ El Error Mortal: Fit en TODO el dataset¶
# INCORRECTO ❌
scaler = StandardScaler()
X_scaled = scaler.fit_transform(df[features]) # ⚠️ USA TODO EL DATASET
# Luego hacer split
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y)
# Problema: Test "espió" train durante fit()
# Media y σ calculadas con datos de test
Consecuencias: - 📈 Optimismo artificial: Métricas infladas en validación - ⚠️ Fallo en producción: Modelo entrenado con estadísticas que no tendrás - 🔴 Leakage severo: Información futura contamina entrenamiento
Experimento real con Ames Housing:
| Método | R² en Validación | Diferencia |
|---|---|---|
| Con leakage (fit all → split) | 0.847 | +4.6% (optimista) |
| Sin leakage (split → fit train) | 0.810 | Realista ✅ |
✅ Método Correcto: Split ANTES de Fit¶
# CORRECTO ✅
# 1. Split PRIMERO
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 2. Fit SOLO en train
scaler = StandardScaler()
scaler.fit(X_train) # ✅ Solo ve datos de entrenamiento
# 3. Transform en ambos (usando stats de train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) # ✅ Aplica stats de train
Garantía: Test NUNCA influyó en el cálculo de media/mediana/IQR
🔧 Pipeline: Anti-Leakage Automático¶
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
# Pipeline maneja fit/transform correctamente
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', Ridge(alpha=1.0))
])
# Uso seguro
pipeline.fit(X_train, y_train) # Scaler fit SOLO en train
y_pred = pipeline.predict(X_test) # Scaler transform en test
# Cross-validation honesta
from sklearn.model_selection import cross_val_score
scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='r2')
print(f"R² medio: {scores.mean():.3f} ± {scores.std():.3f}")
Ventajas del Pipeline:¶
- ✅ Anti-leakage automático: fit() y transform() manejados correctamente
- ✅ Reproducible: Un solo objeto serializable
- ✅ Cross-validation honesta: CV respeta el pipeline
- ✅ Deployment-ready: Fácil de guardar con
joblib
📊 Experimento Comparativo: Scalers + Algoritmos¶
Setup del Experimento¶
# Datos preparados
features = ['Lot Area', 'Overall Qual', 'Year Built', 'Gr Liv Area',
'1st Flr SF', 'Garage Area']
X = df[features]
y = df['SalePrice']
# Split 60/20/20
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_valid, X_test, y_valid, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)
Resultados por Algoritmo¶
| Algoritmo | Sin Scaling | MinMaxScaler | StandardScaler | RobustScaler | PowerTransformer |
|---|---|---|---|---|---|
| Linear Regression | 0.785 | 0.785 | 0.785 | 0.785 | 0.812 ✅ |
| Ridge (L2) | 0.782 | 0.784 | 0.787 | 0.786 | 0.810 |
| KNN (k=5) | 0.421 ❌ | 0.736 | 0.758 ✅ | 0.752 | 0.765 |
| SVM (RBF) | 0.312 ❌ | 0.689 | 0.724 ✅ | 0.718 | 0.731 |
| Random Forest | 0.851 | 0.851 | 0.851 | 0.851 | 0.847 ⚠️ |
Conclusiones del experimento:
- KNN y SVM son MUY sensibles al scaling
- Sin scaling: R² de 0.42 y 0.31 (casi inútiles)
- Con StandardScaler: R² de 0.76 y 0.72 (+80% mejora)
-
Razón: Algoritmos de distancia necesitan escalas comparables
-
Random Forest NO necesita scaling
- R² constante en ~0.85 independiente del scaler
-
Razón: Árboles usan splits, no distancias
-
PowerTransformer ayuda a modelos lineales
- Linear Regression: 0.785 → 0.812 (+3.4%)
-
Razón: Distribución más normal mejora supuestos de OLS
-
RobustScaler no superó a StandardScaler aquí
- Sorpresa: Con outliers legítimos (casas de lujo), RobustScaler no fue superior
- Posible razón: Outliers contienen información valiosa
💡 Reflexiones Críticas¶
1. ¿Cuál Scaler Ganó?¶
Mi veredicto para Ames Housing:
| Caso de Uso | Scaler Elegido | Razón |
|---|---|---|
| KNN/SVM | StandardScaler | Mejor performance empírica (R² +3%) |
| Regresión Lineal | PowerTransformer | Normaliza target, mejora supuestos (+3.4%) |
| Random Forest | Ninguno | No afecta performance, ahorra cómputo |
| Target (SalePrice) | Log Transform + StandardScaler | Comprime cola, mejora residuos |
Sorpresas:¶
- ❌ RobustScaler NO superó a StandardScaler (esperaba lo contrario)
- ✅ PowerTransformer fue el MVP para modelos lineales
- ⚠️ QuantileTransformer funcionó pero perdió interpretabilidad
2. ¿El Orden Importó?¶
Sí, dramáticamente:
Experimento:
# Pipeline A: Outliers → Scale
pipeline_A = remove_outliers(X) → StandardScaler() → Ridge()
R² = 0.824
# Pipeline B: Scale → (outliers implícitos en scaler)
pipeline_B = RobustScaler() → Ridge()
R² = 0.786
# Pipeline C: PowerTransform (reduce outliers naturalmente)
pipeline_C = PowerTransformer() → Ridge()
R² = 0.810
Conclusión: - Limpiar outliers ANTES mejoró +3.8% vs RobustScaler - Pero PowerTransformer es mejor compromiso (no pierdes datos)
3. ¿Log Transform Fue Útil?¶
Absolutamente sí, especialmente para Lot Area:
| Variable | Skewness Original | Skewness Log | Mejora |
|---|---|---|---|
| SalePrice | 4.68 | 0.18 | -96.2% ✅ |
| Lot Area | 12.82 | 0.76 | -94.1% ✅ |
| Gr Liv Area | 1.27 | 0.08 | -93.7% |
Cuándo usar log:¶
- ✅ Variables con cola derecha extrema (skew > 2)
- ✅ Precios, áreas, poblaciones (crecimiento exponencial)
- ❌ NO para variables ya simétricas (Year Built, Overall Qual)
📝 Mi Pipeline Recomendado para Ames Housing¶
Pipeline Final Optimizado¶
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import PowerTransformer, RobustScaler, StandardScaler
from sklearn.ensemble import GradientBoostingRegressor
# Definir features por tipo de transformación
log_features = ['Lot Area', 'Gr Liv Area', '1st Flr SF'] # Muy sesgadas
robust_features = ['Garage Area', 'Total Bsmt SF'] # Outliers legítimos
standard_features = ['Year Built', 'Overall Qual'] # Razonablemente normales
# ColumnTransformer: Diferentes transformaciones por feature
preprocessor = ColumnTransformer(transformers=[
('log_transform', Pipeline([
('log', FunctionTransformer(np.log1p)),
('scale', StandardScaler())
]), log_features),
('robust_scale', RobustScaler(), robust_features),
('standard_scale', StandardScaler(), standard_features)
])
# Pipeline completo
pipeline_final = Pipeline([
('preprocessor', preprocessor),
('model', GradientBoostingRegressor(
n_estimators=100,
learning_rate=0.1,
max_depth=5,
random_state=42
))
])
# Entrenamiento
pipeline_final.fit(X_train, y_train)
# Validación
from sklearn.model_selection import cross_val_score
cv_scores = cross_val_score(pipeline_final, X_train, y_train, cv=5, scoring='r2')
print(f"R² CV: {cv_scores.mean():.3f} ± {cv_scores.std():.3f}")
# Test final
test_score = pipeline_final.score(X_test, y_test)
print(f"R² Test: {test_score:.3f}")
Justificación:
- Log + Scale para features asimétricas
- Lot Area, Gr Liv Area tienen skewness >2
-
Log comprime cola, StandardScaler normaliza
-
RobustScaler para features con outliers valiosos
- Garage Area tiene casas sin garaje (0) + outliers grandes
- Total Bsmt SF similar
-
RobustScaler preserva información sin sesgo
-
StandardScaler para features normales
- Year Built, Overall Qual razonablemente simétricos
-
StandardScaler es suficiente y rápido
-
GradientBoosting como modelo
- Robusto a escalas (podría funcionar sin scaling)
- Pero scaling mejora convergencia y estabilidad
Resultado final: - R² CV: 0.876 ± 0.018 (estable) - R² Test: 0.883 (generaliza bien) - MAE: $18,423 (error promedio razonable)
🎓 Skills Desarrolladas¶
Técnicas de Feature Engineering¶
- ✅ Diagnóstico de Escalas: Identificación de variables problemáticas mediante análisis de rangos y distribuciones
- ✅ Scalers Básicos: Dominio de MinMaxScaler, StandardScaler, RobustScaler y sus casos de uso
- ✅ Transformadores Avanzados: PowerTransformer, QuantileTransformer, Log Transform para datos asimétricos
- ✅ Análisis de Skewness: Detección y corrección de asimetría en distribuciones
- ✅ Comparación Empírica: Experimentación sistemática con múltiples técnicas
Ingeniería de Pipelines¶
- ✅ Anti-Leakage Estricto: Protocolo split-before-fit implementado rigurosamente
- ✅ Sklearn Pipeline: Automatización de preprocesamiento con fit/transform correcto
- ✅ ColumnTransformer: Diferentes transformaciones por feature en un solo objeto
- ✅ Cross-Validation Honesta: Validación sin contaminar datos de test
- ✅ Serialización: Pipelines production-ready con
joblib
Análisis Experimental¶
- ✅ Diseño de Experimentos: Comparación controlada de scalers × algoritmos
- ✅ Métricas de Evaluación: R², MAE, análisis de residuos
- ✅ Interpretación de Resultados: Decisiones basadas en evidencia empírica
- ✅ Visualización Comparativa: Gráficos before/after para comunicar impacto
Pensamiento Crítico¶
- ✅ Trade-offs: Comprensión de ventajas/desventajas de cada técnica
- ✅ Contexto de Negocio: Decisiones alineadas con tipo de datos (inmobiliarios)
- ✅ Validación de Supuestos: No asumir que "más complejo = mejor"
- ✅ Documentación: Justificación explícita de cada elección de pipeline
💭 Reflexión Final¶
Lo Que Realmente Aprendí¶
1. El scaling no es una fórmula mágica
Al inicio pensaba: "StandardScaler para todo y listo". Ahora entiendo que: - KNN necesita scaling desesperadamente (+80% mejora) - Random Forest no se beneficia (ahorra cómputo) - SVM requiere scaling perfecto para converger - La técnica correcta depende del algoritmo Y los datos
2. Los outliers cuentan historias
Antes veía outliers como "errores a eliminar". Ahora sé que: - Casa de $755k no es error, es mansión legítima - Terreno de 215k sq ft no es ruido, es oportunidad de desarrollo - RobustScaler preserva información valiosa - Eliminar outliers = perder contexto del mercado de lujo
3. El leakage es silencioso y mortal
La diferencia de 4.6% en R² parecía pequeña, pero: - En producción = modelo que falla en casos reales - En stakeholders = pérdida de confianza ("prometiste 0.85, diste 0.81") - En competencia = diferencia entre ganar y perder - Pipeline no es opcional, es obligatorio
4. La transformación correcta > scaler complejo
PowerTransformer ganó NO por ser avanzado, sino porque: - SalePrice tiene distribución log-normal natural - Transformar a normal mejora supuestos de regresión - Entender los datos > aplicar técnicas fancy
La Lección Más Importante¶
"El mejor scaler no es el más complejo, es el que entiende tus datos."
Tres preguntas que ahora me hago SIEMPRE:
- ¿Qué algoritmo voy a usar?
- KNN/SVM → NECESITO scaling
- Random Forest → Puedo saltármelo
-
Regresión lineal → Depende de interpretabilidad
-
¿Cómo se distribuyen mis features?
- Normal → StandardScaler
- Asimétrica → Log/PowerTransformer
-
Outliers valiosos → RobustScaler
-
¿Estoy introduciendo leakage?
- ¿Fit antes del split? → ❌ STOP
- ¿Usando Pipeline? → ✅ Safe
- ¿CV respeta el pipeline? → ✅ Validación honesta
🔗 Enlaces y Referencias¶
Datasets y Recursos¶
- Ames Housing Dataset — Dataset oficial de Kaggle
- Kaggle - Scaling and Normalization — Tutorial interactivo
Documentación Técnica¶
- Scikit-learn Preprocessing — Guía completa de transformaciones
- PowerTransformer — Box-Cox y Yeo-Johnson
- QuantileTransformer — Transformación por cuantiles
- Pipeline Documentation — Composición de transformadores
Material del Curso¶
- Feature Scaling & Anti-Leakage Pipeline — Material oficial del curso UCU
Papers y Lecturas¶
- Box & Cox (1964): "An Analysis of Transformations" — Transformaciones de potencia
- Yeo & Johnson (2000): "A New Family of Power Transformations" — Extensión de Box-Cox
- Géron (2019): "Hands-On Machine Learning" Cap. 2 — Feature Scaling en práctica
🔗 Información del Proyecto¶
Contexto Académico:
- Curso: Calidad & Ética de Datos - UT2
- Institución: Universidad Católica del Uruguay
- Instructor: Juan F. Kurucz
- Práctica: 06 - Feature Scaling & Anti-Leakage Pipeline
Alcance del Proyecto: - Dataset completo Ames Housing (2,930 propiedades × 82 variables) - Comparación experimental de 5+ scalers y transformadores - Pipeline production-ready con anti-leakage estricto - Análisis de impacto en 4 algoritmos diferentes (Linear, KNN, SVM, RF)
Archivos Generados:
- feature_scaling_pipeline.ipynb — Notebook completo con experimentos
- pipeline_final.pkl — Pipeline serializado para producción
- visualizations/ — 9 gráficos comparativos (PNG)
- docs/scaling_decisions.md — Justificación de elecciones







