随机森林在训练集中有更多不同的因子水平时,无法正常工作。

5
当我尝试在新的测试数据上测试我的训练模型,测试数据的因子水平少于训练数据时,predict()返回以下信息:

新数据中的预测变量类型与训练数据不匹配。

我的训练数据具有一个包含7个因子水平的变量,而我的测试数据具有相同的变量,但只有6个因子水平(这6个因子水平都在训练数据中)。
当我添加一个包含“缺失”的第7个因子水平的观察结果时,模型可以运行。因此,我不确定为什么会出现这种情况,或者其背后的逻辑是什么。
如果测试集具有更多/不同的因子水平,那么随机森林可能会失败,但为什么在训练集更“多”数据的情况下也会失败呢?

1
因为如果级别不完全匹配,它们可能会被编码成不同的方式。因素将标签与整数相关联。因此,如果因素创建方式不同,“男性”在一个集合中可能是1,在另一个集合中可能是2。这意味着您可能会预测到与您预期的不同的结果。R只是确认所有级别都相同以确保安全。您不需要添加观察值来使它们匹配,只需要调整因子的levels()即可。 - MrFlick
谢谢你的回答。当我运行levels(train $ data)和levels(test $ data)时,数字排列除了train $ data末尾有一个额外的因子之外都是一致的。这是否意味着我每次都必须手动删除该级别? - bmcarterr
所有的级别必须匹配。您不需要删除该级别,只需将该级别添加到测试数据中的因子即可。您可以在不添加观察值的情况下添加级别。您可以执行 test$val <- factor(test$val, levels=levels(train$val)) 或类似的操作。由于您没有提供一个可重现的示例,所以很难具体说明。 - MrFlick
这个完美地运行了。感谢您清晰的解释。 - bmcarterr
1个回答

8

R期望训练数据和测试数据具有完全相同的级别(即使其中一个集合对于给定级别或级别没有观察结果)。在你的情况下,由于测试数据集缺少训练数据集具有的级别,因此你可以执行以下操作:

test$val <- factor(test$val, levels=levels(train$val))

为了确保它具有相同的级别并且编码方式相同,请这样说。
(在此重新发布以结束问题)

我对此有些困惑。https://dev59.com/WpTfa4cB1Zd3GeqPQGjS 似乎表明确保级别的一致性并不是必要的。是否有些拟合模型携带了 x 的分类编码(因此顺序无关紧要),而有些则没有? - cd98
1
@cd98 嗯,predict()是一个通用函数,看起来predict.lm()必须更容忍不同的水平。但在我的经验中,大多数predict()函数都期望水平相同。 - MrFlick

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