随机森林混淆矩阵的错误
Error in Confusion Matrix with Random Forest
我有一个包含 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$confusion
p2 <- predict(fit1, test0)
t <- table(prediction = p2, actual = test0$outputvar)
t
以上代码运行完美。我提到的数据框只是一个示例数据框。因为,我不应该生成原始数据。
如你所见,我将训练数据和测试数据分成了 70% 和 30%。
根据我的观察,我可以找到 1377 个观察的测试数据和 3293 个观察的训练。
当我计算测试数据集的混淆矩阵时,我发现它只计算了 1363 个观察值,还剩下 14 个观察值。
此外,我用测试数据集可视化了预测矩阵的 table。
所有这些 NA 都替换为 Yes 或 NO。
我的疑问是,为什么我的混淆矩阵在观察中有差异?
是否在我的预测矩阵中替换了那些 NA,因为 Yes 和 No 是真实的预测?
我是 R 的新手,任何信息都会有所帮助
你似乎对这里的几个基本问题有点困惑...
首先,缺少 dependent 变量(这里是 outputvar
)的训练数据毫无意义;如果我们没有样本的实际结果,我们就不能用它来训练,我们应该简单地将它从训练集中删除(除了一些相当极端的方法,在这种方法中,人们试图在将这些样本提供给分类器)。
其次,虽然你似乎暗示(有点......)你的 2 个样本缺少 outputvar
这里是你试图预测的未知样本,但在实践中(即在你的代码中)你没有这样使用它们:由于用于将数据拆分为训练和测试子集的 sample
函数是随机的,因此很容易出现这两个样本中至少一个(甚至两个)最终出现的情况在你的 training 集合中,当然它是没有用的。
第三,即使在某些 运行 中你确实在测试集中得到了这两个样本,你当然不能计算任何混淆矩阵,因为你确实需要基本事实(真实标签)为此。
总而言之,没有真实标签的数据样本,就像您这里的最后两个样本,既不能用于训练也不能用于任何类型的评估,例如混淆矩阵。它们既不能用于训练集,也不能用于测试集。
The above code runs perfectly
不总是;由于 sample
函数的随机性,您可能很容易以 train/test 分裂结束,这使得分类器无法 运行:
> 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
尝试re-run代码自己看几次(因为没有设置随机种子,每个运行原则上都会不同 - 即使是length 你的训练集和测试集在 运行s 之间是不一样的!)。
When I am calculating my Confusion matrix for test data set, I could find that it has calculated only for 1363 observations and 14 observations are left.
鉴于您作为示例显示的内容,这里可以很好地猜测您没有这 14 个观察值的真实标签。并且由于混淆矩阵来自预测与实际标签的比较,当缺少后者时,比较是不可能的,这些样本自然会从混淆矩阵中省略。
Also, I visualised the table for the predicted matrix with test data set. All those NA are replaced with Yes or NO.
不太清楚你在这里的意思;但是如果你的意思是你在你的测试集上 运行 predict
而你没有在预测中得到任何 NAs,这完全符合预期。正如我上面所解释的,混淆矩阵中的 "missing entries" 不是由于缺少预测,而是由于缺少真实标签。
我有一个包含 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$confusion
p2 <- predict(fit1, test0)
t <- table(prediction = p2, actual = test0$outputvar)
t
以上代码运行完美。我提到的数据框只是一个示例数据框。因为,我不应该生成原始数据。
如你所见,我将训练数据和测试数据分成了 70% 和 30%。 根据我的观察,我可以找到 1377 个观察的测试数据和 3293 个观察的训练。
当我计算测试数据集的混淆矩阵时,我发现它只计算了 1363 个观察值,还剩下 14 个观察值。
此外,我用测试数据集可视化了预测矩阵的 table。 所有这些 NA 都替换为 Yes 或 NO。
我的疑问是,为什么我的混淆矩阵在观察中有差异?
是否在我的预测矩阵中替换了那些 NA,因为 Yes 和 No 是真实的预测?
我是 R 的新手,任何信息都会有所帮助
你似乎对这里的几个基本问题有点困惑...
首先,缺少 dependent 变量(这里是 outputvar
)的训练数据毫无意义;如果我们没有样本的实际结果,我们就不能用它来训练,我们应该简单地将它从训练集中删除(除了一些相当极端的方法,在这种方法中,人们试图在将这些样本提供给分类器)。
其次,虽然你似乎暗示(有点......)你的 2 个样本缺少 outputvar
这里是你试图预测的未知样本,但在实践中(即在你的代码中)你没有这样使用它们:由于用于将数据拆分为训练和测试子集的 sample
函数是随机的,因此很容易出现这两个样本中至少一个(甚至两个)最终出现的情况在你的 training 集合中,当然它是没有用的。
第三,即使在某些 运行 中你确实在测试集中得到了这两个样本,你当然不能计算任何混淆矩阵,因为你确实需要基本事实(真实标签)为此。
总而言之,没有真实标签的数据样本,就像您这里的最后两个样本,既不能用于训练也不能用于任何类型的评估,例如混淆矩阵。它们既不能用于训练集,也不能用于测试集。
The above code runs perfectly
不总是;由于 sample
函数的随机性,您可能很容易以 train/test 分裂结束,这使得分类器无法 运行:
> 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
尝试re-run代码自己看几次(因为没有设置随机种子,每个运行原则上都会不同 - 即使是length 你的训练集和测试集在 运行s 之间是不一样的!)。
When I am calculating my Confusion matrix for test data set, I could find that it has calculated only for 1363 observations and 14 observations are left.
鉴于您作为示例显示的内容,这里可以很好地猜测您没有这 14 个观察值的真实标签。并且由于混淆矩阵来自预测与实际标签的比较,当缺少后者时,比较是不可能的,这些样本自然会从混淆矩阵中省略。
Also, I visualised the table for the predicted matrix with test data set. All those NA are replaced with Yes or NO.
不太清楚你在这里的意思;但是如果你的意思是你在你的测试集上 运行 predict
而你没有在预测中得到任何 NAs,这完全符合预期。正如我上面所解释的,混淆矩阵中的 "missing entries" 不是由于缺少预测,而是由于缺少真实标签。