Это действительно важная вещь, о которой нужно знать.С точки зрения статьи, на которую вы ссылаетесь, в разделах 6.1 и 6.2 описываются возможные процедуры для случаев номинально-непрерывных и просто номинальных переменных.Однако DMwR
не использует что-то подобное.
Если вы посмотрите на исходный код SMOTE
, вы увидите, что основная работа выполняется DMwR:::smote.exs
.Сейчас я кратко объясню процедуру.
В итоге, порядок уровней факторов имеет значение, и в настоящее время, похоже, существует ошибка в отношении факторов факторов, которая заставляет вещи работать напротив .То есть, если мы хотим найти наблюдение, близкое к наблюдению с уровнем фактора «А», то все, кроме «А», рассматривается как «близкое», а те, которые имеют уровень «А», рассматриваются как «отдаленные».Следовательно, чем больше факторных переменных, тем меньше у них уровней и меньше непрерывных переменных, тем более значительным должен быть эффект этой ошибки.
Так что, если я не ошибаюсь, функцияне следует использовать с коэффициентами.
В качестве примера рассмотрим случай perc.over = 600
с одной непрерывной и одной факторной переменной.Затем мы приходим к smote.exs
с фреймом суб-данных, соответствующим классу пониженной выборки (скажем, 50 строк), и действуем следующим образом.
- Matrix
T
содержит все, кроме переменных класса.Столбцы, соответствующие непрерывным переменным, остаются неизменными, а коэффициенты или символы приводятся к целым числам .Это означает, что порядок уровней факторов является существенным. - Далее мы генерируем 50 * 6 = 300 новых наблюдений.Мы делаем это путем создания 6 новых наблюдений (n = 1, ..., 6) для каждого из 50 существующих (i = 1, ..., 50).
- Мы масштабируем данные как
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%.Итак, это некая дискретная интерполяция.