使用R使用随机林时出错

使用R使用随机林时出错,r,R,我正在使用一个包含mvar_1的数据集作为列,其中包含公民去年投票支持的5个政党之一的名字。其他变量仅仅是人口统计变量,比如每个政党参加的集会数量,以及其他因素 当我使用以下代码时: 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_1
的数据集作为列,其中包含公民去年投票支持的5个政党之一的名字。其他变量仅仅是人口统计变量,比如每个政党参加的集会数量,以及其他因素

当我使用以下代码时:

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级的因子

你可能有一个分类变量,有很多级别,比如人口统计组,你应该把它聚合成更少的级别来使用这个包。(请参阅以了解最佳操作方法)

更有可能的是,您将一个非类别变量错误地键入为因子。在这种情况下,您应该通过正确键入变量来修复它。例如,要从因子中获取数值,可以调用
as.numeric(as.character(myfactor))

如果你不知道因素是什么,第二个选择可能就是它。您应该对
数据进行
摘要
。训练
,这将帮助您查看哪些
mvar
输入错误。如果将
mvar
键入为数字,您将看到最小值、最大值、平均值、中值等。如果将数字变量错误地键入为因子,您将看不到,但您将看到每个级别的出现次数


在任何情况下,调用
summary
都会对您有所帮助,因为它会显示每个因素的级别数。53级以上的变量导致了问题。

当您使用整个数据集而不是火车数据训练模型时,会发生此错误。尝试使用列车数据实现模型,并使用test adm进行预测。

正如antoine sac所指出的,在我的案例中,此错误是由于数值变量作为因子出现。只是R在导入我的(数字)文件时发生了转换


把这些因素当作数字处理是行不通的。但有效的方法是在导入数据集时使用
strip.white=TRUE
。(我找到了这个解决方案。)

我也遇到了同样的问题,但是在看到我导入了带有逗号分隔符的数据帧而没有指明它之后,我解决了这个问题


使用
read.table(data,dec=“,”)
导入表格后,问题解决了

您的一个
mvar
是一个超过53级的因子。所以,要么你有一个分类变量,有很多层次,比如人口统计组,你应该把它聚合到一个较低的层次来使用这个包,或者,更可能的是,你有一个非分类变量作为一个因子被错误地输入。在这种情况下,您应该修复它。不,我之前只将mvar_1定义为分类变量。。。。。5个参与方名称中的哪一个。根据R.F.分析,其他变量仅被赋予重要性,即它们如何帮助预测分类变量mvar_1您认为您只定义了一个分类变量,但您的其他一些
mvar
可能输入错误。值得使用
摘要
进行检查。在任何情况下,如果不查看您的数据,我们都无法提供更多帮助。考虑将“代码> DPT(头(Data .Cub))< /代码>添加到您的帖子中。实际上,函数<代码> STR 给出了更清晰的输出。试试
str(df)
。您可以在短时间内识别多个级别的系数。谢谢!把这些因素当作数字计算对我来说不起作用。但是在导入数据集时使用了
strip.white=TRUE
,我有点好奇为什么会被否决。我花了半个多小时寻找解决方案,尝试了本帖和其他帖中的所有建议,最终找到了我问题的解决方案,我松了一口气。很可能是因为@asachet已经回答了您的问题,所以被否决了。添加一个额外的帖子来同意另一个答案并不能真正地“添加任何东西”到原来的帖子上。更好的解决办法是编辑你的原始帖子,指出问题所在和解决方案。您还应该将asachet的帖子标记为最佳答案。虽然在整个数据集上进行培训确实是一种不好的做法,但使用训练集在这里并没有帮助,因为问题来自一个因子有53个以上的级别,使用训练集也会发生这种情况。