gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:54:51 25 4
gpt4 key购买 nike

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

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

Error in matrix(unlist(value, recursive = FALSE, use.names = FALSE), nrow = nr, : length of 'dimnames' [2] not equal to array extent

我的数据集如下:

          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

我尝试过仅使用数值预测变量,甚至分类预测变量。但两者都没有运气。

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

最佳答案

将一个小标题的 data.frame 传递到 DMwR::SMOTE()会抛出这个错误。您可以使用 as.data.frame(your_train_data) 来解决这个问题'un-tibble' 你的 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)

关于r - 'dimnames' [2] 的 SMOTE 长度不等于数组范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com