一、贝叶斯理论
通过已知类别的训练数据集,计算样本的先验概率,然后利用贝叶斯概率公式测算未知类别样本属于某个类别的后验概率,最终以后验概率所对应的类别作为样本的预测值。
贝叶斯公式:
y
=
f
(
X
)
=
P
(
C
i
∣
X
)
=
a
r
g
m
a
x
P
(
C
i
)
P
(
X
∣
C
i
)
∑
i
=
1
k
P
(
C
i
)
P
(
X
∣
C
i
)
y=f(X)=P(C_i|X)=argmax\frac{P(C_i)P(X|C_i)}{\sum_{i=1}^kP(C_i)P(X|C_i)}
y=f(X)=P(Ci∣X)=argmax∑i=1kP(Ci)P(X∣Ci)P(Ci)P(X∣Ci)
分母
P
(
X
)
=
∑
i
=
1
k
P
(
C
i
)
P
(
X
∣
C
i
)
P(X)=\sum_{i=1}^kP(C_i)P(X|C_i)
P(X)=∑i=1kP(Ci)P(X∣Ci) 是一个常量,它与样本属于哪个类别没有直接关系,所以计算
P
(
C
i
∣
X
)
P(C_i|X)
P(Ci∣X)的最大值就是计算分子的最大值,即
a
r
g
m
a
x
P
(
C
i
)
P
(
X
∣
C
i
)
argmax\ P(C_i)P(X|C_i)
argmax P(Ci)P(X∣Ci);
在大多数情况下, P ( C i ) P(C_i) P(Ci)是已知的,它以训练数据集中类别 C i C_i Ci的频率作为先验频率,可以表示为 N C i / N N_{C_i}/N NCi/N。
假设数据集一共包含p个自变量,则X可以表示成
(
x
1
,
x
2
,
⋯
,
x
p
)
(x_1,x_2,\cdots,x_p)
(x1,x2,⋯,xp),进而条件概率可表示为:
P
(
X
∣
C
i
)
=
P
(
x
1
,
x
2
,
⋯
,
x
p
∣
C
i
)
P(X|C_i)=P(x_1,x_2,\cdots,x_p|C_i)
P(X∣Ci)=P(x1,x2,⋯,xp∣Ci)
假设各个自变量是相互独立的,则上述公式可继续改写为:
P
(
X
∣
C
i
)
=
P
(
x
1
∣
C
i
)
P
(
x
2
∣
C
i
)
⋯
P
(
x
p
∣
C
i
)
P(X|C_i)=P(x_1|C_i)P(x_2|C_i)\cdots P(x_p|C_i)
P(X∣Ci)=P(x1∣Ci)P(x2∣Ci)⋯P(xp∣Ci)
二、常见分类器
01 高斯贝叶斯分类器
若数据集中的自变量X均为连续型的数值型,则在计算
P
(
X
∣
C
i
)
P(X|C_i)
P(X∣Ci) 时会假设自变量X服从高斯正态分布,所以自变量X的条件概率可表示为:
P
(
x
j
∣
C
i
)
=
1
a
π
σ
j
i
e
x
p
(
−
(
x
j
−
μ
j
i
2
)
2
σ
j
i
2
)
P(x_j|C_i)=\frac{1}{\sqrt{a\pi}\sigma_{ji}}exp(-\frac{(x_j-\mu_{ji}^2)}{2\sigma_{ji}^2})
P(xj∣Ci)=aπσji1exp(−2σji2(xj−μji2))
02 多项式贝叶斯分类器
若数据集中自变量X均为离散型变量。在计算概率值
P
(
X
∣
C
i
)
P(X|C_i)
P(X∣Ci) 时,会假设自变量X的条件概率满足多项式分布,故概率值的计算公式可表示为:
P
(
x
j
=
x
j
k
∣
C
i
)
=
N
i
k
+
α
N
i
+
n
α
P(x_j=x_{jk}|C_i)=\frac{N_{ik}+\alpha}{N_i}+n\alpha
P(xj=xjk∣Ci)=NiNik+α+nα
其中,
x
j
k
x_{jk}
xjk表示自变量
x
j
x_j
xj的取值;
N
i
k
N_{ik}
Nik表示因变量为类别
C
i
C_i
Ci时自变量
x
j
x_j
xj取
x
j
k
x_{jk}
xjk的样本个数;
N
i
N_i
Ni表示数据集中类别
C
i
C_i
Ci的样本个数;
α
\alpha
α为平滑系数,用于防止概率值取0的可能,通常将该值取1,表示对概率做拉普拉斯平滑;
n
n
n表示因变量的类别个数。
03 伯努力贝叶斯分类器
当数据集中的自变量X均为0-1二元值时,通常会优先选择伯努利贝叶斯分类器。利用该分类器计算概率值
P
(
X
∣
C
i
)
P(X|C_i)
P(X∣Ci)时,会假设自变量X的条件概率满足伯努利分布:
P
(
x
j
∣
C
i
)
=
p
x
j
+
(
1
−
p
)
(
1
−
x
j
)
P(x_j|C_i)=px_j+(1-p)(1-x_j)
P(xj∣Ci)=pxj+(1−p)(1−xj)
其中,
x
j
x_j
xj为第j个自变量,取值为0或1,;p表示类别为
C
i
C_i
Ci时自变量取1的概率,该概率值可以使用经验频率代替。
p
=
P
(
x
j
=
1
∣
C
i
)
=
N
x
j
+
α
N
i
+
n
α
p=P(x_j=1|C_i)=\frac{N_{xj}+\alpha}{N_i+n\alpha}
p=P(xj=1∣Ci)=Ni+nαNxj+α
三、代码实现
01 高斯
# 导入第三方包
import pandas as pd
# 读入数据
skin = pd.read_excel(r'Skin_Segment.xlsx')
# 设置正例和负例
skin.y = skin.y.map({2:0,1:1})
# 导入第三方模块
from sklearn import model_selection
# 样本拆分
X_train,X_test,y_train,y_test = model_selection.train_test_split(skin.iloc[:,:3], skin.y,
test_size = 0.25, random_state=1234)
# 导入第三方模块
from sklearn import naive_bayes
# 调用高斯朴素贝叶斯分类器的“类”
gnb = naive_bayes.GaussianNB()
# 模型拟合
gnb.fit(X_train, y_train)
# 模型在测试数据集上的预测
gnb_pred = gnb.predict(X_test)
# 各类别的预测数量
pd.Series(gnb_pred).value_counts()
# 导入第三方包
from sklearn import metrics
import matplotlib.pyplot as plt
import seaborn as sns
# 构建混淆矩阵
cm = pd.crosstab(gnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()
print('模型的准确率为:\n',metrics.accuracy_score(y_test, gnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test, gnb_pred))
模型的准确率为:
0.922957643026
模型的评估报告:
precision recall f1-score support
0 0.93 0.97 0.95 48522
1 0.88 0.73 0.80 12743
avg / total 0.92 0.92 0.92 61265
02 多项式
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
- alpha:用于指定平滑系数a的值,默认为1.0
- fit_prior:是否以数据集中各类别的比例作为 P ( C i ) P(Ci) P(Ci)的先验概率,默认为True
- class_prior:用于人工指定各类别的先验概率 P ( C i ) P(C_i) P(Ci),若指定该参数,则参数fit_prior不再有效
# 导入第三方包
import pandas as pd
# 读取数据
mushrooms = pd.read_csv(r'mushrooms.csv')
# 数据的前5行
mushrooms.head()
# 将字符型数据作因子化处理,将其转换为整数型数据
columns = mushrooms.columns[1:]
for column in columns:
mushrooms[column] = pd.factorize(mushrooms[column])[0]
mushrooms.head()
from sklearn import model_selection
# 将数据集拆分为训练集合测试集
Predictors = mushrooms.columns[1:]
X_train,X_test,y_train,y_test = model_selection.train_test_split(mushrooms[Predictors], mushrooms['type'],
test_size = 0.25, random_state = 10)
from sklearn import naive_bayes
from sklearn import metrics
import seaborn as sns
import matplotlib.pyplot as plt
# 构建多项式贝叶斯分类器的“类”
mnb = naive_bayes.MultinomialNB()
# 基于训练数据集的拟合
mnb.fit(X_train, y_train)
# 基于测试数据集的预测
mnb_pred = mnb.predict(X_test)
# 构建混淆矩阵
cm = pd.crosstab(mnb_pred,y_test)
# 绘制混淆矩阵图
sns.heatmap(cm, annot = True, cmap = 'GnBu', fmt = 'd')
# 去除x轴和y轴标签
plt.xlabel('Real')
plt.ylabel('Predict')
# 显示图形
plt.show()
# 模型的预测准确率
print('模型的准确率为:\n',metrics.accuracy_score(y_test, mnb_pred))
print('模型的评估报告:\n',metrics.classification_report(y_test, mnb_pred))
模型的准确率为:
0.870014771049
模型的评估报告:
precision recall f1-score support
edible 0.85 0.92 0.88 1072
poisonous 0.90 0.82 0.86 959
avg / total 0.87 0.87 0.87 2031