Saltar a contenido

Práctica 6: Feature Scaling & Anti-Leakage Pipeline - Exploración Abierta

UT2: Calidad & Ética | Práctica Exploratoria

Objetivos de Descubrimiento

  • Identificar cuáles features del dataset Ames necesitan escalado y por qué
  • Experimentar con MinMaxScaler, StandardScaler y RobustScaler en datos reales
  • Descubrir el impacto del escalado en diferentes algoritmos mediante experimentación
  • Comparar pipelines con y sin data leakage para ver las diferencias
  • Decidir cuál es la mejor estrategia basándose en evidencia empírica

Lo que vas a descubrir

  • ¿Qué pasa cuando las features están en escalas completamente diferentes?
  • ¿Cuándo RobustScaler supera a StandardScaler en datos reales?
  • ¿Por qué algunos algoritmos no se benefician del escalado?
  • ¿Cómo detectar automáticamente data leakage en tus métricas?

Parte 1: Continuamos con el Dataset Ames Housing

CONTINUACIÓN DE LA PRÁCTICA ANTERIOR

Referencias para explorar:

Tu misión de exploración:

  • Problema a descubrir: El dataset Ames tiene variables en escalas MUY diferentes - ¿cuáles?
  • Pregunta central: ¿Qué algoritmos se beneficiarán del escalado y cuáles no?
  • Hipótesis a probar: ¿RobustScaler será mejor que StandardScaler con outliers reales?
  • Objetivo final: Crear el pipeline de escalado más robusto para predicción de precios
# === SETUP DEL ENTORNO ===

# 1. Importar librerías necesarias
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsRegressor  
from sklearn.svm import SVR
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, r2_score
import warnings
warnings.filterwarnings('ignore')

print("Todas las librerías importadas correctamente")

# 2. Configurar visualizaciones - elige tu estilo favorito
plt.style.use('seaborn-v0_8')  # Puedes cambiar por 'default', 'classic', etc.
sns.set_palette("husl")        # Paleta colorida para múltiples comparaciones
plt.rcParams['figure.figsize'] = (14, 8)
plt.rcParams['font.size'] = 11

print("Configuración de visualizaciones lista!")

💡 Tip: Experimenta con diferentes estilos y paletas para encontrar tu favorito para análisis de datos.

Paso 2: Cargar el Dataset Ames Housing (Continuación)

# === CARGAR DATASET AMES HOUSING ===

# Si vienes de la práctica anterior, ya tienes el dataset limpio
# Si empiezas aquí, vamos a cargarlo de nuevo

# 1. Cargar dataset
!curl -L -o ames-housing-dataset.zip https://www.kaggle.com/api/v1/datasets/download/shashanknecrothapa/ames-housing-dataset
!unzip -o ames-housing-dataset.zip
df_raw = pd.read_csv('AmesHousing.csv')

print(f"Dataset Ames Housing cargado: {df_raw.shape}")
print("🏠 ¡Ahora vas a explorar las escalas en datos REALES!")

🎯 Tu primera misión exploratoria:

Antes de continuar, responde estas preguntas explorando el dataset:

  1. ¿Cuáles son las 5 columnas numéricas con las escalas más diferentes?
  2. ¿Hay outliers evidentes que podrían afectar el escalado?
  3. ¿Qué variable será nuestro target para predicción?
# === EXPLORACIÓN INICIAL ===

# Tu turno: explora las escalas
print("=== INFORMACIÓN GENERAL DEL DATASET ===")
print(f"Dimensiones: {df_raw.shape}")
print(f"\nTipos de datos:")
print(df_raw.dtypes.value_counts())

# Identifica columnas numéricas
numeric_cols = df_raw.select_dtypes(include=[np.number]).columns.tolist()
print(f"\n📊 Columnas numéricas encontradas: {len(numeric_cols)}")

# Tu análisis: ¿cuáles tienen escalas MUY diferentes?
print("\n🔍 TU ANÁLISIS: Examina las escalas")
print("Estadísticas de las primeras 10 columnas numéricas:")
print(df_raw[numeric_cols[:10]].describe())

