SMOTE in r значительно уменьшает размер выборки - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть набор данных с 130000 записей.Записи, разделенные на два класса целевой переменной, 0 и 1. 1 содержит только 0,09% от общей доли.

Я выполняю свой анализ в R-3.5.1 для Windows 10. Я использовал алгоритм SMOTE дляработать с этим несбалансированным набором данных.

Я использовал следующий код для обработки несбалансированного набора данных

library(DMwR)
data_code$target=as.factor(data_code$target) #Converted to factor as 
# SMOTE works with factor data type
smoted_data <- SMOTE(target~., data_code, perc.over=100)

Но после выполнения кода я вижу, что счетчик 0 равен 212, а 1 равентакже 212, что является значительным уменьшением размера моей выборки. Можете ли вы предложить мне, как мне обрабатывать этот несбалансированный набор данных с помощью SMOTE без изменения размера моих данных

1 Ответ

0 голосов
/ 11 февраля 2019

Вам нужно немного поиграть с двумя параметрами, доступными из функции: 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)
...