首页 文章

随机森林混淆矩阵的误差

提问于
浏览
0

我有一个包含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 回答

  • 1

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

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

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

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

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

    上面的代码运行完美

    不总是;由于 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,那么这与预期完全一样 . 正如我上面解释的那样,你的混淆矩阵中的"missing entries"不是由于缺少预测,而是由于缺少真正的标签 .

相关问题