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.
Muchos algoritmos de ML (SVM, KNN, regresión logística, redes neuronales) son sensibles a las escalas de las características.
Imagina:
edad → rango 18 a 90ingreso_anual → rango 20,000 a 500,000Sin 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.
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.
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.
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.
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()
No todas las variables son útiles. Algunas son redundantes, irrelevantes o ruidosas. Mantenerlas:
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)
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()
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())
En lugar de seleccionar, crear nuevas características a partir de las existentes.
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.
Conjunto de datos: fraud_encoded.csv (del módulo anterior, ya codificado)
Tareas:
X) de la variable objetivo (y = es_fraude).StandardScaler a variables numéricas continuas (ej., edad, ingreso, monto).VarianceThreshold para eliminar características con varianza < 0.01.SelectKBest con f_classif para seleccionar las 12 características más relevantes.transform() (no fit_transform()) en test.