当前位置:   article > 正文

python朴素贝叶斯分类器_数据挖掘-朴素贝叶斯分类器

python 构建贝叶斯分类器 身高体重

71b565ce8461e75282760e90e400be77.png

英文相关文献地址:Naive Bayes Classifiers

中文翻译参考地址:朴素贝叶斯分类器(Naive Bayes Classifiers)

本文不是转载,是从学生的角度对上课内容的重新定位,希望对从事数据分析的同学有帮助

贝叶斯原理诞生的数学逻辑
一般而言当我们从上帝视角去计算事件的概率时,我们会能很容易的计算出事件的概率

4d3d66d0f86431908d64b63d97949f4f.png

比如我们已经知道袋子里面有N 个球,不是黑球就是白球,其中M个是黑球,那么把手伸进去摸一个球,就能知道摸出黑球的概率是多少 => 这种情况往往是上帝视角,即了解了事情的全貌再做判断

贝叶斯则从实际场景出发,提了一个问题:如果我们事先不知道袋子里面黑球和白球的比例,而是通过我们摸出来的球的颜色,能判断出袋子里面黑白球的比例么?

在学习贝叶斯原理之前我们来了解相关的概念

  • 先验概率,通过经验来判断事情发生的概率
  • 后验概率,就是发生结果之后,推测原因的概率
  • 条件概率,事件A 在另外一个事件B已经发生条件下的发生概率,表示为P(A|B)
  • 似然函数,把概率模型的训练过程理解为求参数估计的过程

经过推导,贝叶斯推理告诉我们后验概率是与先验概率和似然函数成正比得,即

ff3a9b41d75f351490be8c84f46d22d1.png

那么这个公式是如何推导的呢?

如果A B 2个事件同时发生 我们计为

equation?tex=%5C%5B%7Bp+%5Cleft%28+AB+%5Cright%29+%7D%5C%5D

对于事件AB同时发生我们可以从2个角度来看 先发生A 和先发生B

equation?tex=%5C%5B%7Bp+%5Cleft%28+AB+%5Cleft%29+%3DP+%5Cleft%28+B+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

equation?tex=%5C%5B%7Bp+%5Cleft%28+AB+%5Cleft%29+%3DP+%5Cleft%28+A+%5Cleft%29+P+%5Cleft%28+B+%5Cleft%7C+A+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

对上述公式进行变形可以得到--贝叶斯原理

equation?tex=%5C%5B%7BP+%5Cleft%28+A+%5Cleft%7C+B+%5Cleft%29+%3D%5Cfrac%7B%7BP+%5Cleft%28+B+%5Cleft%7C+A+%5Cleft%29+P+%5Cleft%28+A+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%7D%7D%7B%7BP+%5Cleft%28+B+%5Cright%29+%7D%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

7880600d23b01674c37609548b440f42.png

贝叶斯问题的实际应用

假设有一种病叫做“贝叶死”,它的发病率是万分之一,即10000 人中会有1个人得病。现有一种测试可以检验一个人是否得病的准确率是99.9%,误报率(假阳)是0.1%,那么,如果一个人被查出来患有“叶贝死”,实际上患有的可能性有多大?

贝叶斯原理就是求解后验概率,假设:A 表示事件 “测出为阳性”, B1 表示“患有贝叶死”, B2 表示“没有患贝叶死”

患有贝叶死的情况下,测出为阳性的概率为P(A|B1)=99.9%

没有患贝叶死,但测出为阳性的概率为P(A|B2)=0.1%

患有贝叶死的概率为 P(B1)=0.01%

没有患贝叶死的概率P(B2)=99.99%

那么我们检测出来为阳性,而且是贝叶死的概率P(B1,A)=P(B1)*P(A|B1)=0.01%*99.9%=0.00999% ≈0.01%

P(B1,A)代表的是联合概率,同样我们可以求得P(B2,A)=P(B2)*P(A|B2)=99.99%*0.1%=0.09999% ≈0.1%

检查为阳性的情况下,患有贝叶死的概率,即P(B1|A)

