Дублирование обучающих примеров для обработки дисбаланса класса в кадре данных pandas
У меня есть DataFrame в пандах, которые содержат обучающие примеры, например:
feature1 feature2 class
0 0.548814 0.791725 1
1 0.715189 0.528895 0
2 0.602763 0.568045 0
3 0.544883 0.925597 0
4 0.423655 0.071036 0
5 0.645894 0.087129 0
6 0.437587 0.020218 0
7 0.891773 0.832620 1
8 0.963663 0.778157 0
9 0.383442 0.870012 0
который я сгенерировал используя:
import pandas as pd
import numpy as np
np.random.seed(0)
number_of_samples = 10
frame = pd.DataFrame({
'feature1': np.random.random(number_of_samples),
'feature2': np.random.random(number_of_samples),
'class': np.random.binomial(2, 0.1, size=number_of_samples),
},columns=['feature1','feature2','class'])
print(frame)
Как видите, тренировочный набор несбалансирован (8 образцов имеют класс 0, в то время как только 2 образца имеют класс 1). Я хотел бы пересмотреть тренировочный набор. В частности, я хотел бы дублировать обучающие выборки с классом 1, чтобы обучающий набор был сбалансированным (т. Е. Когда число выборок с классом 0 приблизительно совпадает с количеством выборок с классом 1). Как я могу это сделать?
В идеале я хотел бы получить решение, которое можно обобщить на настройку мультикласса (т. Е. Целое число в столбце класса может быть больше 1).
1 ответ
Вы можете найти максимальный размер группы
max_size = frame['class'].value_counts().max()
В вашем примере это равно 8. Для каждой группы вы можете выбрать образец с заменой. max_size - len(group_size)
элементы. Таким образом, если вы соедините их с исходным DataFrame, их размеры будут такими же, и вы сохраните исходные строки.
lst = [frame]
for class_index, group in frame.groupby('class'):
lst.append(group.sample(max_size-len(group), replace=True))
frame_new = pd.concat(lst)
Вы можете играть с max_size-len(group)
и, возможно, добавить немного шума, потому что это сделает все размеры группы равными.