随机森林中因子变量和字符变量的区别

7
如果我运行一个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)并重新运行,就不会出现错误。
底层的区别是什么?两种类型都不被视为分类变量吗?

它们都应该被视为分类变量。说实话,我不确定,但您可以尝试使用少于53个类别的预测变量来拟合RF,并查看当它们被视为因子和字符时是否提供相同的结果。然而,我的建议是,您应该避免对具有超过53个类别的预测变量利用此RF函数,因为即使将预测变量作为字符处理有效,将其作为因子处理无效可能表明模型在这种情况下可能存在不良行为的迹象。 - Davide Passaretti
1个回答

5
我猜每个类别的名称都是一个数字值(因为randomForest()不能处理由字符组成的字符类)。randomForest()将由数字值组成的字符类视为数值变量(即数值类),而不是分类变量(即因子类)。如果您更改每个类别的名称,则结果将发生变化。
这是我的例子。如果x_是因子类,则返回相同的结果。如果x_是整数类字符类(但由数字值组成),输出取决于该值。通过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

很好的实际例子!我需要检查代码,但可能它正在对每个“character”变量应用as.numeric。如果无法转换为数字,则返回NAs,然后函数会抛出错误。 as.numeric(“1234”)->没有错误as.numeric(“abcd”)->由强制引入的NAs - Thiago
我很高兴你喜欢它。(而且我稍微修改了我的糟糕英语) - cuttlefish44

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接