Как использовать smote для несбалансированных данных в r (с примером)


Часто при работе с алгоритмами классификации машинного обучения классы в наборе данных оказываются несбалансированными.

Например:

  • Набор данных, содержащий информацию о том, выбраны ли игроки колледжа в НБА, может содержать 98% игроков, не выбранных на драфте, и 2% игроков, находящихся на драфте.
  • Набор данных, содержащий информацию о том, есть ли у пациентов рак, может содержать 99% пациентов без рака и только 1% больных раком.
  • Набор данных, содержащий информацию о банковском мошенничестве, может содержать 96% законных транзакций и 4% мошеннических транзакций.

Из-за этих несбалансированных классов построенная вами прогнозирующая модель может не работать должным образом с классом меньшинства.

Хуже того, класс меньшинства часто является тем, кого мы больше всего хотим предсказать.

Одним из способов решения этой проблемы дисбаланса является использование метода синтетической передискретизации меньшинства , часто сокращенно SMOTE .

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

Самый простой способ использовать SMOTE в R — использовать функцию SMOTE() из пакета DMwR .

Эта функция использует следующий базовый синтаксис:

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

Золото:

  • form : формула, описывающая модель, которую вы хотите адаптировать.
  • data : Имя фрейма данных.
  • perc.over : число, определяющее, сколько дополнительных случаев класса меньшинства будет сгенерировано.
  • perc.under : число, определяющее, сколько дополнительных случаев класса большинства генерируется.

В следующем примере показано, как использовать эту функцию на практике.

Пример: как использовать SMOTE в R

Предположим, у нас есть следующий набор данных со 100 наблюдениями в R, из которых 90 имеют класс «Да», а 10 — класс «Нет» для переменной ответа:

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

Это классический пример несбалансированного набора данных, поскольку прогнозируемая нами переменная отклика имеет 90 наблюдений с классом «Да» и только 10 наблюдений с классом «Нет».

Чтобы создать более сбалансированный набор данных, мы можем использовать функцию SMOTE() из пакета DMwR :

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

Результирующий набор данных содержит 210 наблюдений с классом «Нет» и 800 наблюдений с классом «Да».

Вот как функция SMOTE создала этот новый набор данных:

  • Аргумент perc.over указывал, что мы хотим добавить в набор данных в 2000/100 (или 20) раз больше существующих наблюдений меньшинства. Поскольку в исходном наборе данных существовало 10 наблюдений, мы добавили 20*10 = 200 дополнительных наблюдений меньшинства .
  • В аргументе perc.under указано, что мы хотим сделать количество наблюдений большинства равным в 400/100 (или 4) раза количеству наблюдений меньшинства, добавленных к существующим наблюдениям меньшинства. Поскольку было добавлено 200 дополнительных наблюдений меньшинства, мы сделали количество наблюдений большинства равным 200 * 4 = 800 наблюдений большинства .

Конечным результатом является набор данных, который по-прежнему содержит больше классов большинства, но по-прежнему более сбалансирован, чем исходный набор данных.

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

Примечание . Не стесняйтесь экспериментировать с аргументами perc.over и perc.under в функции SMOTE, чтобы получить набор данных, соответствующий вашим потребностям.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные задачи в R:

Как создать сводные таблицы в R
Как нормализовать данные в R
Как удалить выбросы в R

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *