【问题标题】:Error in Confusion Matrix with Random Forest随机森林混淆矩阵中的错误
【发布时间】:2018-02-21 13:54:54
【问题描述】:

我有一个包含 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 都替换为 Yes 或 NO。

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

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

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

【问题讨论】:

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


    【解决方案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 都替换为 Yes 或 NO。

    不太清楚你在这里的确切意思;但是如果您的意思是您在测试集上运行 predict 并且您在预测中没有得到任何 NA,那么这完全符合预期。正如我上面解释的,混淆矩阵中的“缺失条目”不是由于缺少预测,而是由于缺少真实标签。

    【讨论】:

    • 非常感谢您详细解释我的所有疑问
    猜你喜欢
    • 2020-06-01
    • 2018-03-30
    • 2021-07-08
    • 2020-11-17
    • 2016-05-07
    • 2018-02-18
    • 2014-07-08
    • 2018-04-15
    • 2019-09-02
    相关资源
    最近更新 更多