Недостаточная выборка для дисбаланса классов в машинном обучении

машинное обучение

Категория ДисбалансЭто относится к ситуации, когда количество обучающих примеров разных категорий в задаче классификации сильно различается.

Существует три широко используемых метода, а именно: 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:

  1. «Машинное обучение», Чжоу Чжихуа
  2. Woohoo.Card Reformed.com/Bert Carr E…
  3. продолжение japan.SCI kit-learn.org/imbalanced-…
Пожалуйста, указывайте оригинальную ссылку при перепечатке, и если у вас есть какие-либо предложения или замечания по этой статье, пожалуйста, обсудите их в области комментариев, спасибо!