Категория ДисбалансЭто относится к ситуации, когда количество обучающих примеров разных категорий в задаче классификации сильно различается.
Существует три широко используемых метода, а именно: 1. Недостаточная выборка, 2. Передискретизация, 3. Сдвиг порога.
Поскольку вероятность того, что цель проекта, сделанного за последние несколько дней, является положительным значением, составляет менее 4%, а объем данных достаточно велик, я использую недовыборку:
недостаточная выборка, то есть убрать некоторые отрицательные примеры, чтобы число положительных и отрицательных примеров стало близким, а затем выучить, основной алгоритм следующий:
def undersampling(train, desired_apriori):
# Get the indices per target value
idx_0 = train[train.target == 0].index
idx_1 = train[train.target == 1].index
# Get original number of records per target value
nb_0 = len(train.loc[idx_0])
nb_1 = len(train.loc[idx_1])
# Calculate the undersampling rate and resulting number of records with target=0
undersampling_rate = ((1-desired_apriori)*nb_1)/(nb_0*desired_apriori)
undersampled_nb_0 = int(undersampling_rate*nb_0)
print('Rate to undersample records with target=0: {}'.format(undersampling_rate))
print('Number of records with target=0 after undersampling: {}'.format(undersampled_nb_0))
# Randomly select records with target=0 to get at the desired a priori
undersampled_idx = shuffle(idx_0, n_samples=undersampled_nb_0)
# Construct list with remaining indices
idx_list = list(undersampled_idx) + list(idx_1)
# Return undersample data frame
train = train.loc[idx_list].reset_index(drop=True)
return train
скопировать код
Поскольку это соответствует конкретному проекту, недостаточная выборка внутри является отрицательным примером, и необходимо внести некоторые изменения, если вы хотите ее использовать.
Если метод недостаточной выборки случайным образом отбрасывает противоположные примеры, некоторая важная информация может быть потеряна. С этой целью лаборатория Чжоу Чжихуа предложила алгоритм недостаточной выборки.EasyEnsemble: Используя механизм ансамблевого обучения, отрицательные примеры делятся на несколько наборов, которые учащиеся могут применить, чтобы каждый учащийся был занижен, но важная информация не была потеряна в глобальном представлении. На самом деле, этот метод можно немного модифицировать по сравнению с основным методом субдискретизации:
def easyensemble(df, desired_apriori, n_subsets=10):
train_resample = []
for _ in range(n_subsets):
sel_train = undersampling(df, desired_apriori)
train_resample.append(sel_train)
return train_resample
скопировать код
Посмотрите внимательно, на картинке ниже оригинальная бумагаExploratory Undersampling for Class-Imbalance LearningВведение в алгоритм в:
PS:При использовании CV для перекрестной проверки, когда категория несбалансирована, проблема классификации показывает большой дисбаланс в целевом распределении. Если вы используетеsklearn
Если функции в библиотеке проходят перекрестную проверку, рекомендуется использовать такие, какStratifiedKFold
иStratifiedShuffleSplit
Метод стратифицированной выборки, реализованный в , гарантирует, что относительные вероятности классов примерно сохраняются при каждом обучении и проверке.
Reference:
- «Машинное обучение», Чжоу Чжихуа
- Woohoo.Card Reformed.com/Bert Carr E…
- продолжение japan.SCI kit-learn.org/imbalanced-…