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