【问题标题】:Difference between factor and character variables running randomForest运行 randomForest 的因子变量和字符变量之间的差异
【发布时间】:2016-10-16 01:49:12
【问题描述】:

如果我运行 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,看看当它们被视为因子和字符时,它是否提供相同的结果。但是,IMO 您应该避免将这个 RF 函数用于超过 53 个类别的预测变量,因为即使将预测变量视为一个角色有效,将其视为一个因素也不起作用这一事实可能表明可能存在不良行为在这种情况下的模型。

标签: r random-forest


【解决方案1】:

我猜每个类别的名称都是一个数值(因为randomForest() 不能将character class 包含在字符中)。 randomForest() 将由数值组成的 character class 视为数值变量(即 numeric class),而不是分类变量(即 factor class)。如果您更改每个类别的名称,结果会发生变化。

这是我的例子。如果 x_ 是 factor class,则返回相同的结果。如果 x_ 是 integer classcharacter class (but composed of numeric value),则输出取决于值。 as.character(x) 得到的结果是 CLEARY WRONG !!

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

【讨论】:

  • 很好的实际例子!我需要检查代码,但它可能正在做的是将as.numeric 应用于每个character 变量。如果它不能转换为数字,它会返回 NAs,然后函数会抛出一个错误。 as.numeric("1234") -&gt; no errorsas.numeric("abcd") -&gt; NAs introduced by coercion
  • 很高兴你喜欢它。 (我编辑了我的 poot 英语)
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2018-04-02
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多