贝叶斯分类算法是统计学的一种分类方法,它是一类利用贝叶斯定理为基础进行分类的算法。在许多场合,贝叶斯分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。本文主要介绍贝叶斯分类算法中最简单的一种:朴素贝叶斯算法(Naive Bayesian Model,NBM)的基础以及R语言实现。
一、朴素贝叶斯算法的基础
首先我们要了解几个概念:
设$X为m$维向量的集合,即 $X\subseteq\lbrace x_1,x_2,x_3,…\rbrace$,这里的$x_m$在日常业务中可以理解为各种特征集合,例如$x_m=\lbrace z_1,z_2,z_3,z_4,…\rbrace$,其中$z_1$表示年龄、$z_2$表示性别、$z_3$表示收入、$z_4$表示学历等等。
设$Y为n$维向量的集合,即$Y\subseteq\lbrace y_1,y_2,y_3,…\rbrace$,这里的$y_n$在日常业务中可以理解为目标的分类变量,例如违约和不违约、购买和不购买等目标分类。
这样由$X和Y$就构成我们的训练数据集:
$$
T=\lbrace(x_1,y_1),(x_2,y_2),…,(x_i,y_i)\rbrace
$$
先验概率是指根据以往经验和分析得到的概率,公式如下:
$$
P(Y=y_n)或P(X=x_m)
$$
$P(X=x_m|Y=y_n)$表示事件$Y=y_n$已经发生的前提下,事件$X=x_m$发生的概率,叫做事件$Y=y_n$发生下事件$X=x_m$的条件概率。条件概率的基本求解公式如下
$$
P(X=x_m|Y=y_n)=\frac{P(X=x_m & Y=y_n)}{P(Y=y_n)}
$$
在我们日常业务建模中,条件概率$P(X=x_m|Y=y_n)$和先验概率$P(Y=y_n)和P(X=x_m)$都可以根据历史数据求出,之后根据条件概率和先验概率就可以求出后验概率$P(Y=y_n|X=x_m)$,
这个求导的公式就是我们所说的贝叶斯定理:
$$
P(Y=y_n|X=x_m)=\frac{P(X=x_m|Y=y_n)P(Y=y_n)}{P(X=x_m)}
$$
后验概率$P(Y=y_n|X=x_m)$表示的是在特征集合$X=x_m$已经发生的前提下,目标变量$Y=y_n$发生的概率。
之前说过$x_m=\lbrace z_1,z_2,z_3,z_4,…\rbrace$,朴素贝叶斯模型假定$z_1,z_2,z_3,z_4,…$等特征是相互独立的,所以可以得到下面两个推导:
$$
P(X=x_m|Y=y_n)=P(z_1|Y=y_n)P(z_2|Y=y_n)P(z_3|Y=y_n)P(z_4|Y=y_n)…=\prod P(z_i|Y=y_n)
$$
$$
P(X=x_m)=P(z_1)P(z_2)P(z_3)P(z_4)…=\prod P(z_i)
$$
整理后的贝叶斯定理如下:
$$
P(Y=y_n|X=x_m)=\frac{\prod P(z_i|Y=y_n)P(Y=y_n)}{\prod P(z_i)}
$$
而朴素贝叶斯模型选择各个目标分类中概率最大的那个分类作为模型预测的分类。
对于连续变量的特征,例如身高、体重等特征,模型假设这些特征值服从正态分布。这样就可以求出连续变量取值为$z_i$的概率为:
$$
P(z_i|Y=y_n)=g(z_i,\eta_n,\sigma_n)=\frac{1}{\sqrt{2\pi}\sigma_n}e^{-\frac{(z_i-\eta_n)^2}{2\sigma_n^2}}
$$
其中$\eta_n$是$Y=y_n$条件下$z_i$特征的均值,$\sigma_n$是$Y=y_n$条件下$z_i$特征的标准差。此外,我们也可以对连续变量进行离散化,将其变成非连续变量进行计算。
另一个需要讨论的问题就是当$P(z_i|Y=y_n)=0$怎么办,当某个类别下某个特征项划分没有出现时,就会产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,把所有特征出现的次数都加上1,这样如果训练样本集数量充分大时,并不会对结果产生影响,并且解决了上述频率为0的尴尬局面。
二、朴素贝叶斯算法的R语言实现
使用的训练集数据是CDA数据挖掘课程的一个数据集,数据集记录了收入、学历、受欢迎程度、资产水平及相亲的结果。
orgData<-read.csv("date_data2.csv")
#提取如下字段进行建模
orgData1<-orgData[,c("income_rank","edueduclass","attractive_rank","assets_rank","Dated")]
orgData1$income_rank=as.factor(orgData1$income_rank)
orgData1$edueduclass=as.factor(orgData1$edueduclass)
orgData1$attractive_rank=as.factor(orgData1$attractive_rank)
orgData1$assets_rank=as.factor(orgData1$assets_rank)
orgData1$Dated=as.factor(orgData1$Dated)
建立朴素贝叶斯模型
library(bnlearn)
bn=naive.bayes(orgData1,"Dated")
使用建立好的模型进行预测
pred = predict(bn,orgData1,prob = T)
模型预测分类输出
orgData1$out=pred
模型预测概率输出
orgData1$pred0=attr(pred,"prob")[1,]#目标变量为0的概率
orgData1$pred1=attr(pred,"prob")[2,]#目标变量为1的概率
打印混淆矩阵
> confusionMatrix(orgData1$out,orgData1$Dated)
Confusion Matrix and Statistics
Reference
Prediction 0 1
0 45 4
1 5 46
Accuracy : 0.91
95% CI : (0.836, 0.958)
No Information Rate : 0.5
P-Value [Acc > NIR] : <2e-16
Kappa : 0.82
Mcnemar's Test P-Value : 1
Sensitivity : 0.9000
Specificity : 0.9200
Pos Pred Value : 0.9184
Neg Pred Value : 0.9020
Prevalence : 0.5000
Detection Rate : 0.4500
Detection Prevalence : 0.4900
Balanced Accuracy : 0.9100
'Positive' Class : 0
打印后验概率表
rule=orgData1 %>% distinct(income_rank,edueduclass,attractive_rank,assets_rank,pred1, .keep_all = FALSE)
版权声明:本文为大枫原创文章,转载请注明来源。