equation?tex=%5C%5B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7D+%5Cleft%7C+A+%5Cleft%29+%3D%5Cfrac%7B%7B0.01%5Ctext%7B%25%7D%7D%7D%7B%7B0.01%5Ctext%7B%25%7D%2B0.1%5Ctext%7B%25%7D%7D%7D+%5Capprox+9%5Ctext%7B%25%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

检查出是阳性的条件下,但没有患有贝叶死的概率为

equation?tex=%5C%5B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7D+%5Cleft%7C+A+%5Cleft%29+%3D%5Cfrac%7B%7B0.1%5Ctext%7B%25%7D%7D%7D%7B%7B0.01%5Ctext%7B%25%7D%2B0.1%5Ctext%7B%25%7D%7D%7D+%5Capprox+90.9%5Ctext%7B%25%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

因此我们可以总结出

equation?tex=%5C%5B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%7C+A+%5Cleft%29+%3D%5Cfrac%7B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%7D%7D%7B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7D+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7D+%5Cleft%29+%2BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7D+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7D+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%5Cright.+%7D%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

从而我们可以得到通用的贝叶斯公式

equation?tex=%5C%5B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%7C+A+%5Cleft%29+%3D%5Cfrac%7B%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%7D%7D%7B%7B%7B%5Cmathop%7B+%5Csum+%7D%5Climits_%7B%7Bi%3D1%7D%7D%5E%7B%7Bn%7D%7D%7BP+%5Cleft%28+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%29+P+%5Cleft%28+A+%5Cleft%7C+B%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%7D%7D%7D%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

朴素贝叶斯:

  • 一种简单但极为强大的预测建模算法
  • 假设每个输入变量是独立的。这是一个强硬的假设,实际情况并不一定,但是这项技术对于绝大部分的复杂问题仍然非常有效

朴素贝叶斯模型由两种类型的概率组成:

  • 每个类别的概率P(Cj)
  • 每个属性的条件概率P(Ai|Cj)

训练朴素贝叶斯模型的过程:

  • Step1:先给出训练数据,以及这些数据对应的分类
  • Step2,计算类别概率和条件概率
  • Step3,使用概率模型(基于贝叶斯原理)对新数据进行预测

朴素贝叶斯分类器的应用:

如果我们现在有这样一组数据

eba361ddefa1604342dd4174f15c1d7a.png

如何根据身高,体重,鞋码,判断是否为男女,比如一个新的数据:身高“高”、体重“中”,鞋码“中” => 男 or 女?

求在A1、A2、A3属性下,Cj的概率

equation?tex=%5C%5B%7BP+%5Cleft%28+C%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cleft%7C+A%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B3%7D%7D+%5Cleft%29+%3D%5Cfrac%7B%7BP+%5Cleft%28+A%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B3%7D%7D+%5Cleft%7C+C%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bj%7D%7D+%5Cleft%29+P+%5Cleft%28+C%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7Bi%7D%7D+%5Cright%29+%5Cright.+%5Cright.+%5Cright.+%7D%7D%7B%7BP+%5Cleft%28+A%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B1%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B2%7D%7DA%5Cmathop%7B%7B%7D%7D%5Cnolimits_%7B%7B3%7D%7D+%5Cright%29+%7D%7D%5Cright.+%5Cright.+%5Cright.+%7D%5C%5D

因为一共有2个类别,所以我们只需要求得P(C1|A1A2A3)和P(C2|A1A2A3)的概率即可,然后比较下哪个分类的可能性大,就是哪个分类结果

分别求下这些条件下的概率:

P(A1|C1)=1/2, P(A2|C1)=1/2, P(A3|C1)=1/4

P(A1|C2)=0, P(A2|C2)=1/2, P(A3|C2)=1/2

所以P(A1A2A3|C1)=1/16, P(A1A2A3|C2)=0

因为P(A1A2A3|C1)P(C1)>P(A1A2A3|C2)P(C2),所以应该是C1类别,即男性


b4acdb270b6331583f77df08dec85ef1.png

如果其中的数据不是离散值 而是连续值那应该如何计算呢?

身高180、体重120,鞋码41,请问该人是男是女呢?

