在使用R语言的随机森林算法时出现错误

8

我正在使用一个数据集,其中包含名为mvar_1的列,其中包含公民去年投票支持的五个政党中的一个的名称。其他变量只是人口统计学变量,如每个政党参加的集会数量,其他内容。

当我使用以下代码:

data.model.rf = randomForest(mvar_1 ~ mvar_2 + mvar_3 + mvar_4 + mvar_5 + 
                             mvar_6 + mvar_7 + mvar_8 + mvar_9 + mvar_10 + 
                             mvar_11 + mvar_15 + mvar_17 + mvar_18 + mvar_21 + 
                             mvar_22 + mvar_23 + mvar_24 + mvar_25 + mvar_26 +
                             mvar_28, data=data.train, ntree=20000, mtry=15, 
                             importance=TRUE, na.action = na.omit )

出现了以下错误信息:

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

你的 mvar 中有一个因子具有超过53个水平。因此,要么你有一个具有许多水平的分类变量(例如人口统计学组),你应该将其聚合到较少的水平以使用此软件包,或者更可能的是,你有一个非分类变量错误地被定义为因子。在这种情况下,你应该进行修复。 - asachet
不,我之前只将mvar_1定义为分类变量......其中包括5个政党名称之一。 - akhil verma
其他变量仅根据R.F.分析给予重要性,即它们如何帮助预测分类变量mvar_1。 - akhil verma
你认为你只定义了一个分类变量,但是你的其他“mvar”可能输入错误。值得使用“summary”进行检查。无论如何,在没有看到你的数据之前我们无法提供更多帮助。考虑将“dput(head(data.train))”的输出添加到你的帖子中。 - asachet
5个回答

8

你的mvar变量之一是一个具有超过53个级别的因子。

你可能有一个具有许多级别的分类变量,例如人口统计学组,你应该将其聚合成更少的级别以使用此包。 (请参见此处进行最佳操作)

更可能的是,你将非分类变量错误地输入为因子。 在这种情况下,你应该通过正确输入变量来修复它。 例如,要从因子获取数字,你调用as.numeric(as.character(myfactor))

如果你不知道什么是因子,则第二种选项可能是它。 你应该对data.train进行summary,这将帮助你查看哪些mvar被错误地输入。 如果mvar被输入为数字,则会看到最小值、最大值、平均值、中位数等。 如果数字变量被错误地输入为因子,则不会看到这些内容,但会看到每个级别出现的次数。

无论如何,调用summary会对您有所帮助,因为它显示了每个因子的级别数量。具有>53个级别的变量会导致问题。

2
实际上,函数str提供了更易读的输出。尝试使用str(df)。你可以立即识别出具有许多水平的因子。 - asachet
谢谢!将因子转换为数字对我不起作用。但是,有效的方法是在导入数据集时使用“strip.white = TRUE”。 - Helen

0

我曾经遇到过同样的问题,但在发现导入数据框时没有指定逗号分隔符后,我解决了这个问题。

使用read.table(data, dec=",")导入表格后,问题得到了解决!


0

我遇到了同样的问题 - 错误信息提示有超过53个因子水平,但我的变量中没有这样的。

经过进一步检查,我发现我有一些因子变量是空的。

我使用forcats函数fct_drop来删除它们,然后一切正常!


-1
正如antoine-sac所指出的那样,在我的情况下,这个错误是由于数字变量出现为因子而导致的。只是当R导入我的(数字)文件时发生了转换。
将因子强制转换为数字并没有起作用。但是有效的方法是在导入数据集时使用strip.white = TRUE。(我在这里找到了这个解决方案。)

我有点好奇为什么这个被踩了。我花了半个多小时寻找解决方案,尝试了这个帖子和其他地方建议的所有方法,最终终于找到了解决我的问题的方法,感到非常欣慰。 - Helen
它可能被downvote了,因为看起来你的问题已经被@asachet回答了。添加一个额外的帖子以赞同另一个答案并没有真正“添加”原始帖子。更好的解决方案是编辑您的原始帖子,指出问题和解决方案。您还应该将asachet的帖子标记为最佳答案。 - Todd D. Johnson

-2

当您使用整个数据集而不是训练数据来训练模型时,会出现此错误。尝试使用训练数据实现模型,并使用测试ADM进行预测。


1
虽然在整个数据集上进行训练确实是一种不好的做法,但在这种情况下使用训练集也无济于事,因为问题出在一个因子具有超过53个级别,即使使用训练集也会出现这种情况。 - maRmat

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