Как SMOTE создает новые данные из категориальных данных? - PullRequest
0 голосов
/ 06 декабря 2018

Я использовал SMOTE в R для создания новых данных, и это работало нормально.Когда я проводил дальнейшие исследования того, как именно SMOTE работает, я не мог найти ответ, как SMOTE обрабатывает категориальные данные.

В статье показан пример (стр. 10)только с числовыми значениями.Но я до сих пор не знаю, как SMOTE создает новые данные из данных категориальных примеров.

Это ссылка на статью: https://arxiv.org/pdf/1106.1813.pdf

1 Ответ

0 голосов
/ 06 декабря 2018

Это действительно важная вещь, о которой нужно знать.С точки зрения статьи, на которую вы ссылаетесь, в разделах 6.1 и 6.2 описываются возможные процедуры для случаев номинально-непрерывных и просто номинальных переменных.Однако DMwR не использует что-то подобное.


Если вы посмотрите на исходный код SMOTE, вы увидите, что основная работа выполняется DMwR:::smote.exs.Сейчас я кратко объясню процедуру.

В итоге, порядок уровней факторов имеет значение, и в настоящее время, похоже, существует ошибка в отношении факторов факторов, которая заставляет вещи работать напротив .То есть, если мы хотим найти наблюдение, близкое к наблюдению с уровнем фактора «А», то все, кроме «А», рассматривается как «близкое», а те, которые имеют уровень «А», рассматриваются как «отдаленные».Следовательно, чем больше факторных переменных, тем меньше у них уровней и меньше непрерывных переменных, тем более значительным должен быть эффект этой ошибки.

Так что, если я не ошибаюсь, функцияне следует использовать с коэффициентами.


В качестве примера рассмотрим случай perc.over = 600 с одной непрерывной и одной факторной переменной.Затем мы приходим к smote.exs с фреймом суб-данных, соответствующим классу пониженной выборки (скажем, 50 строк), и действуем следующим образом.

  1. Matrix T содержит все, кроме переменных класса.Столбцы, соответствующие непрерывным переменным, остаются неизменными, а коэффициенты или символы приводятся к целым числам .Это означает, что порядок уровней факторов является существенным.
  2. Далее мы генерируем 50 * 6 = 300 новых наблюдений.Мы делаем это путем создания 6 новых наблюдений (n = 1, ..., 6) для каждого из 50 существующих (i = 1, ..., 50).
  3. Мы масштабируем данные как xd <- scale(T, T[i, ], ranges), так что xd показывает отклонения от i-го наблюдения.Например, для i = 1 у нас может быть

#             [,1]  [,2]
# [1,]  0.00000000  0.00
# [2,] -0.13333333  0.25
# [3,] -0.26666667  0.25

, что означает, что непрерывная переменная для i = 2,3 меньше, чем для i = 1, но чтоуровни факторов i = 2,3 «выше».

Затем, запустив for (a in nomatr) xd[, a] <- xd[, a] == 0, мы игнорируем большую часть информации во втором столбце, относящуюся к отклонениям уровня фактора: мы устанавливаем отклонения равными 1 для тех случаев, которые имеют тот же уровень фактора, что и i-е наблюдение, и 0 в противном случае.(Я полагаю, что должно быть наоборот , что означает, что это ошибка ; я собираюсь сообщить об этом.) Затем мы устанавливаем dd <- drop(xd^2 %*% rep(1, ncol(xd))), чтоможет рассматриваться как вектор квадратов расстояний для каждого наблюдения от i-го, а kNNs <- order(dd)[2:(k + 1)] дает индексы k ближайших соседей.Он целенаправленно равен 2:(k + 1), поскольку первый элемент должен быть i (расстояние должно быть равно нулю).Однако первый элемент на самом деле не всегда равен i в этом случае из-за пункта 4, который подтверждает ошибку. Теперь мы создадим n-е новое наблюдение, подобное i-му.Сначала мы выбираем одного из ближайших соседей, neig <- sample(1:k, 1).Тогда difs <- T[kNNs[neig], ] - T[i, ] представляет собой компонентную разницу между этим соседом и i-м наблюдением, например,

difs
# [1] -0.1 -3.0

Это означает, что сосед имеет более низкие значения в терминахобе переменные.

Новый случай создается с помощью команды: T[i, ] + runif(1) * difs, которая действительно является выпуклой комбинацией между i-й переменной и соседом.Эта строка предназначена только для непрерывных переменных.Для факторов у нас есть c(T[kNNs[neig], a], T[i, a])[1 + round(runif(1), 0)], что означает, что у нового наблюдения будут те же уровни факторов, что и у i-го наблюдения с вероятностью 50%, и то же самое, что у выбранного соседа с другой вероятностью 50%.Итак, это некая дискретная интерполяция.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...