我在R中使用了SMOTE来创建新的数据,而且效果很好。当我进一步研究SMOTE是如何工作的,我找不到答案,SMOTE是如何处理分类数据的。
本文给出了一个仅用数值表示的例子(第10页)。但我仍然不知道SMOTE是如何从分类示例数据中创建新数据的。
这是到论文的链接:https://arxiv.org/pdf/1106.1813.pdf
发布于 2018-12-06 14:34:43
这确实是一件值得注意的重要事情。在你提到的论文中,第6.1节和6.2节描述了名义连续且只是名义变量的情况下可能的程序。然而,DMwR不使用类似的东西。
如果您查看SMOTE的源代码,可以看到主要工作是由DMwR:::smote.exs完成的。我现在简要地解释一下这个过程。
总结是,因素级别的顺序很重要,目前似乎存在一个关于因素变量的错误,这使得事情发生了相反的。也就是说,如果我们想找到一个接近因子水平"A“的观察结果,那么"A”以外的任何东西都被视为“接近”,而"A“级的则被视为”遥远的“。因此,因素变量越多,它们的级别就越少,并且有越少的连续变量,这个bug的影响就应该越大。
因此,除非我错了,否则函数不应该与因子一起使用。
作为一个例子,让我们考虑具有一个连续变量和一个因子变量的perc.over = 600的情况。然后,我们使用与欠采样类相对应的子数据帧(例如,50行)到达smote.exs,并按如下方式进行。
T包含除类变量之外的所有变量。对应于连续变量的列保持不变,而因子或字符被强制转换为整数。这意味着要素级别的顺序是必不可少的。xd <- scale(T, T[i, ], ranges)对数据进行缩放,使xd显示出与第一次观测的偏差.例如,我们可能有一个
# [,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,否则为0。(我认为应该是相反的,这意味着它是一个bug;我要报告它。)dd <- drop(xd^2 %*% rep(1, ncol(xd))),它可以看作是第一次观测的每一个观测值的平方距离向量,kNNs <- order(dd)[2:(k + 1)]给出了k最近邻的指数。它的目的是2:(k + 1),因为第一个元素应该是i (距离应该是零)。但是,在本例中,第一个元素实际上并不总是i,因为第4点确认了一个bug。neig <- sample(1:k, 1)。然后,difs <- T[kNNs[neig], ] - T[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)],这意味着新的观测将有相同的因子水平,与第一次观测的概率为50%,与这个被选中的邻居有50%的机会。这是一种离散插值。https://stackoverflow.com/questions/53652522
复制相似问题