randomForest() 如何预测不在训练数据中的新因子水平?
How does randomForest() predict for new factor levels not in training data?
当我通过拆分单个数据帧创建训练集和测试集并使用 randomForest
包构建随机森林时,对于训练数据中不存在的某些因子水平,predict()
函数仍然会抛出一个输出。虽然这没有给出任何错误(这是我在相关问题中寻找的),但我的问题是 randomForest()
模型在什么基础上预测该值,因为它理想情况下应该抛出以下错误...
Error in predict.randomForest() :
New factor levels not present in the training data
出于好奇想知道 randomForest()
方法是否对测试数据中的新因子水平做出了一些固有假设。
这是一个可重现的例子:
seq1 <- c(5,3,1,3,1,"unwanted_char",4,2,2,3,0,4,1,1,0,1,0,1)
df1 <- matrix(seq1,6)
df1 <- as.data.frame(df1)
colnames(df1) <- c("a","b","c")
train <- df1[1:4,]
test <- df1[5:6,]
现在,当我们使用火车创建森林时,运行 predict()
测试如下...
forest1 <- randomForest(c~a+b,data=train,ntree=500)
test$prediction <- predict(forest1,test,type='response')
测试矩阵包含对 a = 'unwanted_char' 和 b = '4' 的最后一次观察的“1”预测。
请注意:当您分别创建测试和训练数据时,预测函数会抛出上述错误而不是进行预测。
我认为这是一个非常糟糕的例子;但是,这是答案:
您创建的 df1
只有因子变量和 4 个观察值。在这里,mtry
等于 1,这意味着大约 1/2 的树将仅基于 b
,1/2 仅基于 a
。当 b == "4"
时,分类始终为 1。IE- b == 4
完美预测 c
。同样 a == 1
完美预测 c == 0
。
当您在单个数据集中创建数据时,此方法起作用的原因是变量是因子变量,其中可能的水平存在于 train
和 test
中,尽管观察到的数量对于 train
中的某些级别 == 0。由于 "unwanted_char" 是 train$a
中的可能水平(尽管未观察到),因此您的预测没有问题。如果您将它们创建为单独的数据集,则因子变量将被明确创建并且 test
具有新水平。
也就是说,从本质上讲,您的问题之所以有效,是因为您不了解 R.
中的因子是如何工作的
predict.randomForest() 错误:训练数据中不存在新的因子水平
这个错误比较迷惑,你不妨把你需要预测的数据集和建模型的数据集绑定起来做预测。
post 带 rownum 的预测子集,简单且经过测试的方法
我同意 Alex 的看法,这不是一个很好的例子。
这是您问题的答案:
str(train)
如果您检查训练数据的结构,您会看到变量 'a' 具有所有 4 个级别,因为这些级别是在您创建数据帧 df1 时指定的。
当我通过拆分单个数据帧创建训练集和测试集并使用 randomForest
包构建随机森林时,对于训练数据中不存在的某些因子水平,predict()
函数仍然会抛出一个输出。虽然这没有给出任何错误(这是我在相关问题中寻找的),但我的问题是 randomForest()
模型在什么基础上预测该值,因为它理想情况下应该抛出以下错误...
Error in predict.randomForest() :
New factor levels not present in the training data
出于好奇想知道 randomForest()
方法是否对测试数据中的新因子水平做出了一些固有假设。
这是一个可重现的例子:
seq1 <- c(5,3,1,3,1,"unwanted_char",4,2,2,3,0,4,1,1,0,1,0,1)
df1 <- matrix(seq1,6)
df1 <- as.data.frame(df1)
colnames(df1) <- c("a","b","c")
train <- df1[1:4,]
test <- df1[5:6,]
现在,当我们使用火车创建森林时,运行 predict()
测试如下...
forest1 <- randomForest(c~a+b,data=train,ntree=500)
test$prediction <- predict(forest1,test,type='response')
测试矩阵包含对 a = 'unwanted_char' 和 b = '4' 的最后一次观察的“1”预测。
请注意:当您分别创建测试和训练数据时,预测函数会抛出上述错误而不是进行预测。
我认为这是一个非常糟糕的例子;但是,这是答案:
您创建的 df1
只有因子变量和 4 个观察值。在这里,mtry
等于 1,这意味着大约 1/2 的树将仅基于 b
,1/2 仅基于 a
。当 b == "4"
时,分类始终为 1。IE- b == 4
完美预测 c
。同样 a == 1
完美预测 c == 0
。
当您在单个数据集中创建数据时,此方法起作用的原因是变量是因子变量,其中可能的水平存在于 train
和 test
中,尽管观察到的数量对于 train
中的某些级别 == 0。由于 "unwanted_char" 是 train$a
中的可能水平(尽管未观察到),因此您的预测没有问题。如果您将它们创建为单独的数据集,则因子变量将被明确创建并且 test
具有新水平。
也就是说,从本质上讲,您的问题之所以有效,是因为您不了解 R.
中的因子是如何工作的predict.randomForest() 错误:训练数据中不存在新的因子水平
这个错误比较迷惑,你不妨把你需要预测的数据集和建模型的数据集绑定起来做预测。
post 带 rownum 的预测子集,简单且经过测试的方法
我同意 Alex 的看法,这不是一个很好的例子。
这是您问题的答案:
str(train)
如果您检查训练数据的结构,您会看到变量 'a' 具有所有 4 个级别,因为这些级别是在您创建数据帧 df1 时指定的。