朴素贝叶斯分类器(Naive Bayes Classifier)是借助贝叶斯定理,采用直接对联合概率P建模,以获得的概率值来判断目标分类的方法,在生命科学研究中应用相对广泛的一种方法。同时条件概率与贝叶斯定理也是生物统计中比较重要的章节。

1)条件概率(Conditional probability)

设A,B 是两个事件,且B不是不可能事件,则称P(A|B)是事件B发生的条件下,事件A发生的条件概率。

2)贝叶斯定理(Bayes’ theorem)

其中,

P(x|c) :是已知c发生后x的条件概率,似然概率
P(c|x) :是已知x发生后c的条件概率,后验概率
P(x) :先验概率
P(c) :边缘概率

3)分类步骤

i. 将表格转化为频率表

ii.计算似然概率

iii.利用Bayes计算每个分类的后验概率

4)优势

三个词总结就是:简单、便捷、速度快

5)在R语言中的应用

在R语言中,利用e1071包实现一个简单离散特征的朴素贝叶斯分类器,如下:


library(e1071)
library(pROC)

# 加载演示数据
set.seed(2020)
data(HouseVotes84, package = "mlbench")
data <- HouseVotes84

# 划分训练集测试集
index <- sample(nrow(HouseVotes84), nrow(HouseVotes84)*0.7, replace = TRUE)
train <- data[index, ]
test <- data[-index, ]

# 建模
model <- naiveBayes(Class ~ ., data = train)

# 预测
# type:raw 输出为概率,class输出为label
pred <- predict(model, test, type = "class")
# 输出混淆矩阵
table(pred, test$Class)
pred <- ordered(pred)

# 计算ROC,smooth做平滑处理
pre <- roc(test$Class, pred, smooth.method = "fitdistr", smooth = T)

# 绘图
x <- plot.roc(
  pre,
  smooth = F,
  lwd = 2,
  ylim = c(0, 1),
  xlim = c(1, 0),
  legacy.axes = T,
  main = "",
  col = "red",
  xaxs = "i",
  yaxs = "i",
  font = 2,
  font.lab = 2
)

# 添加图例
legend.name <- c(paste("AUC: ", sprintf("%.2f", x[["auc"]])))
legend(
  "bottomright",
  legend = legend.name,
  lwd = 2,
  col = c("red"),
  bty = "n"
)

混淆矩阵:

# 准确率:90%
              democrat       republican
   democrat        124          9
   republican       12         77

一个简单的分类器就结束了,当然本文还遗留了很多问题大家可以思考:

i.多分类问题的解决方案?

ii.数值预测以及ROC、AUC、平滑处理的方法、原理等?

这些留给感兴趣的读者来处理,网络上有很多相关的资料,此处也不再赘述,如果有疑问或者需要探讨欢迎给我留言。

参考资料:

1.http://ugrad.stat.ubc.ca/R/library/e1071/html/predict.naiveBayes.html

2.https://www.analyticsvidhya.com/blog/2017/09/naive-bayes-explained/