问题
问题在于rpart使用的是基于树的算法,只能处理给定特征中有限数量的因素。因此,您可能会遇到一个变量被设置为具有超过53个类别的因素:
> rf.1 <- randomForest(x = rf.train.2,
+ y = rf.label,
+ ntree = 1000)
Error in randomForest.default(x = rf.train.2, y = rf.label, ntree = 1000) :
Can not handle categorical predictors with more than 53 categories.
你的问题基本上是因为caret在运行该函数,所以请确保你用超过53个级别修复了分类变量。
以下是我之前遇到的问题(注意邮政编码作为因素输入):
rf.train.2 <- df_train[, c("v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"zipcode",
"price",
"made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
v2=as.factor(rf.train.2$v2),
v3=as.factor(rf.train.2$v3),
v4=as.factor(rf.train.2$v4),
v5=as.factor(rf.train.2$v5),
v6=as.factor(rf.train.2$v6),
v7=as.factor(rf.train.2$v7),
v8=as.factor(rf.train.2$v8),
zipcode=as.factor(rf.train.2$zipcode),
price=rf.train.2$price,
made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]
解决方案
删除所有具有超过53个级别的分类变量。
这是我修改后的代码,调整了分类变量 zipcode,你甚至可以将其包装在数字包装器中,如下所示:as.numeric(rf.train.2$zipcode)
。
rf.train.2 <- df_train[, c("v1",
"v2",
"v3",
"v4",
"v5",
"v6",
"v7",
"v8",
"zipcode",
"price",
"made_purchase")]
rf.train.2 <- data.frame(v1=as.factor(rf.train.2$v1),
v2=as.factor(rf.train.2$v2),
v3=as.factor(rf.train.2$v3),
v4=as.factor(rf.train.2$v4),
v5=as.factor(rf.train.2$v5),
v6=as.factor(rf.train.2$v6),
v7=as.factor(rf.train.2$v7),
v8=as.factor(rf.train.2$v8),
zipcode=rf.train.2$zipcode,
price=rf.train.2$price,
made_purchase=as.factor(rf.train.2$made_purchase))
rf.label <- rf.train.2[,"made_purchase"]
rpart
和nnet
时遇到了同样的问题。对于后者,我只需要设置linout = TRUE
就可以摆脱警告信息并获得正确的交叉验证预测。然而,我还没有找到rpart
的解决方案:交叉验证预测非常好。我感觉rpart
期望我们传递一些参数,但是我们无法使用train
传递,例如method = "anova"
。rpart
的帮助页面说“最明智的做法是直接指定方法”。 - Samuel-Rosamethod = rf
)时遇到了同样的问题,但只有在数据集中的行数太少时才会出现警告。如果数据集更大(与较小的数据集具有相同的结构),则不会出现警告。 - yPennylane