因子和字符变量之间的差异运行 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 class
或 character 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
如果我 运行 一个 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 class
或 character 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