因子和字符变量之间的差异运行 randomForest

Difference between factor and character variables running randomForest

如果我 运行 一个 randomForest(y ~ x, data = df) 模型,x 我得到一个超过 53 个水平的因子变量

Error in randomForest.default(m, y, ...) : 
  Can not handle categorical predictors with more than 53 categories.

如果我将 x 更改为 as.character(x) 并重新 运行 我不会收到任何错误。

幕后有什么不同?这两种类型不都被视为分类变量吗?

我猜每个类别的名称都是一个数值(因为 randomForest() 不能处理 character class 当它由字符组成时)。 randomForest() 将由数值组成的 character class 视为数值变量(即 numeric class),而不是分类变量(即 factor class)。如果您更改每个类别的名称,结果将会改变。

这是我的例子。如果 x_ 为 factor class,结果相同 return。如果 x_ 是 integer classcharacter class (but composed of numeric value),则输出取决于值。 as.character(x) 得到的结果明显错误!

set.seed(1); cw <- data.frame(y = subset(ChickWeight, Time==18)$weight, x1 = sample(47) )
cw$x2 <- as.factor(cw$x1)
cw$x3 <- as.character(cw$x1)
cw$x4 <- 47:1
cw$x5 <- as.factor(47:1)
cw$x6 <- as.character(47:1)
cw$x7 <- c(letters, LETTERS[1:21])
cw$x8 <- as.factor(cw$x7)
                               # %Var explained # class(x_)
set.seed(1); randomForest(y ~ x1, cw) # -29.61  integer1
set.seed(1); randomForest(y ~ x2, cw) # -0.42   factor
set.seed(1); randomForest(y ~ x3, cw) # -29.61  character (numeric name1)
set.seed(1); randomForest(y ~ x4, cw) # -31.78  integer2
set.seed(1); randomForest(y ~ x5, cw) # -0.42   factor
set.seed(1); randomForest(y ~ x6, cw) # -31.78  character (numeric name2)
set.seed(1); randomForest(y ~ x7, cw) # error   character (letter name)
set.seed(1); randomForest(y ~ x8, cw) # -0.42   factor