混淆矩阵与随机森林中的错误

时间:2018-02-21 13:54:55

标签: r machine-learning random-forest confusion-matrix

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

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

使用我的最新数据,我的输出变量为“是”,“否”和“”。

我想预测这个“”是否会有“是”或“否”。

我正在使用以下代码。

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个观测值。

此外,我使用测试数据集将表格显示为预测矩阵。 所有那些NA都替换为是或否。

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

这些NA是否在我的预测矩阵中被替换为是和否是真实的预测?

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

1 个答案:

答案 0 :(得分:1)

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

首先,缺少依赖变量(此处为outputvar)的训练数据毫无意义;如果我们没有样本的实际结果,我们就不能将它用于训练,我们应该简单地将它从训练集中移除(除了一些相当极端的方法,其中一个人试图在将这些样本送到分类器)。

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

第三,即使在某些运行中你最终确实使用了测试集中的这两个样本,你当然也无法计算任何混淆矩阵,因为你确实需要基础事实(真实标签)这样做。

总而言之,没有真正标签的数据样本(如此处的最后两个)对于培训和任何类型的评估都没有用,例如混淆矩阵。它们不能在训练集或测试集中使用。

  

以上代码运行完美

并非总是如此;由于sample函数的随机性,您可能很容易最终得到使分类器无法运行的训练/测试分裂:

> 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

尝试多次重新运行代码以查看(因为没有设置随机种子,每次运行原则上会有所不同 - 甚至训练和测试集的长度也不会在跑步之间是一样的!)。

  

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

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

  

此外,我使用测试数据集将表格显示为预测矩阵。所有那些NA都替换为是或否。

目前尚不清楚你的意思是什么;但是如果你的意思是你在测试集上运行predict并且你没有在预测中获得任何NA,那么这与预期完全一样。正如我上面解释的那样,混淆矩阵中的“缺失条目”不是由于缺少预测,而是由于缺少真正的标签。