📊 MÓDULO 3: "Escalado, Selección y Extracción de Características: El Arte de Preparar Entradas"

Objetivo:

Dominar cómo transformar, seleccionar y crear características para que los modelos aprendan de manera eficiente, estable y sin sesgo numérico. Aprender por qué no todas las variables son útiles—y cómo hacer que las útiles brillen.


3.1 ¿Por qué Escalar Características?

Muchos algoritmos de ML (SVM, KNN, regresión logística, redes neuronales) son sensibles a las escalas de las características.

Imagina:

  • Característica 1: edad → rango 18 a 90
  • Característica 2: ingreso_anual → rango 20,000 a 500,000

Sin escalado, el algoritmo dará MUCHO más peso a ingreso_anual simplemente porque sus números son más grandes—aunque edad sea más predictiva.


3.2 Métodos de Escalado

➤ StandardScaler (Estandarización)

Transforma los datos para tener media = 0 y desviación estándar = 1.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df[['edad', 'ingreso_anual']] = scaler.fit_transform(df[['edad', 'ingreso_anual']])

Cuándo usar: Cuando los datos siguen aproximadamente una distribución normal. Ideal para modelos lineales, SVM, redes neuronales.


➤ MinMaxScaler (Normalización)

Transforma los datos a un rango fijo, típicamente [0, 1].

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
df[['monto_transaccion', 'antiguedad_cliente']] = scaler.fit_transform(df[['monto_transaccion', 'antiguedad_cliente']])

Cuándo usar: Cuando conoces los límites mínimos/máximos, o cuando usas redes neuronales con funciones de activación como sigmoid o tanh.

⚠️ Cuidado con los valores atípicos: Un solo valor extremo puede comprimir todo el resto del rango.


➤ RobustScaler

Usa la mediana y el rango intercuartílico (IQR). Robusto a los valores atípicos.

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()
df[['monto_transaccion']] = scaler.fit_transform(df[['monto_transaccion']])

Cuándo usar: Cuando tienes muchos valores atípicos y no quieres eliminarlos o transformarlos.


📈 Visualización: Comparando Escalados

import matplotlib.pyplot as plt
import seaborn as sns

# Datos originales
original = df_original['monto_transaccion'].values.reshape(-1, 1)
standard_scaled = StandardScaler().fit_transform(original)
minmax_scaled = MinMaxScaler().fit_transform(original)
robust_scaled = RobustScaler().fit_transform(original)

fig, ax = plt.subplots(2, 2, figsize=(12, 8))

sns.histplot(original, bins=30, ax=ax[0,0], kde=True)
ax[0,0].set_title("Original")

sns.histplot(standard_scaled, bins=30, ax=ax[0,1], kde=True)
ax[0,1].set_title("StandardScaler")

sns.histplot(minmax_scaled, bins=30, ax=ax[1,0], kde=True)
ax[1,0].set_title("MinMaxScaler")

sns.histplot(robust_scaled, bins=30, ax=ax[1,1], kde=True)
ax[1,1].set_title("RobustScaler")

plt.tight_layout()
plt.show()

3.3 Selección de Características

No todas las variables son útiles. Algunas son redundantes, irrelevantes o ruidosas. Mantenerlas:

  • Aumenta el tiempo de entrenamiento.
  • Puede causar sobreajuste.
  • Hace más difícil la interpretación.

➤ Eliminación basada en varianza

Si una variable apenas cambia (ej., 99% de los valores son 0), no aporta información.

from sklearn.feature_selection import VarianceThreshold

selector = VarianceThreshold(threshold=0.01)  # elimina columnas con varianza < 0.01
X_high_variance = selector.fit_transform(X)

➤ Selección Univariada

Usa pruebas estadísticas para medir la relación entre cada característica y la variable objetivo.

from sklearn.feature_selection import SelectKBest, f_classif

# Seleccionar las 10 mejores características usando prueba F de ANOVA
selector = SelectKBest(score_func=f_classif, k=10)
X_selected = selector.fit_transform(X, y)

# Ver puntuaciones
scores = selector.scores_
feature_names = X.columns
plt.figure(figsize=(10,6))
sns.barplot(x=scores, y=feature_names)
plt.title("Importancia de Características (Prueba F de ANOVA)")
plt.show()

➤ Eliminación Recursiva de Características (RFE)

Entrena un modelo e itera eliminando las características menos importantes.

from sklearn.feature_selection import RFE
from sklearn.ensemble import RandomForestClassifier

modelo_base = RandomForestClassifier(n_estimators=10, random_state=42)
rfe = RFE(estimator=modelo_base, n_features_to_select=8)
X_rfe = rfe.fit_transform(X, y)

# Ver características seleccionadas
selected_features = X.columns[rfe.support_]
print("Características seleccionadas:", selected_features.tolist())

3.4 Extracción de Características

En lugar de seleccionar, crear nuevas características a partir de las existentes.

➤ Componentes Principales (PCA)

Reduce la dimensionalidad transformando las variables originales en un conjunto más pequeño de variables no correlacionadas (componentes principales).

from sklearn.decomposition import PCA

pca = PCA(n_components=5)  # reducir a 5 componentes
X_pca = pca.fit_transform(X_scaled)

# Ver varianza explicada por componente
plt.figure(figsize=(8,5))
plt.plot(range(1,6), pca.explained_variance_ratio_.cumsum(), marker='o')
plt.title("Varianza Acumulada Explicada por Componentes PCA")
plt.xlabel("Número de Componentes")
plt.ylabel("Varianza Acumulada")
plt.grid()
plt.show()

Cuándo usar PCA: Cuando tienes muchas variables correlacionadas, o para visualización (reducir a 2D/3D).

⚠️ Desventaja: Pierdes interpretabilidad. "Componente 1" no tiene un significado empresarial claro.


📝 Ejercicio 3.1: Transformación y Selección de Características

Conjunto de datos: fraud_encoded.csv (del módulo anterior, ya codificado)

Tareas:

  1. Separar características (X) de la variable objetivo (y = es_fraude).
  2. Dividir en train/test (80/20, estratificar=y).
  3. Aplicar StandardScaler a variables numéricas continuas (ej., edad, ingreso, monto).
  4. Usar VarianceThreshold para eliminar características con varianza < 0.01.
  5. Usar SelectKBest con f_classif para seleccionar las 12 características más relevantes.
  6. Entrenar un modelo simple (Regresión Logística) con características seleccionadas.
  7. Comparar el rendimiento (precisión) con un modelo entrenado con todas las características (sin selección).

💡 Notas Adicionales:

  • Siempre aplica el escalado SOLO al conjunto de entrenamiento, luego usa transform() (no fit_transform()) en test.
  • La selección de características debe hacerse DENTRO de la validación cruzada para evitar métricas optimistas.
  • PCA no es magia. Si tus variables ya son pocas y no correlacionadas, PCA puede empeorar el rendimiento.
  • En competencias de Kaggle, la ingeniería de características a menudo separa el top 10% del resto.

Course Info

Course: AI-course1

Language: ES

Lesson: Module3