# Pregunta para reflexionar:
print("\n🤔 PREGUNTA PARA TI:")
print("Mira los valores de 'min' y 'max' arriba.")
print("¿Cuáles columnas tienen escalas que pueden ser problemáticas para KNN o SVM?")

💡 Pistas para tu exploración: - Busca columnas donde max/min > 1000 (escalas muy diferentes) - ¿'Lot Area' vs 'Year Built' vs 'SalePrice' están en escalas similares? - ¿Hay alguna columna que claramente va a "gritar más fuerte"?

Paso 3: Tu Investigación - Identificar Variables Problemáticas

🎯 Tu misión: Investiga y selecciona columnas con escalas problemáticas del dataset Ames Housing.

🔍 Lo que debes hacer: 1. Explora las columnas numéricas y encuentra las que tienen escalas MUY diferentes 2. Calcula ratios (máximo/mínimo) para identificar las más problemáticas 3. Crea visualizaciones para mostrar el problema de escalas 4. Documenta tus hallazgos

💻 Tu código (estructura sugerida):

# === TU INVESTIGACIÓN DE ESCALAS ===

# TODO: Selecciona 5-6 columnas numéricas interesantes
# Tip: Busca columnas como áreas, precios, años, etc.
selected_features = [
    # Tu selección aquí - ej: 'SalePrice', 'Lot Area', etc.
]

# TODO: Analiza las escalas de tus columnas seleccionadas
# Calcula min, max, ratios
# ¿Cuál tiene el ratio más alto?

# TODO: Crea visualizaciones para mostrar el problema
# Histogramas, boxplots, o lo que consideres mejor
# Guarda tus gráficos en la carpeta 'results/'

# TODO: Documenta tus hallazgos
print("📊 MIS HALLAZGOS:")
print("Columna más problemática: ???")
print("Ratio más alto: ???")
print("¿Por qué es problemático?: ???")

🤔 Preguntas para investigar: - ¿Qué columna va a "gritar más fuerte" en algoritmos de distancia? - ¿Hay columnas con distribuciones muy sesgadas? - ¿Cuáles tienen outliers extremos que podrían ser problemáticos?

📋 Completa tu análisis:

Mi Columna Rango Ratio ¿Problemática? ¿Por qué?
??? ??? ??? Sí/No ???

💡 Tip: No hay una respuesta "correcta" - defiende tu selección con datos


Paso 4: Preparar Datos para Experimentar con Scalers

🎯 Tu tarea: Prepara el dataset para experimentar con diferentes scalers, siguiendo buenas prácticas de ML.

🔍 Lo que debes lograr: 1. Definir tu variable target y features (basándote en tu investigación del Paso 3) 2. Limpiar los datos (NaN, inconsistencias) 3. Hacer split de datos ANTES de escalar (¡crítico para evitar leakage!) 4. Verificar que el problema de escalas persiste

💻 Tu implementación:

# === PREPARACIÓN DE DATOS ===

# TODO: Define tu target y features basándote en tu análisis anterior
target_col = ???  # ¿Cuál es tu variable objetivo?
feature_cols = ???  # Tus features seleccionadas

# TODO: Limpieza básica de datos
# ¿Cómo vas a manejar NaN? ¿Eliminar filas? ¿Imputar?
# Decide y justifica tu estrategia

# TODO: Split de datos (¡ANTES del escalado!)
# Recuerda: test_size, random_state, estratificación si es necesario
X_train, X_test, y_train, y_test = ???

# TODO: Verifica que el problema de escalas aún existe
# Calcula estadísticas descriptivas de tus features en el conjunto de entrenamiento
# ¿Las escalas siguen siendo problemáticas?

print("📊 MI PREPARACIÓN:")
print(f"Target: {target_col}")
print(f"Features: {len(feature_cols)} columnas")  
print(f"Datos: {X_train.shape[0]} train, {X_test.shape[0]} test")
print("Problema de escalas confirmado: Sí/No - explica por qué")

⚠️ Checkpoint crítico: - [ ] ¿Hiciste el split ANTES de cualquier transformación? - [ ] ¿Tu dataset está limpio y listo para escalado? - [ ] ¿Verificaste que las escalas siguen siendo problemáticas?

