Вам нужно немного поиграть с двумя параметрами, доступными из функции: perc.over
и perc.under
.
Согласно doc из SMOTE
:
Параметры perc.over и perc.under контролируют степень избыточной выборки класса меньшинства и недостаточной выборки классов большинства, соответственно.
Итак:
perc.over, как правило, будет числом выше 100. При значениях этого типа для каждого случая в наборе исходных данных, принадлежащих к классу меньшинства, perc.over / 100 будут новые примеры этого класса.создал
Я не могу видеть ваши данные, но, если у вашего класса меньшинства 100 случаев и perc.over=100
, алгоритм сгенерирует 100/100 = 1 новых случаев из этого класса.
Параметр perc.under управляет долей падежей мажоритарного класса, которые будут случайным образом выбраны для окончательного «сбалансированного» набора данных.Эта пропорция рассчитывается по отношению к числу вновь созданных случаев класса меньшинства.
Так, например, значение perc.under=100
выберет из класса большинства на исходных данных то же количество наблюдений, что ибыли сгенерированы для класса меньшинства.
В нашем примере был сгенерирован только 1 новый случай, поэтому он добавит еще один, в результате чего получится новый набор данных с 2 случаями.
Я предлагаю использоватьзначения выше 100 для perc.over
и еще более высокое значение для perc.under
(по умолчанию 100 и 200).
Имейте в виду, что вы добавляете новые наблюдения, которые не реальны в вашем классе меньшинства я постараюсь держать их под контролем.
Числовой пример:
set.seed(123)
data <- data.frame(var1 = sample(50),
var2 = sample(50),
out = as.factor(rbinom(50, 1, prob=0.1)))
table(data$out)
# 0 1
# 43 7 # 50 rows total (original data)
smote_data <- DMwR::SMOTE(out ~ var1, data, perc.over = 200, perc.under = 400)
table(smote_data$out)
# 0 1
# 56 21 # 77 rows total (smote data)