Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

191
Views
¿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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!