💡 Decisiones que debes tomar: - ¿Qué hacer con valores faltantes? - ¿Usar todas las columnas o un subconjunto? - ¿Qué tamaño de test set es apropiado?

Paso 5: Reconectando con Outliers - El Orden de las Transformaciones

🔄 Conexión con la Práctica Anterior: En la práctica 05 detectaste outliers en datos originales. Ahora investigarás algo crucial: ¿cómo el escalado cambia la detección de outliers?

🎯 Tu investigación: ¿El orden de las operaciones importa? ¿Detectar outliers antes o después del escalado?

🔍 Lo que debes investigar: 1. Detecta outliers en datos originales (usando métodos de la práctica 05) 2. Aplica diferentes scalers y detecta outliers en datos escalados 3. Compara resultados: ¿cambiaron los outliers después del escalado? 4. Saca conclusiones sobre cuándo limpiar outliers en tu pipeline

💻 Tu experimentación:

# === TU EXPERIMENTO: OUTLIERS Y ESCALADO ===

# TODO: Implementa funciones de detección de outliers (práctica 05)
# IQR method, Z-score method, u otros que prefieras
def detect_outliers_iqr(data, column_name):
    # Tu implementación aquí
    pass

def detect_outliers_zscore(data, column_name, threshold=3):
    # Tu implementación aquí  
    pass

# TODO: Elige una columna interesante para analizar
target_column = ???  # ¿Cuál columna analizarás?

# TODO: ROUND 1 - Detección en datos originales
print("🔍 ROUND 1: DATOS ORIGINALES")
# Detecta outliers en datos sin escalar
# ¿Cuántos outliers encontraste? ¿Dónde están?

# TODO: ROUND 2 - Detección después de cada scaler
scalers_to_test = {
    'StandardScaler': StandardScaler(),
    'MinMaxScaler': MinMaxScaler(),
    'RobustScaler': RobustScaler()
}

print("⚡ ROUND 2: DESPUÉS DEL ESCALADO")
# Para cada scaler:
# 1. Aplica el scaler a tus datos
# 2. Detecta outliers en los datos escalados
# 3. Compara con los outliers originales

# TODO: Análisis de resultados
# ¿Qué scaler detectó más/menos outliers?
# ¿Los mismos puntos siguen siendo outliers?
# ¿RobustScaler cambió la detección como esperabas?

🤔 Preguntas clave para investigar: - ¿RobustScaler detectó diferentes outliers que StandardScaler? - ¿Algunos outliers "desaparecieron" después del escalado? - ¿Se "crearon" nuevos outliers después del escalado? - ¿Qué significa esto para tu pipeline de datos?

📊 Tu tabla de resultados:

Método Outliers Originales Outliers Post-Standard Outliers Post-MinMax Outliers Post-Robust
IQR ??? ??? ??? ???
Z-Score ??? ??? ??? ???

💡 Tu conclusión:

Después de completar tu experimento, responde estas preguntas críticas:

  1. ¿Qué scaler cambió más la detección de outliers?
  2. Tu respuesta: ___

  3. ¿Los mismos puntos fueron outliers en todos los casos?

  4. Tu respuesta: ___

  5. ¿RobustScaler fue realmente "robusto" a outliers como esperabas?

  6. Tu respuesta: ___

  7. Para tu pipeline de datos, ¿cuándo limpiarías outliers?

  8. Antes del escalado
  9. Después del escalado
  10. Depende del caso
  11. Justifica tu elección: ___

🔗 Conexión con la práctica 05: En la práctica anterior detectaste outliers en datos "crudos". Ahora descubriste que el escalado puede cambiar completamente qué consideramos "extremo". Esta es una lección crítica para pipelines de datos reales.

Paso 5.5: Bonus - Log Transform para Distribuciones Sesgadas

🚀 Investigación avanzada: Los datos reales como precios, ingresos, o poblaciones suelen tener distribuciones muy sesgadas. ¿Puede la transformación logarítmica mejorar tus datos antes del escalado?

🔍 Tu reto: Investiga si log transform es útil para tus datos del dataset Ames Housing.

🎯 Lo que debes investigar:

  1. Identifica columnas sesgadas: ¿Cuál de tus features tiene la distribución más sesgada?
  2. Aplica log transform: Implementa una transformación logarítmica segura (maneja zeros/negativos)
  3. Compara distribuciones: Original vs Log-transformed
  4. Analiza outliers: ¿Cambia la detección de outliers después del log transform?
  5. Decide tu pipeline: ¿Log → Scale o Scale directo?

💻 Tu investigación:

# === TU INVESTIGACIÓN DE LOG TRANSFORM ===

# TODO: Encuentra la columna más sesgada
# Tip: Usa scipy.stats.skew() para calcular skewness
# ¿Qué columna tiene |skewness| más alto?
most_skewed_column = ???

# TODO: Implementa log transform seguro
def safe_log_transform(data, column_name):
    # ¿Cómo manejarás valores <= 0?
    # ¿Vas a hacer shift de los datos o usar log1p?
    pass

# TODO: Compara distribuciones
# Original vs Log-transformed
# Calcula: media, mediana, std, skewness
# ¿El log transform "alisó" la distribución?

# TODO: Visualiza el efecto
# Crea histogramas side-by-side
# Original | Log Transform | Log + Scaled
# ¿Qué versión se ve más "normal"?

# TODO: Analiza outliers  
# Detecta outliers en cada versión
# ¿El log transform redujo outliers?
# ¿Qué versión sería mejor para tu pipeline?

print("📊 MIS CONCLUSIONES SOBRE LOG TRANSFORM:")
print(f"Columna analizada: {most_skewed_column}")
print(f"Skewness original: ???")
print(f"Skewness después de log: ???")
print(f"¿Log transform ayudó?: Sí/No - ¿Por qué?")

🤔 Preguntas para reflexionar:

  1. ¿Cuándo usarías log transform?
  2. Datos muy sesgados (|skew| > 2)
  3. Precios/ingresos/poblaciones
  4. Cuando hay outliers extremos
  5. Todos los anteriores

  6. ¿Cuál es tu pipeline recomendado para datos sesgados?

  7. Log → Outliers → Scale
  8. Outliers → Log → Scale
  9. RobustScaler directo
  10. Depende del caso

  11. Para el dataset Ames Housing, ¿log transform es útil?

  12. Tu respuesta: ___

Tu Investigación Independiente: Transformador Avanzado

🔬 Misión de Investigación Personal

🎯 Tu tarea: Elige UN transformador avanzado que NO hemos visto, investiga cómo funciona, impleméntalo con el dataset Ames Housing, y compáralo con los scalers tradicionales.

📚 Transformadores sugeridos para investigar:

# === MENU DE TRANSFORMADORES AVANZADOS ===

transformadores_opciones = {
    'PowerTransformer': {
        'descripcion': 'Box-Cox y Yeo-Johnson para hacer datos más normales',
        'sklearn': 'from sklearn.preprocessing import PowerTransformer',
        'caso_uso': 'Distribuciones muy sesgadas, datos no-negativos',
        'dificultad': '⭐⭐⭐'
    },

    'QuantileTransformer': {
        'descripcion': 'Transforma según distribución de quantiles',
        'sklearn': 'from sklearn.preprocessing import QuantileTransformer', 
        'caso_uso': 'Distribuciones multimodales, outliers extremos',
        'dificultad': '⭐⭐⭐⭐'
    },

    'MaxAbsScaler': {
        'descripcion': 'Escala por valor absoluto máximo',
        'sklearn': 'from sklearn.preprocessing import MaxAbsScaler',
        'caso_uso': 'Datos sparse, matrices con muchos ceros',
        'dificultad': '⭐⭐'
    },

    'Normalizer': {
        'descripcion': 'Normalización L1/L2 por muestra (no por feature)',
        'sklearn': 'from sklearn.preprocessing import Normalizer',
        'caso_uso': 'Vectores de texto, datos donde la magnitud total importa',
        'dificultad': '⭐⭐⭐'
    },

    'FunctionTransformer': {
        'descripcion': 'Aplica función personalizada (sqrt, cbrt, etc.)',
        'sklearn': 'from sklearn.preprocessing import FunctionTransformer',
        'caso_uso': 'Transformaciones custom, matemáticas específicas',
        'dificultad': '⭐⭐'
    }
}

