Пропорционально разделенный фрейм данных с несколькими целевыми столбцамиPython

Программы на Python
Anonymous
Пропорционально разделенный фрейм данных с несколькими целевыми столбцами

Сообщение Anonymous »

У меня есть фрейм данных с 30 строками и 10 столбцами. 5 столбцов — это входные объекты, а остальные 5 — выходные/целевые столбцы. Целевые столбцы содержат классы, представленные как 0, 1, 2. Я хочу разделить набор данных на поезд и тест так, чтобы в наборе поездов для каждого выходного столбца доля класса 1 составляет от 0,15 до 0,3. (Меня не беспокоит распределение классов в тестовом наборе).
ДОПОЛНИТЕЛЬНЫЙ КОНТЕКСТ: я пытаюсь сбалансировать выходные классы в многоклассовом и многовыходном наборе данных. Насколько я понимаю, это будет проблема оптимизации с 25 (?) степенями свободы. Таким образом, если у меня есть какой-либо набор входных данных, я смогу создать подмножество этого набора входных данных, которое является моими обучающими данными и которое имеет желаемый баланс классов (т. е. класс 1 между 0,15 и 0,3 для каждого выходного столбца).
Я создаю фрейм данных, используя это

Код: Выделить всё

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

np.random.seed(42)
data = pd.DataFrame({
'A': np.random.rand(30),
'B': np.random.rand(30),
'C': np.random.rand(30),
'D': np.random.rand(30),
'E': np.random.rand(30),
'F': np.random.choice([0, 1, 2], 30),
'G': np.random.choice([0, 1, 2], 30),
'H': np.random.choice([0, 1, 2], 30),
'I': np.random.choice([0, 1, 2], 30),
'J': np.random.choice([0, 1, 2], 30)
})

Мое нынешнее глупое решение этой проблемы предполагает использование двух отдельных функций. У меня есть вспомогательная функция, которая проверяет, находятся ли пропорции класса 1 в каждом столбце в желаемом диапазоне

Код: Выделить всё

def check_proportions(df, cols, min_prop = 0.15, max_prop = 0.3, class_category = 1):
for col in cols:
prop = (df[col] == class_category).mean()
if not (min_prop 8,19
5,12
1,32
3,12
 8,41
1
2
0
1< /td>
2


9,35
1,92 
3,12
4,13
3,14
0
1
1
0
1


8,43
9,72
7,23
8,29
9,18
1
00
2
2


4,32
2,12
3,84
9,42
8,19
0
0
0
0
0


3,92
3,91
2,90
8,19
8,41
< td>2
2
2
2
 1


7,89
1,92
4,12
8,19
7,28
1
1 
2
0
2


5,21
2,42
3,10
0,31< /td>
1.31
2
0
1
1
0


< /div>
который имеет 10 строк и 10 столбцов,
и ожидаемый результат ([b]набор поездов[/b]) может быть



A
B
C
D
E
OUTPUT_1
OUTPUT_2
OUTPUT_3
OUTPUT_4
OUTPUT_5




5,65
3,56
0,94
9,23
6,43
0
1
1
0
1


7,43
3,951,24
7,22
2,66
0
0
0
1
2
< /tr>

9,31
2,42
2,91
2,64
6,28
2
1
2
2
0


< td>8,19
5,12
1,32
3,12
 8,41
1
2
0
1< /td>
2


8,43
9,72 
7,23
8,29
9,18
1
0
0
2
2


3,92
3,91
2,90
8,19
8,41
2
22
2
1


5,21
2,42
3,10
0,31
1.31
2
0
1
1
0



При этом каждый выходной столбец в [b]наборе поездов[/b] имеет как минимум 2 (>= 0,15 * количество строк во [b]входных данных[/b]) экземпляров [b]класса 1 [/b] и не более 3 (

Подробнее здесь: [url]https://stackoverflow.com/questions/78634138/proportionately-split-dataframe-with-multiple-target-columns[/url]

Вернуться в «Python»