我们在这里可以假设男性和女性的身高、体重、鞋码都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。

d8895a33aed42f8f12463a0536a7dfff.png

特征的似然被假设为高斯分布了,那么条件概率函数可以写为:

equation?tex=P%28x_i%7Cy%29%3D%5Cfrac%7B1%7D%7B%5Csqrt%7B2%5Cpi%5Csigma%5E2%7D%7D%5Cexp%5Cbigg%28-%5Cfrac%7B%28x_i-%5Cmu_y%29%5E2%7D%7B2%5Csigma_y%5E2%7D%5Cbigg%29

比如,男性的身高是均值179.5、标准差为3.697的正态分布。所以男性的身高为180的概率为0.1069

同理可以计算得出男性体重为120的概率为0.000382324,男性鞋码为41号的概率为0.120304111

P(A1A2A3|C1)=P(A1|C1)P(A2|C1)P(A3|C1)=0.1069*0.000382324*0.120304111=4.9169e-6

P(A1A2A3|C2)=P(A1|C2)P(A2|C2)P(A3|C2)=0.00000147489*0.015354144*0.120306074=2.7244e-9

很明显这组数据分类为男的概率大于分类为女的概率

现在我们看一下用scikit-learn实现的高斯朴素贝叶斯。

  1. # load the iris dataset
  2. from sklearn.datasets import load_iris
  3. iris = load_iris()
  4. # store the feature matrix (X) and response vector (y)
  5. X = iris.data
  6. y = iris.target
  7. # splitting X and y into training and testing sets
  8. from sklearn.model_selection import train_test_split
  9. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
  10. # training the model on training set
  11. from sklearn.naive_bayes import GaussianNB
  12. gnb = GaussianNB()
  13. gnb.fit(X_train, y_train)
  14. # making predictions on the testing set
  15. y_pred = gnb.predict(X_test)
  16. # comparing actual response values (y_test) with predicted response values (y_pred)
  17. from sklearn import metrics
  18. print("Gaussian Naive Bayes model accuracy(in %):", metrics.accuracy_score(y_test, y_pred)*100)
  19. -----------------------------------------------
  20. Gaussian Naive Bayes model accuracy(in %): 95.0

1dff3f6de1431bc7e8a4a8a3da2aa067.png

朴素贝叶斯分类:

常用于文本分类,文本过滤、情感预测、推荐系统等,尤其是对于英文等语言来说,分类效果很好

准备阶段,需要确定特征属性,属性值以及label => 训练集

训练阶段,输入是特征属性和训练样本,输出是分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率

应用阶段,使用分类器对新数据进行分类

在sklearn中提供了3中朴素贝叶斯模块

  • 高斯朴素贝叶斯
  • 多项式朴素贝叶斯
  • 伯努利朴素贝叶斯

-------------------------------------------------------------

sklearn工具使用:

from sklearn.naive_bayes import GaussianNB

高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度

GaussianNB(priors=None) #模型创建

priors,先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法)

查看模型对象的属性:

class_prior_:每个样本的概率

class_count_:每个类别的样本数量

theta_:每个类别中每个特征的均值

sigma_:每个类别中每个特征的方差

-------------------------------------------------------------

from sklearn.naive_bayes import MultinomialNB

多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等

MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

alpha:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑

fit_prior:是否去学习类的先验概率,默认是True

class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,即类别数N分之一

模型对象的属性:

class_count_: 训练样本中各类别对应的样本数

feature_count_: 每个类别中各个特征出现的次数

-------------------------------------------------------------

sklearn工具使用:

from sklearn.naive_bayes import BernoulliNB

伯努利朴素贝叶斯:特征变量是布尔变量,符合0/1分布,在文档分类中特征是单词是否出现

BernoulliNB(alpha=1.0, fit_prior=True, class_prior=None)

alpha:平滑因子,与多项式中的alpha一致

fit_prior:是否去学习类的先验概率,默认是True

class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,即类别数N分之一

模型对象的属性:

class_count_: 训练样本中各类别对应的样本数

feature_count_: 每个类别中各个特征出现的次数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/915954
推荐阅读
相关标签
  

闽ICP备14008679号