Imagen creada por el autor
Introducción
La ingeniería de funciones es uno de los aspectos más importantes del proceso de aprendizaje automático. Es la práctica de crear y modificar características o variables con el fin de mejorar el rendimiento del modelo. Las características bien diseñadas pueden transformar modelos débiles en fuertes, y es a través de la ingeniería de características que los modelos pueden volverse más robustos y precisos. La ingeniería de características actúa como puente entre el conjunto de datos y el modelo, brindando al modelo todo lo que necesita para resolver un problema de manera efectiva.
Esta es una guía destinada a nuevos científicos de datos, ingenieros de datos y profesionales del aprendizaje automático. El objetivo de este artículo es comunicar conceptos fundamentales de ingeniería de características y proporcionar una caja de herramientas de técnicas que se pueden aplicar a escenarios del mundo real. Mi objetivo es que, al final de este artículo, tenga suficiente conocimiento práctico sobre ingeniería de características para aplicarlo a sus propios conjuntos de datos y estar completamente equipado para comenzar a crear potentes modelos de aprendizaje automático.
Comprensión de las funciones
Las características son características medibles de cualquier fenómeno que estemos observando. Son los elementos granulares que componen los datos con los que operan los modelos para hacer predicciones. Ejemplos de características pueden incluir cosas como edad, ingresos, marca de tiempo, longitud, valor y casi cualquier otra cosa que se pueda imaginar y que pueda medirse o representarse de alguna forma.
Existen diferentes tipos de funciones, siendo las principales:
- Funciones numéricas: tipos numéricos continuos o discretos (por ejemplo, edad, salario)
- Características categóricas: valores cualitativos que representan categorías (por ejemplo, género, tipo de talla de zapato)
- Características del texto: palabras o cadenas de palabras (por ejemplo, “esto” o “aquello” o “incluso esto”)
- Funciones de series temporales: datos ordenados por tiempo (por ejemplo, precios de acciones)
Las características son cruciales en el aprendizaje automático porque influyen directamente en la capacidad de un modelo para hacer predicciones. Las características bien construidas mejoran el rendimiento del modelo, mientras que las características malas dificultan que un modelo produzca predicciones sólidas. La selección de funciones y la ingeniería de funciones son pasos de preprocesamiento en el proceso de aprendizaje automático que se utilizan para preparar los datos para su uso por algoritmos de aprendizaje.
Se hace una distinción entre selección de funciones e ingeniería de funciones, aunque ambas son cruciales por derecho propio:
- Selección de funciones: selección de funciones importantes del conjunto completo de funciones disponibles, lo que reduce la dimensionalidad y promueve el rendimiento del modelo.
- Ingeniería de funciones: la creación de nuevas funciones y el posterior cambio de las existentes, todo ello para ayudar a que un modelo funcione mejor.
Al seleccionar solo las características más importantes, la selección de características ayuda a dejar solo la señal en los datos, mientras que la ingeniería de características crea nuevas características que ayudan a modelar mejor el resultado.
Técnicas básicas en ingeniería de características
Si bien existe una amplia gama de técnicas básicas de ingeniería de características a nuestra disposición, analizaremos algunas de las más importantes y mejor utilizadas.
Manejo de valores faltantes
Es común que los conjuntos de datos contengan información faltante. Esto puede ser perjudicial para el rendimiento de un modelo, por lo que es importante implementar estrategias para lidiar con los datos faltantes. Existen varios métodos comunes para solucionar este problema:
- Imputación de media/mediana: rellenar áreas faltantes en un conjunto de datos con la media o mediana de la columna
- Imputación de modo: llenar los espacios faltantes en un conjunto de datos con la entrada más común en la misma columna
- Interpolación: completar los datos faltantes con valores de puntos de datos a su alrededor
Estos métodos de relleno deben aplicarse según la naturaleza de los datos y el efecto potencial que el método podría tener en el modelo final.
Tratar la información faltante es crucial para mantener intacta la integridad del conjunto de datos. A continuación se muestra un fragmento de código de Python de ejemplo que demuestra varios métodos de llenado de datos utilizando el pandas
biblioteca.
import pandas as pd
from sklearn.impute import SimpleImputer
# Sample DataFrame
data = {'age': (25, 30, np.nan, 35, 40), 'salary': (50000, 60000, 55000, np.nan, 65000)}
df = pd.DataFrame(data)
# Fill in missing ages using the mean
mean_imputer = SimpleImputer(strategy='mean')
df('age') = mean_imputer.fit_transform(df(('age')))
# Fill in the missing salaries using the median
median_imputer = SimpleImputer(strategy='median')
df('salary') = median_imputer.fit_transform(df(('salary')))
print(df)
Codificación de variables categóricas
Recordando que la mayoría de los algoritmos de aprendizaje automático están mejor (o únicos) equipados para manejar datos numéricos, las variables categóricas a menudo deben asignarse a valores numéricos para que dichos algoritmos los interpreten mejor. Los esquemas de codificación más comunes son los siguientes:
- Codificación One-Hot: producción de columnas separadas para cada categoría
- Codificación de etiquetas: asignar un número entero a cada categoría
- Codificación de destino: Codificación de categorías según sus promedios de variables de resultados individuales
La codificación de datos categóricos es necesaria para plantar las semillas de la comprensión en muchos modelos de aprendizaje automático. El método de codificación correcto es algo que usted seleccionará en función de la situación específica, incluido tanto el algoritmo en uso como el conjunto de datos.
A continuación se muestra un script de Python de ejemplo para la codificación de características categóricas usando pandas
y elementos de scikit-learn
.
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# Sample DataFrame
data = {'color': ('red', 'blue', 'green', 'blue', 'red')}
df = pd.DataFrame(data)
# Implementing one-hot encoding
one_hot_encoder = OneHotEncoder()
one_hot_encoding = one_hot_encoder.fit_transform(df(('color'))).toarray()
df_one_hot = pd.DataFrame(one_hot_encoding, columns=one_hot_encoder.get_feature_names(('color')))
# Implementing label encoding
label_encoder = LabelEncoder()
df('color_label') = label_encoder.fit_transform(df('color'))
print(df)
print(df_one_hot)
Escalar y normalizar datos
Para un buen rendimiento de muchos métodos de aprendizaje automático, es necesario realizar escalado y normalización de sus datos. Existen varios métodos para escalar y normalizar datos, como por ejemplo:
- Estandarización: Transformar datos para que tengan una media de 0 y una desviación estándar de 1.
- Escalado mínimo-máximo: escalar datos a un rango fijo, como (0, 1)
- Escalado robusto: escalamiento de valores altos y bajos de forma iterativa según la mediana y el rango intercuartílico, respectivamente.
La escala y la normalización de los datos son cruciales para garantizar que las contribuciones de características sean equitativas. Estos métodos permiten que los diferentes valores de las características contribuyan a un modelo de manera proporcional.
A continuación se muestra una implementación, utilizando scikit-learn
que muestra cómo completar datos que han sido escalados y normalizados.
import pandas as pd
from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
# Sample DataFrame
data = {'age': (25, 30, 35, 40, 45), 'salary': (50000, 60000, 55000, 65000, 70000)}
df = pd.DataFrame(data)
# Standardize data
scaler_standard = StandardScaler()
df('age_standard') = scaler_standard.fit_transform(df(('age')))
# Min-Max Scaling
scaler_minmax = MinMaxScaler()
df('salary_minmax') = scaler_minmax.fit_transform(df(('salary')))
# Robust Scaling
scaler_robust = RobustScaler()
df('salary_robust') = scaler_robust.fit_transform(df(('salary')))
print(df)
Las técnicas básicas anteriores junto con el código de ejemplo correspondiente brindan soluciones pragmáticas para datos faltantes, codificación de variables categóricas y escalado y normalización de datos utilizando potentes herramientas de Python. pandas
y scikit-learn
. Estas técnicas se pueden integrar en su propio proceso de ingeniería de funciones para mejorar sus modelos de aprendizaje automático.
Técnicas avanzadas en ingeniería de características
Ahora centramos nuestra atención en técnicas de ingeniería destacadas más avanzadas e incluimos algunos códigos Python de muestra para implementar estos conceptos.
Creación de funciones
Con la creación de funciones, se generan o modifican nuevas funciones para crear un modelo con mejor rendimiento. Algunas técnicas para crear nuevas funciones incluyen:
- Funciones polinómicas: creación de funciones de orden superior con funciones existentes para capturar relaciones más complejas.
- Términos de interacción: características generadas al combinar varias características para derivar interacciones entre ellas.
- Generación de funciones específicas del dominio: funciones diseñadas en función de las complejidades de los temas dentro del ámbito del problema determinado.
La creación de nuevas funciones con significado adaptado puede ser de gran ayuda para mejorar el rendimiento del modelo. El siguiente guión muestra cómo se puede utilizar la ingeniería de funciones para sacar a la luz las relaciones latentes en los datos.
import pandas as pd
import numpy as np
# Sample DataFrame
data = {'x1': (1, 2, 3, 4, 5), 'x2': (10, 20, 30, 40, 50)}
df = pd.DataFrame(data)
# Polynomial Features
df('x1_squared') = df('x1') ** 2
df('x1_x2_interaction') = df('x1') * df('x2')
print(df)
Reducción de dimensionalidad
Para simplificar los modelos y aumentar su rendimiento, puede resultar útil reducir el número de características del modelo. Las técnicas de reducción de dimensionalidad que pueden ayudar a lograr este objetivo incluyen:
- PCA (Análisis de componentes principales): transformación de predictores en un nuevo conjunto de características compuesto por características de modelo linealmente independientes
- t-SNE (incrustación de vecinos estocásticos distribuidos en t): reducción de dimensiones que se utiliza con fines de visualización
- LDA (Análisis discriminante lineal): encontrar nuevas combinaciones de características del modelo que sean efectivas para deconstruir diferentes clases
Para reducir el tamaño de su conjunto de datos y mantener su relevancia, las técnicas de reducción dimensional le ayudarán. Estas técnicas se idearon para abordar problemas de alta dimensión relacionados con los datos, como el sobreajuste y la demanda computacional.
Una demostración de reducción de datos implementada con scikit-learn
se muestra a continuación.
import pandas as pd
from sklearn.decomposition import PCA
# Sample DataFrame
data = {'feature1': (2.5, 0.5, 2.2, 1.9, 3.1), 'feature2': (2.4, 0.7, 2.9, 2.2, 3.0)}
df = pd.DataFrame(data)
# Use PCA for Dimensionality Reduction
pca = PCA(n_components=1)
df_pca = pca.fit_transform(df)
df_pca = pd.DataFrame(df_pca, columns=('principal_component'))
print(df_pca)
Ingeniería de funciones de series temporales
Con conjuntos de datos basados en el tiempo, se deben utilizar técnicas de ingeniería de características específicas, como:
- Características de retraso: los puntos de datos anteriores se utilizan para derivar características predictivas del modelo.
- Estadísticas móviles: las estadísticas de datos se calculan en ventanas de datos, como medias móviles.
- Descomposición estacional: los datos se dividen en categorías de señal, tendencia y ruido aleatorio.
Los modelos temporales necesitan un aumento variable en comparación con el ajuste directo del modelo. Estos métodos siguen patrones y dependencias temporales para hacer que el modelo predictivo sea más nítido.
Una demostración de características de aumento de series temporales aplicadas mediante pandas
también se muestra a continuación.
import pandas as pd
import numpy as np
# Sample DataFrame
date_rng = pd.date_range(start="1/1/2022", end='1/10/2022', freq='D')
data = {'date': date_rng, 'value': (100, 110, 105, 115, 120, 125, 130, 135, 140, 145)}
df = pd.DataFrame(data)
df.set_index('date', inplace=True)
# Lag Features
df('value_lag1') = df('value').shift(1)
# Rolling Statistics
df('value_rolling_mean') = df('value').rolling(window=3).mean()
print(df)
Los ejemplos anteriores demuestran aplicaciones prácticas de técnicas avanzadas de ingeniería de características, mediante el uso de pandas
y scikit-learn
. Al emplear estos métodos, puede mejorar el poder predictivo de su modelo.
Consejos prácticos y mejores prácticas
A continuación se ofrecen algunos consejos sencillos pero importantes que debe tener en cuenta mientras trabaja en el proceso de ingeniería de funciones.
- Iteración: la ingeniería de funciones es un proceso de prueba y error, y mejorará con cada iteración. Pruebe diferentes ideas de ingeniería de funciones para encontrar el mejor conjunto de funciones.
- Conocimiento del dominio: utilice la experiencia de quienes conocen bien el tema al crear funciones. A veces, las relaciones sutiles se pueden capturar con conocimiento específico del ámbito.
- Validación y comprensión de las funciones: al comprender qué funciones son más importantes para su modo, estará preparado para tomar decisiones importantes. Las herramientas para determinar la importancia de las características incluyen:
- SHAP (Explicaciones aditivas de SHapley): ayuda a cuantificar la contribución de cada característica en las predicciones.
- LIME (Explicaciones independientes del modelo local interpretable): muestra el significado de las predicciones del modelo en un lenguaje sencillo
Es necesaria una combinación óptima de complejidad e interpretabilidad para obtener resultados buenos y fáciles de digerir.
Conclusión
Esta breve guía ha abordado conceptos fundamentales de ingeniería de características, así como técnicas básicas y avanzadas, recomendaciones prácticas y mejores prácticas. Se cubrieron lo que muchos considerarían algunas de las prácticas de ingeniería de características más importantes: lidiar con la información faltante, codificación de datos categóricos, escalamiento de datos y creación de nuevas características.
La ingeniería de funciones es una práctica que mejora con la ejecución y espero que haya podido llevarse algo que pueda mejorar sus habilidades en ciencia de datos. Te animo a que apliques estas técnicas a tu propio trabajo y aprendas de tus experiencias.
Recuerde que, si bien el porcentaje exacto varía según quién lo cuenta, la mayor parte de cualquier proyecto de aprendizaje automático se dedica a la fase de preparación y preprocesamiento de datos. La ingeniería de características es parte de esta larga fase y, como tal, debe verse con la importancia que exige. Aprender a ver la ingeniería de características como es (una ayuda en el proceso de modelado) debería hacerla más digerible para los recién llegados.
¡Feliz ingeniería!
Mateo Mayo (twitter.com/mattmayo13″ rel=”noopener”>@mattmayo13) tiene una maestría en informática y un diploma de posgrado en minería de datos. Como editor jefe, Matthew tiene como objetivo hacer accesibles conceptos complejos de ciencia de datos. Sus intereses profesionales incluyen el procesamiento del lenguaje natural, los algoritmos de aprendizaje automático y la exploración de la IA emergente. Lo impulsa la misión de democratizar el conocimiento en la comunidad de ciencia de datos. Matthew ha estado codificando desde que tenía 6 años.
<script async src="//platform.twitter.com/widgets.js” charset=”utf-8″>