我有一个包含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 回答
你对这里的几个基本问题似乎有些困惑......
首先,缺少因变量(这里是
outputvar
)的训练数据是没有意义的;如果我们没有样本的实际结果,我们就不能将它用于训练,我们应该简单地将它从训练集中移除(除了一些相当极端的方法,其中一个人试图在将这些样本送到分类) .其次,虽然你似乎暗示(有点......)你的2个样本缺少
outputvar
这里是你试图预测的未知样本,但在实践中(即在你的代码中)你并没有这样使用它们:因为sample
用于将数据分成训练和测试子集的功能是随机的,很容易就是这两个样本中至少有一个(甚至两个)最终出现在你的训练集中,当然它不会是使用 .第三,即使在某些运行中你最终确实使用了测试集中的这两个样本,你当然也无法计算任何混淆矩阵,因为你确实需要基本事实(真实标签)这样做 .
总而言之,没有真正标签的数据样本,如此处的最后两个,对于培训或任何类型的评估都没有用,例如混淆矩阵 . 它们不能在训练集或测试集中使用 .
不总是;由于
sample
函数的随机性,您可能很容易因为训练/测试分裂而导致分类器无法运行:尝试多次重新运行代码以查看(因为没有设置随机种子,每次运行原则上都是不同的 - 即使训练和测试集的长度在运行之间也不一样!) .
鉴于您作为样本展示的内容,这里的一个很好的猜测是您没有这14个观察的真实标签 . 并且由于混淆矩阵来自预测与实际标签的比较,当后者缺失时,比较是不可能的,并且这些样本自然地从混淆矩阵中省略 .
目前尚不清楚你的意思是什么;但如果你的意思是你在你的测试集上运行了
predict
并且你没有在预测中得到任何NA,那么这与预期完全一样 . 正如我上面解释的那样,你的混淆矩阵中的"missing entries"不是由于缺少预测,而是由于缺少真正的标签 .