Создайте сбалансированный набор данных 1: 1 с помощью SMOTE без изменения наблюдений большинства классов в R - PullRequest
1 голос
/ 13 июля 2020

Я работаю над проблемой двоичной классификации, для которой у меня несбалансированный набор данных. Я хочу создать новый более сбалансированный набор данных с 50% наблюдения в каждом классе. Для этого я использую алгоритм SMOTE в R, предоставляемый DMwR library.

В новом наборе данных я хочу сохранить постоянными наблюдениями для большинства классов .

Однако я сталкиваюсь с двумя проблемами:

  1. SMOTE уменьшает или увеличивает количество наблюдений класса большинства (я хочу только увеличить количество класса меньшинства).
  2. Некоторые наблюдения сгенерированный SMOTE содержит значения NA.

Предположим, что у меня есть 20 наблюдений: 17 наблюдений в классе большинства и только 3 наблюдения в классе меньшинства. Вот мой код:

library(DMwR)
library(dplyr)

sample_data <- data.frame(matrix(rnorm(200), nrow=20))
sample_data[1:17,"X10"] <- 0
sample_data[18:20,"X10"] <- 1
sample_data[,ncol(sample_data)] <- factor(sample_data[,ncol(sample_data)], levels = c('1','0'), labels = c('Yes','No'))
newDataSet <- SMOTE(X10 ~., sample_data, perc.over = 400, perc.under = 100)

В моем коде я исправил perc.over = 400, чтобы создать 12 новых наблюдений для класса меньшинства, и я исправил perc.under = 100, чтобы не менять никаких изменений в классе большинства.

Однако, когда я проверяю newDataSet, я замечаю, что SMOTE уменьшает количество классов большинства с 17 до 12. Кроме того, некоторые сгенерированные наблюдения имеют значение NA.

На следующем изображении показано полученное результат:

введите описание изображения здесь

1 Ответ

1 голос
/ 13 июля 2020

Согласно ?SMOTE:

для каждого случая в исходном наборе данных, принадлежащих к классу меньшинства, на c .over / 100 будут созданы новые примеры этого класса.

Более того:

Например, если 200 новых примеров были сгенерированы для класса меньшинства, значение на c. Меньше 100 будет случайным образом выбрано ровно 200 случаев. принадлежащие большинству классов из исходного набора данных, чтобы принадлежать окончательному набору данных.

Следовательно, в вашем случае вы:

  1. создаете 12 новых Yes (кроме исходных).
  2. случайный выбор 12 No.

Новый Yes, содержащий NA, может быть связан с параметром k из SMOTE. Согласно ?SMOTE:

k: Число, указывающее количество ближайших соседей, которые используются для создания новых примеров класса меньшинства.

Его значение по умолчанию равно 5, но в исходных данных у вас всего 3 Yes. Установка k = 2, кажется, решает эту проблему.

Последний комментарий: для достижения вашей цели я бы использовал SMOTE только для увеличения количества наблюдений из класса меньшинства (с perc.over = 400 или 500 ). Затем вы можете объединить их с исходными наблюдениями из класса большинства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...