Как использовать 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)

 No Yes 
 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)

 No Yes 
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

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.