Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

196
Vistas
¿Cómo lograr una división de pliegues K estratificada para un número arbitrario de variables categóricas?

Tengo un marco de datos de la forma, df :

 cat_var_1 cat_var_2 num_var_1 0 Orange Monkey 34 1 Banana Cat 56 2 Orange Dog 22 3 Banana Monkey 6 ..

Suponga que los valores posibles de cat_var_1 en el conjunto de datos tienen las proporciones- ['Orange': 0.6, 'Banana': 0.4] y los valores posibles de cat_var_2 tienen las proporciones ['Monkey': 0.2, 'Cat': 0.7, 'Dog ': 0,1].

¿Cómo divido los datos en conjuntos de entrenamiento, prueba y validación (división 60:20:20) de modo que se conserven las proporciones de las variables categóricas? En la práctica, estas variables pueden ser de cualquier número, no solo dos. Además, claramente, es posible que nunca se logren las proporciones exactas en la práctica, pero nos gustaría que fueran lo más cercanas posible.

He investigado el método StratifiedKFold de sklearn descrito aquí: ¿cómo dividir un conjunto de datos en un conjunto de entrenamiento y validación manteniendo la proporción entre clases? pero esto se restringe a evaluar sobre la base de una sola variable categórica.

Adicionalmente, le agradecería si pudiera proporcionar la complejidad de la solución que logra.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Puede pasar df.cat_var_1+ "_" + df.cat_var_2 al argumento y de StratifiedShuffleSplit.split() :

Pero aquí hay un método que usa DataFrame.groupby :

 import pandas as pd import numpy as np nrows = 10000 p1 = {'Orange': 0.6, 'Banana': 0.4} p2 = {'Monkey': 0.2, 'Cat': 0.7, 'Dog': 0.1} c1 = [key for key, val in p1.items() for i in range(int(nrows * val))] c2 = [key for key, val in p2.items() for i in range(int(nrows * val))] random.shuffle(c1) random.shuffle(c2) df = pd.DataFrame({"c1":c1, "c2":c2, "val":np.random.randint(0, 100, nrows)}) index = [] for key, idx in df.groupby(["c1", "c2"]).groups.items(): arr = idx.values.copy() np.random.shuffle(arr) p1 = int(0.6 * len(arr)) p2 = int(0.8 * len(arr)) index.append(np.split(arr, [p1, p2])) idx_train, idx_test, idx_validate = list(map(np.concatenate, zip(*index)))
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda