'dimnames'[2]的SMOTE长度不等于数组范围

时间:2016-07-27 14:44:44

标签: r sampling

我试图使用SMOTE对我的数据集进行超级采样,并且我一直遇到此错误。

trainSM <- SMOTE(conversion ~ ., train,perc.over = 1000,perc.under = 200)
  

矩阵错误(unlist(value,recursive = FALSE,use.names = FALSE),   nrow = nr,'dimnames'[2]的长度不等于数组范围

我的数据集如下:

          conversion horizon length_of_stay guests rooms price comp_price
            (dbl)   (int)          (int)  (int) (int) (int)      (int)
  1           1     193              2      2     1   199        210
  2           1     263              2      2     1   171         88
  3           1     300              3      2     1   164        164
  4           1      70              4      2     1    76         80
  5           1      65              6      2     2   260        260
  6           1      50              3      2     1   171        176
  7           1       4              3      2     1   158        167
  8           1      29              3      2     1   171        171
  9           0     130              1      2     1   161        160
  10          0      26              2      2     1   110        110

我尝试过只使用数值预测器甚至是分类预测器。但两者都没有运气。

非常感谢任何帮助/指导。

1 个答案:

答案 0 :(得分:4)

将作为tibble的data.frame传递给DMwR::SMOTE()会抛出此错误。您可以使用as.data.frame(your_train_data)“取消”您的data.frame:

来解决此问题
    trainSM <- SMOTE(conversion ~ ., as.data.frame(train), perc.over = 1000, perc.under = 200)

问题是SMOTE()使用单括号子集。 Tibbles(即,一个data.frame变成tibble::data_frame)对返回值要严格得多:单括号子集总是返回一个数据帧(即使结果只是一个向量,甚至是单个值)。

以下是SMOTE()源代码的问题部分:

# The idea here is to determine which level of the response variable appears least.
# Unfortunately, if data is a tibble, then data[,tgt] returns a data frame, 
# which of course, doesn't have any levels, so the value of minCL is always NULL
minCl <- levels(data[, tgt])[which.min(table(data[, tgt]))]

# this is where the error is thrown--you're testing a data frame against NULL
minExs <- which(data[, tgt] == minCl)