【问题标题】:randomForest does not work when training set has more different factor levels than test set当训练集具有比测试集更多的不同因子水平时,randomForest 不起作用
【发布时间】:2014-07-21 18:49:52
【问题描述】:

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

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

我的训练数据有一个具有 7 个因子水平的变量,而我的测试数据有一个具有 6 个因子水平的相同变量(所有 6 个都在训练数据中)。

当我添加一个包含“缺失”第 7 个因素的观察时,模型会运行,所以我不确定为什么会发生这种情况,甚至不知道它背后的逻辑。

我可以看到测试集是否有更多/不同的因子水平,然后 randomForest 会窒息,但为什么在训练集有“更多”数据的情况下?

【问题讨论】:

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

标签: r random-forest


【解决方案1】:

R 期望训练数据和测试数据具有完全相同的级别(即使其中一组没有针对给定级别的观察值)。在您的情况下,由于测试数据集缺少火车具有的级别,您可以这样做

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

以确保它具有所有相同的级别并且它们的编码相同。

(在此处重新发布以结束问题)

【讨论】:

  • 我对此有点困惑。 stackoverflow.com/questions/35595499/… 似乎表明没有必要确保级别的一致性。是不是某些拟合模型带有xs 的分类编码(因此顺序无关紧要),而有些则没有?
  • @cd98 好吧,predict() 是一个通用函数,看起来predict.lm() 必须更能容忍不同的级别。以我的经验,似乎大多数predict() 函数都期望相同的级别。
猜你喜欢
  • 2015-07-20
  • 2017-03-24
  • 2020-02-29
  • 2018-08-19
  • 2018-07-26
  • 1970-01-01
  • 2015-01-17
  • 2019-08-15
  • 2018-12-22
相关资源
最近更新 更多