5

我需要将 smote 算法应用于数据集,但无法使其正常工作。

例子:

x <- c(12,13,14,16,20,25,30,50,75,71)
y <- c(0,0,1,1,1,1,1,1,1,1)

frame <- data.frame(x,y)

library(DMwR)

smotedobs <- SMOTE(y~ ., frame, perc.over=300)

这给出了以下错误:

Error in scale.default(T, T[i, ], ranges) : subscript out of bounds
In addition: Warning messages:
1: In FUN(newX[, i], ...) :
  no non-missing arguments to max; returning -Inf
2: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf

会给予任何帮助或提示。

4

3 回答 3

6

SMOTE 在 OS Win7 32 位有一个 bug,它假设参数 'form' 中的目标变量是数据集中的最后一列,下面的代码将解释

library(DMwR)
data(iris)
# data <- iris[, c(1, 2, 5)]  # SMOTE work
data <- iris[, c(2, 5, 1)]  # SMOTE bug
data$Species <- factor(ifelse(data$Species == "setosa", "rare", "common"))
head(data)
table(data$Species)
newData <- SMOTE(Species ~., data, perc.over=600, perc.under=100)
table(newData$Species)

它将显示以下消息

colnames<-( , value = c(" Sepal.Width *tmp*", "Species", "Sepal.Length" 中的错误:'names' 属性 [3] 必须与向量 [2] 的长度相同)

在Win7 64bit下,不会出现顺序问题!!

于 2013-08-21T05:22:44.753 回答
5

我没有完整的答案。不过,我可以提供另一个线索:

如果将 'y' 转换为因子,SMOTE 将返回而不会出现错误 - 但合成的观测值具有 x 的 NA 值。

于 2013-04-08T11:08:25.483 回答
3

SMOTE 代码中有一个错误。它假设它正在输入的 y 函数已经是一个因子变量,目前它不处理非因子的边缘情况。确保在调用方法之前转换为一个因子。

于 2013-05-09T20:44:01.263 回答