随机森林混淆矩阵的错误

Error in Confusion Matrix with Random Forest

我有一个包含 4669 个观测值和 15 个变量的数据集。

我正在使用随机森林来预测特定产品是否会被接受。

根据我的最新数据,我的输出变量有 "Yes"、"NO" 和“”。

我想预测这个 "" 是 Yes 还是 No。

我正在使用以下代码。

library(randomForest)

outputvar <- c("Yes", "NO", "Yes", "NO", "" , "" )
inputvar1 <- c("M", "M", "F", "F", "M", "F")
inputvar2 <- c("34", "35", "45", "60", "34", "23")
data <- data.frame(cbind(outputvar, inputvar1, inputvar2))
data$outputvar <- factor(data$outputvar, exclude = "")
ind0 <- sample(2, nrow(data), replace = TRUE, prob = c(0.7,0.3))
train0 <- data[ind0==1, ]
test0 <-  data[ind0==2, ]

fit1 <- randomForest(outputvar~., data=train0, na.action = na.exclude)
print(fit1)
plot(fit1)
p1 <- predict(fit1, train0)
fit1$confusion

p2 <- predict(fit1, test0)

t <- table(prediction = p2, actual = test0$outputvar)
t

以上代码运行完美。我提到的数据框只是一个示例数据框。因为,我不应该生成原始数据。

如你所见,我将训练数据和测试数据分成了 70% 和 30%。 根据我的观察,我可以找到 1377 个观察的测试数据和 3293 个观察的训练。

当我计算测试数据集的混淆矩阵时,我发现它只计算了 1363 个观察值,还剩下 14 个观察值。

此外,我用测试数据集可视化了预测矩阵的 table。 所有这些 NA 都替换为 Yes 或 NO。

我的疑问是,为什么我的混淆矩阵在观察中有差异?

是否在我的预测矩阵中替换了那些 NA,因为 Yes 和 No 是真实的预测?

我是 R 的新手,任何信息都会有所帮助

你似乎对这里的几个基本问​​题有点困惑...

首先,缺少 dependent 变量(这里是 outputvar)的训练数据毫无意义;如果我们没有样本的实际结果,我们就不能用它来训练,我们应该简单地将它从训练集中删除(除了一些相当极端的方法,在这种方法中,人们试图在将这些样本提供给分类器)。

其次,虽然你似乎暗示(有点......)你的 2 个样本缺少 outputvar 这里是你试图预测的未知样本,但在实践中(即在你的代码中)你没有这样使用它们:由于用于将数据拆分为训练和测试子集的 sample 函数是随机的,因此很容易出现这两个样本中至少一个(甚至两个)最终出现的情况在你的 training 集合中,当然它是没有用的。

第三,即使在某些 运行 中你确实在测试集中得到了这两个样本,你当然不能计算任何混淆矩阵,因为你确实需要基本事实(真实标签)为此。

总而言之,没有真实标签的数据样本,就像您这里的最后两个样本,既不能用于训练也不能用于任何类型的评估,例如混淆矩阵。它们既不能用于训练集,也不能用于测试集。

The above code runs perfectly

不总是;由于 sample 函数的随机性,您可能很容易以 train/test 分裂结束,这使得分类器无法 运行:

> source('~/.active-rstudio-document')  # your code verbatim
Error in randomForest.default(m, y, ...) : 
  Need at least two classes to do classification.
> train0
  outputvar inputvar1 inputvar2
1       Yes         M        34
5      <NA>         M        34

尝试re-run代码自己看几次(因为没有设置随机种子,每个运行原则上都会不同 - 即使是length 你的训练集和测试集在 运行s 之间是不一样的!)。

When I am calculating my Confusion matrix for test data set, I could find that it has calculated only for 1363 observations and 14 observations are left.

鉴于您作为示例显示的内容,这里可以很好地猜测您没有这 14 个观察值的真实标签。并且由于混淆矩阵来自预测与实际标签的比较,当缺少后者时,比较是不可能的,这些样本自然会从混淆矩阵中省略。

Also, I visualised the table for the predicted matrix with test data set. All those NA are replaced with Yes or NO.

不太清楚你在这里的意思;但是如果你的意思是你在你的测试集上 运行 predict 而你没有在预测中得到任何 NAs,这完全符合预期。正如我上面所解释的,混淆矩阵中的 "missing entries" 不是由于缺少预测,而是由于缺少真实标签。