朴素贝叶斯分类器(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/