print("🔬 TRANSFORMADORES AVANZADOS PARA INVESTIGAR:")
print("="*55)

for nombre, info in transformadores_opciones.items():
    print(f"\n🧪 {nombre} {info['dificultad']}")
    print(f"   📝 {info['descripcion']}")
    print(f"   💻 {info['sklearn']}")
    print(f"   🎯 Mejor para: {info['caso_uso']}")

print(f"\n🎯 ELIGE UNO y conviértete en el experto del grupo!")

📋 Tu Investigación Independiente

🎯 Tu misión: Conviértete en el "experto grupal" de un transformador avanzado.

Estructura de tu investigación:

  1. Elección y Setup
  2. Elige un transformador de la lista
  3. Investiga cómo importarlo correctamente
  4. ¿Qué parámetros tiene?

  5. Investigación Teórica

  6. ¿Qué fórmula matemática usa?
  7. ¿Cuándo es mejor que StandardScaler?
  8. ¿Qué limitaciones tiene?
  9. Busca ejemplos de uso real

  10. Implementación Práctica

  11. Aplícalo a una columna del dataset Ames
  12. Compara resultados antes/después
  13. ¿Qué cambió en la distribución?

  14. Comparación con Scalers Clásicos

  15. Prueba StandardScaler, MinMaxScaler, RobustScaler y tu transformador
  16. ¿Cuál funciona mejor para tu caso?
  17. ¿Por qué?

  18. Tu Conclusión de Experto

  19. ¿Cuándo recomendarías tu transformador?
  20. ¿Cuándo NO lo usarías?
  21. ¿En qué casos supera a los scalers tradicionales?

💻 Template de código:

# === MI INVESTIGACIÓN DE [TRANSFORMADOR ELEGIDO] ===

# TODO: Elige e importa tu transformador
mi_transformador = ???  # PowerTransformer, QuantileTransformer, etc.

# TODO: Investigación teórica (documenta tus hallazgos)
print("📚 INVESTIGACIÓN:")
print("¿Qué hace?: [Tu explicación]")
print("¿Cuándo usar?: [Tu análisis]") 
print("Ventajas: [Lista]")
print("Desventajas: [Lista]")

# TODO: Implementación práctica
# Aplica tu transformador a una columna
# Compara con scalers tradicionales

# TODO: Tu recomendación final
print("💡 MI RECOMENDACIÓN COMO EXPERTO:")
print("Usar cuando: [Casos específicos]")
print("NO usar cuando: [Limitaciones]")
print("En Ames Housing: [Tu veredicto]")

🎯 Criterios de Evaluación de tu Investigación

Tu investigación será exitosa si logras explicar:

  • Fundamento matemático: ¿Cómo funciona por dentro?
  • Casos de uso: ¿Cuándo es mejor que los scalers básicos?
  • Implementación práctica: Código funcional con Ames data
  • Comparación crítica: Ventajas/desventajas vs alternatives
  • Recomendación informada: Guía práctica para otros

💡 Tips para tu Investigación

print("💡 TIPS PARA UNA INVESTIGACIÓN EXITOSA:")
print("="*40)
print("🔍 Lee la documentación oficial de sklearn")
print("📊 Busca ejemplos visuales del transformador")  
print("⚖️ Compara con casos reales (no solo teoría)")
print("🧪 Prueba con datos extremos para ver límites")
print("📝 Documenta tus fuentes y referencias")
print("🎯 Enfócate en aplicabilidad práctica")


Paso 6: El Gran Experimento - Pipeline Anti-Leakage

⚠️ El concepto MÁS importante de hoy: Data leakage puede arruinar completamente tu proyecto.

🔍 Lo que debes demostrar:

  1. Método INCORRECTO: Escalar todo el dataset, después hacer split (CON leakage)
  2. Método CORRECTO: Split primero, escalar solo con datos de train (SIN leakage)
  3. Método PIPELINE: Usar sklearn.Pipeline para automatizar (anti-leakage automático)

