我试图使用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
我尝试过只使用数值预测器甚至是分类预测器。但两者都没有运气。
非常感谢任何帮助/指导。
答案 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)