Para poder entrenar un modelo de aprendizaje automático de forma correcta es necesario seleccionar las características. Un proceso clave para mejorar el rendimiento de los modelos. En Python, uno de los posibles métodos para ello es SelectKBest (o su equivalente SelectPercentile). Una de las herramientas de selección de características que se encuentran disponibles en la
biblioteca scikit-learn de Python. En esta entrada, se explicará este se explicará el funcionamiento de la herramienta y como se puede seleccionar el valor óptimo de K en el método SelecKBest.
Tabla de contenidos
- 1 ¿Qué es SelectKBest y para qué se utiliza?
- 2 Cómo seleccionar el valor óptimo de K en SelectKBest
- 2.1 Paso 1: Obtener el conjunto de datos
- 2.2 Paso 2: División del conjunto de datos
- 2.3 Paso 3: Evaluación del rendimiento del modelo para diferentes valores de K
- 2.4 Paso 4: Representación gráfica del rendimiento del modelo frente a K
- 2.5 Paso 5: Identificación del valor óptimo de K
- 2.6 Conclusiones
- 2.7 Código completo usado en la publicación
¿Qué es SelectKBest y para qué se utiliza?
SelectKBest es una clase con la que se puede seleccionar las mejores características de un conjunto de datos para usar en el entrenamiento de modelos de aprendizaje supervisado. Para lo que mide como predice cada una por sí sola la variable objetivo. Para ello se le debe indicar una métrica de rendimiento con la que asigna una puntuación a cada una de las características del conjunto de datos. Una vez obtenida la puntuación selecciona únicamente la K mejores del conjunto de datos. Así, para poder usar esta clase, es necesario seleccionar dos hiperparámetros: la función de métrica y el valor de K. La función se selecciona en función del problema, por ejemplo, f_classif
para problemas de clasificación y f_regression
para problemas de regresión. Por otro lado, la elección de K puede ser más difícil.
El método SelectKBest se utiliza principalmente para reducir la dimensionalidad de los datos, lo que puede mejorar el rendimiento del modelo al eliminar características irrelevantes, reducir el sobreajuste y reducir el tiempo de entrenamiento.
En scikit-learn, además de SelectKBest también se puede usar la clase SelectPercentile. A la que se le debe indicar el porcentaje de caracterizas a seleccionar en lugar del número, aunque el resto del funcionamiento es exactamente el mismo.
Cómo seleccionar el valor óptimo de K en SelectKBest
Una de las preguntas clave cuando se crea un modelo es cuál es el valor óptimo de K en SelecKBest, es decir, cuántas características deben seleccionarse. Algo que se puede resolver con una curva de validación. Para ello, simplemente se representa el rendimiento del modelo frente a K en un conjunto de datos de entrenamiento y otro de validación para identificar el valor de K óptimo.
Las curvas de validación son un enfoque visual con el que se puede determinar el valor óptimo de K en SelecKBest. Un método que se puede resumir en los siguientes pasos.
Paso 1: Obtener el conjunto de datos
A modo de ejemplos se va a usar un conjunto de datos sintéticos. Para ello se puede utilizar la función make_regression()
de scikit-learn, una función diseñada para generar conjuntos de datos sintéticos que simula un problema de regresión. El resultado es un conjunto de datos donde algunas de las características son relevantes para predecir la variable objetivo y otras son irrelevantes o redundantes. Permitiendo de este modo simular un escenario realista donde se requiere la selección de características. Para ello se va a usar el siguiente código.
from sklearn.datasets import make_regression # Crear un conjunto de datos sintéticos X, y = make_regression(n_samples=100, n_features=20, noise=0.1, random_state=42)
En este ejemplo, para garantizar que los valores son reproducibles, se usa el número 42 como semilla.
Paso 2: División del conjunto de datos
El conjunto de datos se divide en un conjunto de entrenamiento y un conjunto de pruebas. En scikit-learn, la función con la que se puede realizar esta tarea es train_test_split()
. Como es habitual, el conjunto de entrenamiento se utiliza para ajustar el modelo y seleccionar las características, mientras que el conjunto de prueba se reserva para evaluar el rendimiento del modelo de forma independiente.
from sklearn.model_selection import train_test_split # Dividir los datos en conjunto de entrenamiento y conjunto de prueba X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
Paso 3: Evaluación del rendimiento del modelo para diferentes valores de K
Ahora, una vez divididos los datos, para cada valor de K en un rango predefinido, se aplica la clase SelectKBest para seleccionar las características más relevantes del conjunto de entrenamiento. Para entrenar un modelo utilizando solamente las características seleccionadas. Finalmente, se evalúa su rendimiento tanto en el conjunto de entrenamiento como en el conjunto de prueba.
from sklearn.feature_selection import SelectKBest, f_regression from sklearn.linear_model import LinearRegression # Definir una lista de posibles valores de K k_values = range(1, 21) # Inicializar listas para almacenar los resultados de rendimiento train_scores = [] test_scores = [] # Evaluar el rendimiento del modelo para cada valor de K for k in k_values: # Seleccionar características utilizando SelectKBest selector = SelectKBest(score_func=f_regression, k=k) X_train_selected = selector.fit_transform(X_train, y_train) # Entrenar un modelo de regresión lineal model = LinearRegression() model.fit(X_train_selected, y_train) # Evaluar el rendimiento en el conjunto de entrenamiento train_score = model.score(X_train_selected, y_train) train_scores.append(train_score) # Evaluar el rendimiento en el conjunto de prueba X_test_selected = selector.transform(X_test) test_score = model.score(X_test_selected, y_test) test_scores.append(test_score)
Nótese que en el ejemplo se ha usado f_regression
a la hora de crear la clase con SelectKBest
, esto es porque el problema es de regresión. Para otros problemas se debe cambiar la función por la más adecuada.
Paso 4: Representación gráfica del rendimiento del modelo frente a K
Una vez entrenados todos los modelos, los resultados de rendimiento para diferentes valores de K se deben representan gráficamente. En los problemas de regresión, por lo general, se traza el rendimiento del modelo usando el R2 en el eje y frente al número de características seleccionadas (K) en el eje x. Para problemas de clasificación se puede usar la precisión. Esto permite visualizar cómo cambia el rendimiento del modelo a medida que se varía el número de características seleccionadas.
import matplotlib.pyplot as plt # Visualizar los resultados plt.plot(k_values, train_scores, label='Train Score') plt.plot(k_values, test_scores, label='Test Score') plt.xlabel('Número de características seleccionadas (K)') plt.ylabel('R2 Score') plt.title('Rendimiento del modelo frente a K') plt.legend() plt.show()
Paso 5: Identificación del valor óptimo de K
En esta gráfica, se debe buscar el punto donde el rendimiento del modelo en el conjunto de prueba alcance un máximo o se estabilice. Lo que indica el valor óptimo de K en SelecKBest. En otras palabras, el número de características que proporciona el mejor equilibrio entre la complejidad del modelo y su capacidad para generalizar a nuevos datos.
En el ejemplo, parece que esto sucede en torno a 7 características.
Conclusiones
Seleccionar el valor óptimo de K en SelecKBest de scikit-learn es crucial para obtener el mejor rendimiento de los modelos y evitar el sobreajuste. En este artículo, se ha analizado cómo realizar esta selección usan para ello curvas de validación. Un enfoque sencillo con el que se puede mejorar la calidad de los modelos de aprendizaje automático.
Código completo usado en la publicación
A continuación, se muestra el código completo que se ha utilizado en esta entrada.
# Importar bibliotecas necesarias from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.feature_selection import SelectKBest, f_regression from sklearn.linear_model import LinearRegression import matplotlib.pyplot as plt # Crear un conjunto de datos sintéticos X, y = make_regression(n_samples=100, n_features=20, noise=0.1, random_state=42) # Dividir los datos en conjunto de entrenamiento y conjunto de prueba X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42) # Definir una lista de posibles valores de K k_values = range(1, 21) # Inicializar listas para almacenar los resultados de rendimiento train_scores = [] test_scores = [] # Evaluar el rendimiento del modelo para cada valor de K for k in k_values: # Seleccionar características utilizando SelectKBest selector = SelectKBest(score_func=f_regression, k=k) X_train_selected = selector.fit_transform(X_train, y_train) # Entrenar un modelo de regresión lineal model = LinearRegression() model.fit(X_train_selected, y_train) # Evaluar el rendimiento en el conjunto de entrenamiento train_score = model.score(X_train_selected, y_train) train_scores.append(train_score) # Evaluar el rendimiento en el conjunto de prueba X_test_selected = selector.transform(X_test) test_score = model.score(X_test_selected, y_test) test_scores.append(test_score) # Visualizar los resultados plt.plot(k_values, train_scores, label='Train Score') plt.plot(k_values, test_scores, label='Test Score') plt.xlabel('Número de características seleccionadas (K)') plt.ylabel('R2 Score') plt.title('Rendimiento del modelo frente a K') plt.legend() plt.show()
Imagen de Markus Distelrath en Pixabay
Deja una respuesta