数据分析 | 朴素贝叶斯模型

一、贝叶斯理论

通过已知类别的训练数据集,计算样本的先验概率,然后利用贝叶斯概率公式测算未知类别样本属于某个类别的后验概率,最终以后验概率所对应的类别作为样本的预测值。

贝叶斯公式:
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(CiX)=argmaxi=1kP(Ci)P(XCi)P(Ci)P(XCi)
分母 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(XCi) 是一个常量,它与样本属于哪个类别没有直接关系,所以计算 P ( C i ∣ X ) P(C_i|X) P(CiX)的最大值就是计算分子的最大值,即 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(XCi)

在大多数情况下, 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(XCi)=P(x1,x2,,xpCi)
假设各个自变量是相互独立的,则上述公式可继续改写为:
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(XCi)=P(x1Ci)P(x2Ci)P(xpCi)

二、常见分类器

01 高斯贝叶斯分类器

若数据集中的自变量X均为连续型的数值型,则在计算 P ( X ∣ C i ) P(X|C_i) P(XCi)​ 时会假设自变量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(xjCi)=aπ σji1exp(2σji2(xjμji2))

02 多项式贝叶斯分类器

若数据集中自变量X均为离散型变量。在计算概率值 P ( X ∣ C i ) P(X|C_i) P(XCi) 时,会假设自变量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=xjkCi)=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(XCi)时,会假设自变量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(xjCi)=pxj+(1p)(1xj)
其中, 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=1Ci)=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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ouroboroszzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值