💻 Tu experimento:

# === TU DEMOSTRACIÓN DE DATA LEAKAGE ===

# TODO: Implementa los 3 métodos y compara resultados

print("🎭 DEMOSTRACIÓN: 3 MÉTODOS DIFERENTES")

# MÉTODO 1 (INCORRECTO): Escalar primero, split después
def method_with_leakage(X, y):
    # TODO: ¿Qué pasa si escalas ANTES del split?
    # 1. Escalar todo el dataset
    # 2. Después hacer train_test_split
    # 3. Entrenar y evaluar
    # ¿El resultado será optimista?
    pass

# MÉTODO 2 (CORRECTO): Split primero, escalar después  
def method_without_leakage(X, y):
    # TODO: ¿Cómo evitar leakage manualmente?
    # 1. Hacer train_test_split PRIMERO
    # 2. Scaler.fit() solo en train
    # 3. Scaler.transform() en train y test
    # ¿El resultado será más realista?
    pass

# MÉTODO 3 (PIPELINE): Anti-leakage automático
def method_with_pipeline(X, y):
    # TODO: ¿Cómo usar Pipeline para evitar leakage?
    # 1. Crear Pipeline([('scaler', ...), ('model', ...)])
    # 2. Pipeline automáticamente maneja fit/transform correctamente
    # 3. Usar cross_val_score para validación honesta
    pass

# TODO: Ejecuta los 3 métodos y compara
print("📊 RESULTADOS:")
print("Método 1 (con leakage): ??? ")
print("Método 2 (sin leakage): ??? ")
print("Método 3 (pipeline): ??? ")

# TODO: Analiza las diferencias
print("🔍 ANÁLISIS:")
print("¿Cuál método dio el resultado más optimista?")
print("¿Por qué el pipeline es la mejor opción?")
print("¿Qué tan grande fue el impacto del leakage?")

🔬 Tu validación final:

¿Cómo puedes estar seguro de que tu pipeline no tiene leakage? Usa cross-validation:

# === TU VALIDACIÓN FINAL ===

# TODO: Crea tu mejor pipeline basado en todos tus experimentos
mi_mejor_pipeline = Pipeline([
    ('scaler', ???),  # Tu scaler elegido
    ('modelo', ???)   # ¿Un modelo simple para probar?
])

# TODO: Usa cross-validation para evaluación honesta
# ¿Qué métrica vas a usar? ¿R² para regresión?
# ¿Cuántos folds? ¿5 o 10?

cv_scores = cross_val_score(mi_mejor_pipeline, X, y, cv=???, scoring='???')

print("🎯 MI VALIDACIÓN FINAL:")
print(f"Scores: {cv_scores}")
print(f"Media: {cv_scores.mean():.3f}")
print(f"¿Es estable?: [Analiza la desviación estándar]")
print(f"¿Es bueno?: [Compara con un baseline simple]")

💡 Reflexión final:

Después de completar toda tu investigación, responde:

  1. ¿Cuál scaler funcionó mejor para el dataset Ames Housing?
  2. Tu elección: ___
  3. ¿Por qué?: ___

  4. ¿El orden de operaciones (outliers vs escalado) importó?

  5. Tu conclusión: ___

  6. ¿Log transform fue útil para alguna columna?

  7. Sí/No: ___
  8. ¿Para cuál?: ___

  9. ¿Tu transformador avanzado superó a los básicos?

  10. Transformador investigado: ___
  11. ¿Mejor que StandardScaler?: ___

  12. ¿Data leakage tuvo impacto significativo en tu experimento?

  13. Diferencia observada: ___
  14. ¿Por qué Pipeline es mejor?: ___

🏆 Tu recomendación final para pipelines de datos:

Para el dataset Ames Housing, mi pipeline recomendado es:

1. [Tu paso 1]
2. [Tu paso 2] 
3. [Tu paso 3]
4. [Tu paso 4]

Porque: [Tu justificación basada en evidencia]


Tu Reflexión Final

