El Feature Engineering es una de las etapas más cruciales en el desarrollo de modelos de Machine Learning. Consiste en transformar datos crudos en características (features) que representen mejor el problema subyacente para los modelos predictivos, mejorando su precisión y rendimiento. En este artículo, exploraremos cómo realizar Feature Engineering de manera efectiva utilizando Python, cubriendo desde la creación de nuevas variables hasta la selección de las más relevantes. Aprenderás técnicas y estrategias aplicables a diversos tipos de datos y problemas.
Importancia del Feature Engineering
El Feature Engineering es fundamental porque los algoritmos de Machine Learning aprenden de los datos que se les proporcionan. Si los datos no están bien representados, el modelo tendrá dificultades para encontrar patrones y realizar predicciones precisas. Un buen Feature Engineering puede revelar información oculta en los datos, mejorar la interpretabilidad del modelo y reducir la necesidad de algoritmos complejos.
Un ejemplo claro de su importancia se observa cuando trabajamos con datos categóricos. Convertir estas categorías en variables numéricas adecuadas (como one-hot encoding) permite que los algoritmos interpreten la información de manera efectiva. De igual manera, en series temporales, la creación de características como promedios móviles o diferencias puede capturar tendencias y estacionalidad que de otra forma se perderían.
Creación de Nuevas Variables
La creación de nuevas variables es una de las tareas más creativas en el Feature Engineering. Implica combinar, transformar o derivar nuevas características a partir de las existentes. Aquí hay algunas técnicas comunes:
- Transformaciones matemáticas: Aplicar funciones como logaritmos, raíces cuadradas o exponenciales para cambiar la distribución de los datos. Esto es útil para normalizar datos sesgados. Por ejemplo, si tenemos una columna con datos de ingresos que está sesgada hacia la derecha, aplicar una transformación logarítmica puede hacer que la distribución sea más normal. En Python, podemos usar la librería NumPy para esto:
import numpy as np
ingresos = df['ingresos']
ingresos_log = np.log(ingresos + 1) # Agregamos 1 para evitar log(0)
- Variables de interacción: Combinar dos o más variables para crear una nueva que capture la interacción entre ellas. Por ejemplo, si tenemos variables de ‘edad’ y ‘salario’, podríamos crear una variable de interacción ‘edad_salario’ multiplicándolas.
df['edad_salario'] = df['edad'] * df['salario']
- Variables Dummy (One-Hot Encoding): Convertir variables categóricas en variables numéricas binarias. Esto es esencial para que los algoritmos puedan trabajar con datos categóricos.
import pandas as pd
df = pd.get_dummies(df, columns=['color'])
- Ingeniería de Características Temporales: Extraer componentes como día de la semana, mes del año, hora del día a partir de fechas.
df['fecha'] = pd.to_datetime(df['fecha'])
df['dia_semana'] = df['fecha'].dt.dayofweek
df['mes'] = df['fecha'].dt.month
Selección de Características Relevantes
No todas las características son igualmente importantes para un modelo. Algunas pueden ser redundantes o irrelevantes, lo que puede afectar negativamente el rendimiento y la interpretabilidad del modelo. La selección de características es el proceso de identificar y seleccionar el subconjunto de características más relevantes. Algunas técnicas comunes incluyen:
- Selección basada en la varianza: Eliminar características con baja varianza, ya que es probable que no aporten mucha información.
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.1) # Elimina características con varianza menor a 0.1
selector.fit(X)
X_filtered = X[:, selector.get_support()]
- Selección univariante: Utilizar pruebas estadísticas (como chi-cuadrado para clasificación o ANOVA para regresión) para evaluar la relación entre cada característica y la variable objetivo.
from sklearn.feature_selection import SelectKBest, chi2
selector = SelectKBest(score_func=chi2, k=10) # Selecciona las 10 mejores características usando chi-cuadrado
selector.fit(X, y)
X_filtered = X[:, selector.get_support()]
- Selección basada en modelos: Utilizar modelos como Regresión Lasso o Árboles de Decisión para evaluar la importancia de las características.
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV
lasso = LassoCV()
lasso.fit(X, y)
selector = SelectFromModel(lasso, prefit=True)
X_filtered = X[:, selector.get_support()]
- Eliminación Recursiva de Características (RFE): Entrenar un modelo y eliminar iterativamente las características menos importantes hasta alcanzar el número deseado.
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression()
selector = RFE(estimator, n_features_to_select=5) # Selecciona las 5 mejores características usando RFE
selector.fit(X, y)
X_filtered = X[:, selector.get_support()]
Ejemplo con Datos Reales
Vamos a aplicar algunas de estas técnicas en un conjunto de datos real. Utilizaremos el conjunto de datos Titanic, disponible en Kaggle, para predecir la supervivencia de los pasajeros.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score # Cargar los datos
df = pd.read_csv('titanic.csv') # Limpiar los datos
df['Age'].fillna(df['Age'].median(), inplace=True)
df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True) # Crear variables dummy
df = pd.get_dummies(df, columns=['Sex', 'Embarked']) # Seleccionar características
X = df[['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'Sex_female', 'Sex_male', 'Embarked_C', 'Embarked_Q', 'Embarked_S']]
y = df['Survived'] # Dividir los datos en entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Escalar las características
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test) # Entrenar el modelo
model = LogisticRegression()
model.fit(X_train, y_train) # Evaluar el modelo
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Precisión del modelo: {accuracy}')
En este ejemplo, hemos realizado los siguientes pasos:
- Cargamos los datos y limpiamos los valores faltantes.
- Creamos variables dummy para las características categóricas ‘Sex’ y ‘Embarked’.
- Seleccionamos las características relevantes.
- Dividimos los datos en conjuntos de entrenamiento y prueba.
- Escalamos las características para mejorar el rendimiento del modelo.
- Entrenamos un modelo de regresión logística y evaluamos su precisión.
Este es un ejemplo básico, pero ilustra cómo aplicar técnicas de Feature Engineering en un problema real.
El Feature Engineering es un componente crítico en el desarrollo de modelos de Machine Learning exitosos. A través de la creación y selección de características relevantes, podemos mejorar significativamente el rendimiento y la interpretabilidad de los modelos. Dominar estas técnicas requiere práctica y experimentación, pero los resultados valen la pena. Recuerda que cada conjunto de datos y problema es único, así que no dudes en adaptar y combinar estas técnicas según sea necesario. ¡Sigue explorando y mejorando tus habilidades en Feature Engineering!