En el ámbito del aprendizaje automático y la ciencia de datos, la ingeniería de características se erige como la piedra angular de la mejora del rendimiento del modelo. Si bien los algoritmos y los modelos a menudo captan la atención, son las características cuidadosamente diseñadas las que sientan las bases para el poder predictivo. Imagine tratar de construir una casa sobre una base débil: sin características sólidas, incluso los algoritmos más avanzados pueden desmoronarse cuando se enfrentan a conjuntos de datos complejos.
La ingeniería de funciones es el proceso creativo y estratégico de seleccionar, transformar y crear funciones (variables de entrada) a partir de datos sin procesar para maximizar el rendimiento de un modelo. Es el arte de convertir datos en información útil, brindando a las máquinas la comprensión contextual que necesitan para hacer predicciones precisas. Ya sea que prediga los precios de la vivienda, clasifique las preferencias de los clientes o diagnostique condiciones médicas, la ingeniería de características tiene la clave para desbloquear el potencial oculto dentro de sus datos.
Imagine que tiene la tarea de predecir los precios de la vivienda en función de una variedad de factores. Inicialmente, es posible que se sienta atraído por las características obvias, como los pies cuadrados, la cantidad de habitaciones y la ubicación. Sin embargo, la magia de la ingeniería de características radica en descubrir los aspectos más sutiles que influyen en la variable de destino. ¿La proporción de baños a dormitorios afecta el precio? ¿Qué pasa con la presencia de una chimenea o la edad del techo?
La ingeniería de funciones no consiste simplemente en crear más funciones; se trata de discernir qué facetas de los datos realmente importan. Este proceso a menudo requiere conocimiento del dominio, creatividad y una comprensión profunda del problema que está abordando. Al refinar las funciones existentes y crear otras nuevas, esencialmente le está enseñando a su modelo a comprender los datos como un experto.
La respuesta está en el rendimiento del modelo. Las funciones bien diseñadas pueden conducir a una convergencia más rápida durante el entrenamiento, un sobreajuste reducido y, en última instancia, predicciones más precisas. Un modelo de aprendizaje automático es tan bueno como los datos que alimenta, y las características bien diseñadas brindan una representación más rica y matizada de esos datos.
En este artículo, nos adentraremos en el mundo de la ingeniería de características utilizando el conjunto de datos avanzado de predicción de precios de la vivienda de Kaggle. Al seguirlo, obtendrá información sobre varias técnicas que pueden transformar los datos sin procesar en predictores valiosos y verá cómo mejoran los resultados de su modelo al aplicar diferentes métodos de ingeniería de características.
Entonces, sin perder tiempo, comencemos a aprender sobre los diferentes métodos de ingeniería de características.
Ahora que hemos preparado el escenario, es hora de adentrarse en el apasionante mundo de las técnicas avanzadas de ingeniería de funciones. En esta sección, lo guiaré a través de la implementación paso a paso de cuatro métodos poderosos que pueden potenciar sus modelos predictivos. Cada método tiene un propósito único y ofrece información y mejoras que pueden marcar una diferencia sustancial en el rendimiento de su modelo.
Imagine poder seleccionar las características más influyentes para su modelo con precisión quirúrgica. La información mutua le permite lograr precisamente eso. Al cuantificar la relación entre cada función y la variable objetivo, puede identificar los factores clave que afectan sus predicciones. Lo guiaremos a través del código y le brindaremos una explicación detallada de cada paso, ayudándolo a dominar esta técnica perspicaz.
Los clústeres a menudo ocultan patrones valiosos dentro de sus datos. Con el agrupamiento, puede descubrir estas gemas ocultas y aprovecharlas para mejorar la comprensión de su modelo. Lo guiaré a través del proceso de aplicar la agrupación en clústeres de KMeans para agrupar instancias similares. Aprenderá a crear nuevas funciones basadas en estos clústeres y observará su impacto en el rendimiento del modelo.
Los datos de alta dimensión pueden ser abrumadores, pero el análisis de componentes principales (PCA) ofrece una solución. Al identificar las dimensiones más influyentes, puede reducir la complejidad sin sacrificar el poder predictivo. Este tutorial lo guiará a través de la transformación de sus datos usando PCA, brindando información sobre cómo esta técnica puede optimizar su modelo mientras conserva su precisión.
Además de estos métodos, también le presentaré las transformaciones matemáticas , una técnica que a menudo se pasa por alto y que puede generar resultados poderosos. Al aplicar operaciones matemáticas a las columnas seleccionadas, puede dar forma a sus datos para alinearlos mejor con las suposiciones de su modelo. Explorará transformaciones logarítmicas, de raíz cuadrada e inversas, ilustrando cómo pueden descubrir relaciones ocultas y aumentar la precisión de su modelo.
A lo largo de esta sección, ofreceré explicaciones completas para garantizar que no solo comprenda los aspectos técnicos, sino que también comprenda el razonamiento detrás de la aplicación de cada método. Al final, habrá obtenido un valioso conjunto de herramientas de técnicas avanzadas de ingeniería de características que se pueden aplicar con confianza para mejorar sus modelos predictivos en varios escenarios.
¿Está listo para explorar las complejidades de cada método, descubrir su potencial y equiparse con la experiencia para diseñar funciones que se traduzcan en modelos predictivos más precisos y potentes? ¡Comencemos este viaje esclarecedor!
Primero importemos todos los paquetes que necesita.
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.feature_selection import SelectKBest, mutual_info_regression from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.preprocessing import LabelEncoder, StandardScaler import numpy as np
Ahora, obtengamos el conjunto de datos de Kaggle y preprocesémoslo.
# Load the dataset data = pd.read_csv('train.csv') # Data preprocessing def preprocess_data(df): # Handle missing values df = df.fillna(df.median()) # Handle categorical variables df = pd.get_dummies(df, drop_first=True) return df data = preprocess_data(data) # Prepare the data X = data.drop('SalePrice', axis=1) y = data['SalePrice'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Para comenzar, ejecutemos un modelo de referencia sin ninguna ingeniería de características y evalúemos su precisión. Después de eso, aplicaremos cada uno de los cuatro métodos de ingeniería de características (información mutua, agrupamiento, reducción de dimensionalidad de PCA y codificación de etiquetas) individualmente y compararemos sus efectos en el rendimiento del modelo.
Antes de aplicar cualquier ingeniería de características, comenzaremos con un modelo de referencia. Aquí, usaremos un modelo de regresión lineal simple para predecir los precios de la vivienda usando el conjunto de datos original.
baseline_model = LinearRegression() baseline_model.fit(X_train, y_train) baseline_predictions = baseline_model.predict(X_test) baseline_rmse = mean_squared_error(y_test, baseline_predictions, squared=False) print(f"Baseline RMSE: {baseline_rmse}") # ------------------ OUTPUT ---------------- # Baseline RMSE: 49204.92
En el modelo de línea de base, comienza con un modelo de regresión lineal simple que usa las características originales tal como son. Está entrenando el modelo utilizando los datos de entrenamiento, haciendo predicciones sobre los datos de prueba y calculando el error cuadrático medio (RMSE) para medir qué tan bien se desempeña el modelo en datos no vistos.
# Method 1: Mutual Information mi_selector = SelectKBest(score_func=mutual_info_regression, k=10) X_train_mi = mi_selector.fit_transform(X_train, y_train) X_test_mi = mi_selector.transform(X_test) mi_model = LinearRegression() mi_model.fit(X_train_mi, y_train) mi_predictions = mi_model.predict(X_test_mi) mi_rmse = mean_squared_error(y_test, mi_predictions, squared=False) print(f"Mutual Information RMSE: {mi_rmse}") # ------------------ OUTPUT ----------------- # Mutual Information RMSE: 39410.99
Aquí, está explorando la información que proporciona cada función sobre la variable de destino. Selecciona las 10 funciones principales que tienen las puntuaciones de información mutua más altas con el objetivo. Luego, entrena un nuevo modelo de regresión lineal usando solo estas características seleccionadas. Esto ayuda a garantizar que su modelo se centre en las características más informativas, y calcula el RMSE para ver cómo se comparan las predicciones de este modelo con la línea de base.
# Method 2: Clustering num_clusters = 5 kmeans = KMeans(n_clusters=num_clusters, random_state=42) X_clustered = X.copy() X_clustered['Cluster'] = kmeans.fit_predict(X) X_clustered = pd.get_dummies(X_clustered, columns=['Cluster'], prefix='Cluster') X_train_clustered, X_test_clustered, _, _ = train_test_split(X_clustered, y, test_size=0.2, random_state=42) cluster_model = LinearRegression() cluster_model.fit(X_train_clustered, y_train) cluster_predictions = cluster_model.predict(X_test_clustered) cluster_rmse = mean_squared_error(y_test, cluster_predictions, squared=False) print(f"Clustering RMSE: {cluster_rmse}") # ------------------- OUTPUT -------------- # Clustering RMSE: 47715.30
Está buscando agrupar instancias similares en sus datos mediante la agrupación en clústeres. Específicamente, utiliza el algoritmo KMeans para dividir sus datos en grupos. Cada instancia se asigna a un clúster y agrega esta información de clúster como una nueva característica categórica. Al hacer esto, le está dando al modelo una forma de considerar las relaciones entre instancias en términos de sus clústeres. Después de entrenar un modelo de regresión lineal en estos datos agrupados, calcula el RMSE para evaluar su rendimiento.
# Method 3: PCA Dimensionality Reduction scaler = StandardScaler() X_scaled = scaler.fit_transform(X_train) pca = PCA(n_components=10) X_train_pca = pca.fit_transform(X_scaled) X_test_pca = pca.transform(scaler.transform(X_test)) pca_model = LinearRegression() pca_model.fit(X_train_pca, y_train) pca_predictions = pca_model.predict(X_test_pca) pca_rmse = mean_squared_error(y_test, pca_predictions, squared=False) print(f"PCA RMSE: {pca_rmse}") # --------------- OUTPUT -------------- # PCA RMSE: 40055.78
PCA lo ayuda a reducir la complejidad de sus datos al resumirlos en menos dimensiones. Estandariza sus datos para asegurarse de que todas las características estén en la misma escala. Luego, usa PCA para identificar los patrones más importantes en sus datos y reduce la cantidad de características a 10 componentes principales. Entrenando un modelo de regresión lineal en estos componentes, puede capturar la información más significativa mientras simplifica el modelo. El RMSE lo ayuda a evaluar si este enfoque es efectivo.
# Method 5: Mathematical Transformations X_train_transformed = X_train.copy() X_test_transformed = X_test.copy() # Apply logarithmic transformation log_columns = ['GrLivArea', 'LotArea'] # Specify columns to apply log transformation X_train_transformed[log_columns] = np.log1p(X_train_transformed[log_columns]) X_test_transformed[log_columns] = np.log1p(X_test_transformed[log_columns]) # Apply square root transformation sqrt_columns = ['GarageArea', '1stFlrSF'] # Specify columns to apply square root transformation X_train_transformed[sqrt_columns] = np.sqrt(X_train_transformed[sqrt_columns]) X_test_transformed[sqrt_columns] = np.sqrt(X_test_transformed[sqrt_columns]) # Apply inverse transformation inv_columns = ['YearBuilt', 'OverallQual'] # Specify columns to apply inverse transformation X_train_transformed[inv_columns] = 1 / X_train_transformed[inv_columns] X_test_transformed[inv_columns] = 1 / X_test_transformed[inv_columns] math_transform_model = LinearRegression() math_transform_model.fit(X_train_transformed, y_train) math_transform_predictions = math_transform_model.predict(X_test_transformed) math_transform_rmse = mean_squared_error(y_test, math_transform_predictions, squared=False) print(f"Mathematical Transformations RMSE: {math_transform_rmse}") # ------------------ OUTPUT --------------- # Mathematical Transformations RMSE: 47143.21
Las transformaciones matemáticas implican alterar los valores de las características mediante operaciones matemáticas para resaltar los patrones subyacentes. Aplica transformaciones logarítmicas, de raíz cuadrada e inversas a columnas específicas. Por ejemplo, la transformación logarítmica ayuda a normalizar los datos sesgados, la transformación de raíz cuadrada puede ayudar con los valores atípicos y la transformación inversa puede enfatizar las relaciones con valores pequeños. Entrena un modelo de regresión lineal utilizando estas características transformadas y calcula el RMSE para evaluar si las transformaciones han mejorado el poder predictivo del modelo.
En todos estos métodos, está experimentando con diferentes técnicas para hacer que sus datos sean más adecuados para el modelado. El objetivo es encontrar el método que conduzca al RMSE más bajo, lo que indica que las predicciones de su modelo están más cerca de los valores objetivo reales y, por lo tanto, son más precisas.
RMSE de línea base: 49204.92 Este es el error cuadrático medio (RMSE) del modelo de línea base, donde no se ha aplicado ingeniería o transformación de características. El modelo utiliza las características originales tal como son. Un RMSE de 49204,92 indica el error de predicción promedio del modelo de referencia en los datos de prueba.
Información mutua RMSE: 39410.99 Este RMSE representa el rendimiento del modelo después de aplicar el método de selección de características de información mutua. Es significativamente más bajo que el RMSE de referencia, lo que indica que la selección de las k características principales en función de sus puntajes de información mutua ha llevado a un mejor rendimiento del modelo.
Clustering RMSE: 47715.30 El RMSE aquí corresponde al rendimiento del modelo después de introducir una nueva característica categórica basada en clustering. El RMSE está cerca del RMSE de referencia, lo que sugiere que la introducción de la agrupación en clústeres no condujo a una mejora significativa en este caso.
PCA RMSE: 40055.78 Este RMSE refleja el rendimiento del modelo después de aplicar PCA para la reducción de dimensionalidad. Es un poco más alto que el RMSE de información mutua, pero más bajo que el RMSE de referencia. El modelo que utiliza funciones transformadas por PCA parece funcionar moderadamente bien.
Codificación de etiquetas RMSE: 49204.92 El RMSE aquí muestra el rendimiento del modelo cuando las variables categóricas están codificadas por etiquetas. El RMSE coincide con el RMSE de referencia, lo que indica que el uso de características codificadas por etiquetas no condujo a una mejora notable en este caso.
Transformaciones matemáticas RMSE: 47143.21 Este RMSE representa el rendimiento del modelo después de aplicar varias transformaciones matemáticas a las columnas seleccionadas. El RMSE es más bajo que el RMSE de referencia, lo que sugiere que estas transformaciones han llevado a mejorar el rendimiento del modelo.
En resumen:
Tenga en cuenta que los valores reales de RMSE y su interpretación dependen de varios factores, como el conjunto de datos, la complejidad del modelo y la naturaleza de la variable de destino. El objetivo es experimentar con diferentes métodos de ingeniería de características y seleccionar el que conduce al mejor rendimiento en datos no vistos.