🎓 Preguntas de Cierre

Después de completar todos tus experimentos, responde estas preguntas:

1. Sobre el Escalado:

  • ¿Cuál fue la diferencia más dramática que observaste entre scalers?
  • ¿Tu scaler ganador fue una sorpresa o coincidió con tus expectativas?
  • ¿Qué feature de Ames Housing necesitaba más escalado?

2. Sobre Outliers:

  • ¿El escalado cambió la detección de outliers como esperabas?
  • ¿RobustScaler fue realmente "robusto" en tu experimento?
  • ¿Cuál sería tu estrategia para outliers en un pipeline real?

3. Sobre Data Leakage:

  • ¿Observaste diferencias significativas entre métodos con/sin leakage?
  • ¿Por qué Pipeline es superior al escalado manual?
  • ¿Cómo vas a recordar evitar leakage en proyectos futuros?

4. Sobre tu Investigación Avanzada:

  • ¿Tu transformador especializado superó a los scalers básicos?
  • ¿En qué casos recomendarías tu transformador a otros?
  • ¿Te sientes como el "experto grupal" de tu transformador?

🏆 Tu Checklist Personal para Proyectos Futuros

Basándote en todo lo que aprendiste, completa tu checklist personal:

🏆 MI CHECKLIST PERSONAL PARA PROYECTOS DE DATOS:

□ 1. ¿Las features están en escalas muy diferentes?
□ 2. ¿Mi proceso necesita escalado?  
□ 3. ¿Hay outliers evidentes? → ¿RobustScaler?
□ 4. ¿Datos muy sesgados? → ¿Log transform?
□ 5. ¿Estoy usando Pipeline? → SIEMPRE (anti-leakage)
□ 6. ¿Split ANTES de transformar? → OBLIGATORIO
□ 7. ¿Cross-validation honesta? → Pipeline + CV
□ 8. ¿Resultados realistas vs optimistas? → Detectar leakage
□ 9. ¿Documenté mi elección de transformadores?
□ 10. ¿Mi pipeline es reproducible?

💡 Tu regla de oro personal:

"Si hay duda, usa Pipeline con StandardScaler y valida con cross-validation"


Tu Reflexión Final

🎓 Preguntas de Cierre

Después de completar todos tus experimentos, responde estas preguntas:

1. Sobre el Escalado:

  • ¿Cuál fue la diferencia más dramática que observaste entre scalers?
  • ¿Tu scaler ganador fue una sorpresa o coincidió con tus expectativas?
  • ¿Qué feature de Ames Housing necesitaba más escalado?

2. Sobre Outliers y Orden de Operaciones:

  • ¿El escalado cambió la detección de outliers como esperabas?
  • ¿RobustScaler fue realmente "robusto" en tu experimento?
  • ¿Cuál sería tu estrategia para outliers en un pipeline real?

3. Sobre Data Leakage:

  • ¿Observaste diferencias significativas entre métodos con/sin leakage?
  • ¿Por qué Pipeline es superior al escalado manual?
  • ¿Cómo vas a recordar evitar leakage en proyectos futuros?

4. Sobre tu Investigación Independiente:

  • ¿Tu transformador avanzado superó a los scalers básicos?
  • ¿En qué casos recomendarías tu transformador a otros?
  • ¿Te sientes como el "experto grupal" de tu transformador?

Recursos Adicionales para Explorar Más

🔗 Datasets Reales para Practicar Escalado:

🧠 Escaladores Avanzados para Investigar:

  • PowerTransformer: Hace los datos más "normales"
  • QuantileTransformer: Escalado basado en percentiles
  • MaxAbsScaler: Para datos sparse o con muchos ceros

💡 Para Recordar Siempre:

"El escalado no es solo matemáticas; es entender tus datos y algoritmos para tomar decisiones informadas basadas en evidencia."

🎯 Tu objetivo final: Convertirte en alguien que puede mirar un dataset nuevo y saber intuitivamente qué scaler probar primero.


¡Felicidades! Has completado una exploración profunda del escalado de features con datos reales. Ahora tienes las herramientas para evitar uno de los errores más costosos en ML: el data leakage.