Часто при работе с алгоритмами классификации в машинном обучении классы в наборе данных будут несбалансированными.
Например:
- В наборе данных, содержащем информацию о том, попадают ли игроки из колледжа в НБА, может быть указано, что 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