我有一个包含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$confusionp2 <- predict(fit1, test0)t <- table(prediction = p2, actual = test0$outputvar)t
上述代码运行得很完美。我提到的数据框只是一个样本数据框。因为我不能提供原始数据。
如你所见,我将训练数据和测试数据按70%和30%的比例进行了划分。根据我的观察,测试数据有1377个观测值,训练数据有3293个观测值。
当我计算测试数据集的混淆矩阵时,我发现它只计算了1363个观测值,剩下的14个观测值没有被计算在内。
此外,我可视化了使用测试数据集预测的矩阵。所有那些NA值都被替换成了”Yes”或”NO”。
我的疑问是,为什么我的混淆矩阵在观测值上存在差异?
那些在我的预测矩阵中被替换为”Yes”和”No”的NA值,是真实的预测吗?
我是R语言的新手,任何信息都会对我有帮助。
回答:
你似乎在几个基本问题上有些困惑…
首先,训练数据中缺少依赖变量(这里是outputvar
)是没有意义的;如果我们不知道某个样本的实际结果,我们就无法用它来进行训练,我们应该简单地将其从训练集中删除(除非使用一些极端的方法,在将样本输入分类器之前尝试进行插补)。
其次,尽管你似乎暗示(有点…)这里缺少outputvar
的两个样本是你试图预测的未知样本,但在实际操作中(即在你的代码中),你并没有这样使用它们:因为你用来将数据分割成训练和测试子集的sample
函数是随机的,很容易出现至少一个(甚至两个)这样的样本最终出现在你的训练集中,当然在那里它们是没有用的。
第三,即使在某些运行中这两个样本确实出现在你的测试集中,你当然也无法计算任何混淆矩阵,因为你确实需要真实标签(实际标签)来进行计算。
总的来说,像你这里最后两个样本一样没有真实标签的数据样本,既不能用于训练,也不能用于任何形式的评估,如混淆矩阵。它们既不能用于训练集,也不能用于测试集。
上述代码运行得很完美
并非总是如此;由于sample
函数的随机性质,你很容易得到使得分类器无法运行的训练/测试分割:
> source('~/.active-rstudio-document') # 你的代码原样Error in randomForest.default(m, y, ...) : Need at least two classes to do classification.> train0 outputvar inputvar1 inputvar21 Yes M 345 <NA> M 34
自己多次重新运行代码看看(由于没有设置随机种子,每次运行原则上都会不同——甚至训练和测试集的长度在不同运行之间都不会相同!)。
当我计算测试数据集的混淆矩阵时,我发现它只计算了1363个观测值,剩下的14个观测值没有被计算在内。
根据你展示的样本,一个合理的猜测是,你没有这14个观测值的真实标签。由于混淆矩阵来自于预测与实际标签的比较,当后者缺失时,比较是不可能的,这些样本自然会被从混淆矩阵中省略。
此外,我可视化了使用测试数据集预测的矩阵。所有那些NA值都被替换成了”Yes”或”NO”。
你在这里的意思不是很清楚;但如果你的意思是你在测试集上运行predict
并且在预测中没有得到任何NA值,这是完全符合预期的。正如我上面解释的,你的混淆矩阵中缺少的条目不是由于缺少预测,而是由于缺少真实标签。