• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Estadística
      • Calculadora del Tamaño Muestral en Encuestas
      • Calculadora de estadísticos descriptivos
      • Test de normalidad
      • Calculadora de contrastes de hipotesis
      • Calculadora de tamano del efecto
      • Simulador de Regresión Lineal con Ruido
      • Visualizador de PCA
      • Visualizador de Series Temporales
      • Simulador de Regresión Logística
      • Simulador de K-Means
      • Simulador de DBSCAN
      • Detector de la Ley de Benford
    • Probabilidad
      • Calculadora de Probabilidad de Distribuciones
      • Calculadora de Probabilidades de Lotería
      • Simulador del Problema de Monty Hall
      • Simulador de la Estrategia Martingala
    • Finanzas
      • Calculadora de Préstamos e Hipotecas
      • Conversor TIN ↔ TAE
      • Calculadora DCA con ajuste por inflación
      • Calculadora XIRR con Flujos Irregulares
      • Simulador FIRE (Financial Independence, Retire Early)
    • Negocios
      • CLV
      • Scoring
    • Herramientas
      • Formateador / Minificador de JSON
      • Conversor CSV ↔ JSON
      • Comparador y Formateador de Texto y JSON
      • Formateador y Tester de Expresiones Regulares
      • Inspector de JWT
      • Generador y verificador de hashes
      • Codificador / Decodificador Base64 y URL
      • Conversor de bases numericas
      • Conversor de Timestamp Unix
      • Conversor de colores
      • Generador de UUIDs
    • Juegos
      • Tres en Raya
      • Nim con Q-Learning
    • Más
      • Método D’Hondt
      • Generador de Contraseñas Seguras
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • R
  • Excel

Selección del valor óptimo de K en SelecKBest de scikit-learn

febrero 23, 2024 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 6 minutos

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.

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring
En Analytics Lane
Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

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.

Publicidad


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.

Publicidad


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.

Rendimiento del modelo frente al número de características seleccionadas
Rendimiento del modelo en los conjuntos de dato de entrenamiento y en función del valor de K usado en SelecKBest

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.

Publicidad


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

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring
  • Subplots en Matplotlib: cómo organizar múltiples gráficos en una sola figura
  • Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales
  • Ley de Benford: cómo detectar datos manipulados con ejemplos reales
  • Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar
  • Lanzamiento de la versión 1.0 del laboratorio de Analytics Lane con nuevas herramientas de scoring
  • Síndrome del objeto brillante en ciencia de datos: el error simétrico a los costes hundidos
  • WOE e IV: La Base Matemática del Credit Scoring
  • De la Regresión Logística al Scorecard: La Transformación Matemática

Publicado en: Ciencia de datos Etiquetado como: Machine learning, Scikit-Learn

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Calibración vs Discriminación en Credit Scoring: diferencias clave y cómo evaluarlas

junio 2, 2026 Por Daniel Rodríguez

Ley de Benford: cómo detectar datos manipulados con ejemplos reales

mayo 28, 2026 Por Daniel Rodríguez

Subplots en Matplotlib: cómo organizar múltiples gráficos en una sola figura

mayo 26, 2026 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Gráficos de barras en Matplotlib publicado el julio 5, 2022 | en Python
  • Calibración vs Discriminación en Credit Scoring: diferencias clave y cómo evaluarlas publicado el junio 2, 2026 | en Ciencia de datos
  • Seleccionar la opción para compactar la base de datos en Microsoft SQL Server Manager Studio Reducir el tamaño en SQL Server de una base de datos publicado el febrero 10, 2023 | en Herramientas
  • Entendiendo el margen de error de las encuestas: Cálculo, interpretación y limitaciones publicado el noviembre 15, 2024 | en Ciencia de datos
  • Introducción al Análisis de Componentes Principales (PCA) publicado el mayo 3, 2024 | en Ciencia de datos

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.1 (11)

Aplicar el método D’Hondt en Excel

Comentarios recientes

  • bif en JSON en bases de datos: cuándo es buena idea y cuándo no
  • bif en Cómo desinstalar Oracle Database 19c en Windows
  • M. Pilar en Cómo eliminar las noticias en Windows 11 y recuperar tu concentración
  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2026 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto