如何生成混淆矩阵并找到朴素贝叶斯分类器的错误分类率?

Posted

技术标签:

【中文标题】如何生成混淆矩阵并找到朴素贝叶斯分类器的错误分类率?【英文标题】:How to produce a confusion matrix and find the misclassification rate of the Naïve Bayes Classifier? 【发布时间】:2018-02-14 05:41:41 【问题描述】:

使用 R 中的 iris 数据集,我试图将一个朴素贝叶斯分类器拟合到 iris 训练数据中,这样我就可以为朴素贝叶斯分类器生成训练数据集(预测与实际)的混淆矩阵,什么是朴素贝叶斯分类器的误分类率?

到目前为止,这是我的代码:

 iris$spl=sample.split(iris,SplitRatio=0.8)
 train=subset(iris, iris$spl==TRUE)
 test=subset(iris, iris$spl==FALSE)

 iris.nb <- naiveBayes(Species~.,data = train)
 iris.nb

 nb_test_predict <- predict(iris.nb, train)

关于如何解决这个问题的任何建议?

【问题讨论】:

在 R 中有不止一种 naiveBayes 实现。您使用的是哪一种?请在您的代码中包含library 语句。您还应该包含 sample.split 的包。 【参考方案1】:

你似乎在寻找table函数

library(e1071)
library(caTools)
spl=sample.split(iris$Species,SplitRatio=0.8)
train=subset(iris, spl==TRUE)
test=subset(iris, spl==FALSE)

iris.nb <- naiveBayes(Species~.,data = train)
iris.nb

nb_train_predict <- predict(iris.nb, train[,!names(train) %in% "Species"])
table(nb_train_predict,train$Species)

输出是

nb_train_predict setosa versicolor virginica
      setosa         40          0         0
      versicolor      0         38         4
      virginica       0          2        36

误分类率可以计算为

mean(nb_train_predict != train$Species)

【讨论】:

For: nb_train_predict [.default(object$tables[[v]], , nd + islogical[attribs[v]]) : 下标越界 使用rm(list=ls(all=TRUE))删除所有现有变量,然后尝试运行上面的代码。它应该运行干净。 删除物种列:nb_train_predict &lt;- predict(iris.nb, test[ , names(test) != "Species"]) 运行代码时仍然出现错误:nb_train_predict @CABurns 请参考更新后的代码,如果它仍然抛出错误,请告诉我。【参考方案2】:

caret 包含confusionMatrix 函数,该函数返回一个非常完整的输出。

library(e1071)
library(caTools)
library(caret)

iris$spl = sample.split(iris, SplitRatio = 0.8)
train <- subset(iris, iris$spl == TRUE)
test <- subset(iris, iris$spl == FALSE)

iris.nb <- naiveBayes(Species ~ ., data = train)

nb_train_predict <- predict(iris.nb, test[ , names(test) != "Species"])

cfm <- confusionMatrix(nb_train_predict, test$Species)
cfm

# Confusion Matrix and Statistics
# 
# Reference
# Prediction   setosa versicolor virginica
# setosa         17          0         0
# versicolor      0         14         1
# virginica       0          2        16
# 
# Overall Statistics
# 
# Accuracy : 0.94            
# 95% CI : (0.8345, 0.9875)
# No Information Rate : 0.34            
# P-Value [Acc > NIR] : < 2.2e-16       
# 
# Kappa : 0.9099          
# Mcnemar's Test P-Value : NA              
# 
# Statistics by Class:
# 
#                      Class: setosa Class: versicolor Class: virginica
# Sensitivity                   1.00            0.8750           0.9412
# Specificity                   1.00            0.9706           0.9394
# Pos Pred Value                1.00            0.9333           0.8889
# Neg Pred Value                1.00            0.9429           0.9688
# Prevalence                    0.34            0.3200           0.3400
# Detection Rate                0.34            0.2800           0.3200
# Detection Prevalence          0.34            0.3000           0.3600
# Balanced Accuracy             1.00            0.9228           0.9403

将混淆矩阵显示为ggplot图形:

library(ggplot2)
library(scales)

ggplotConfusionMatrix <- function(m)
  mytitle <- paste("Accuracy", percent_format()(m$overall[1]),
                   "Kappa", percent_format()(m$overall[2]))
  p <-
    ggplot(data = as.data.frame(m$table) ,
           aes(x = Reference, y = Prediction)) +
    geom_tile(aes(fill = log(Freq)), colour = "white") +
    scale_fill_gradient(low = "white", high = "steelblue") +
    geom_text(aes(x = Reference, y = Prediction, label = Freq)) +
    theme(legend.position = "none") +
    ggtitle(mytitle)
  return(p)


ggplotConfusionMatrix(cfm)

【讨论】:

以上是关于如何生成混淆矩阵并找到朴素贝叶斯分类器的错误分类率?的主要内容,如果未能解决你的问题,请参考以下文章

朴素贝叶斯应用:垃圾邮件分类

朴素贝叶斯应用:垃圾邮件分类

朴素贝叶斯应用:垃圾邮件分类

高斯朴素贝叶斯分类

如何在垃圾邮件过滤中嵌入带有朴素贝叶斯分类器的关联规则?

学习如何在 SSAS 中实现朴素贝叶斯分类器的最佳资源是啥?