sklearn学习之朴素贝叶斯分类

学习目标

  • 说明条件概率与联合概率
  • 说明贝叶斯公式及特征独立的关系
  • 记忆贝叶斯公式
  • 使用贝叶斯对鸢尾花数据进行分类
    %-------------------------------------------------------------------------------------------------------


    2.png

1、概率定义

  • 条件概率:所考虑的事件A已发生的条件下事件B发生的概率p(B|A)
    • 我们能根据今天的天气去预测明天的天气,其实隐含的条件就
      是在知道今天的天气情况下去预测明天的天气的概率
  • 联合概率:包含多个条件,且所有的条件同时成立的概率P(A,B)
  • 相互独立:如果P(A,B) = P(A)P(B),则称事件A,B相互独立。

2、案例:判断女神对你的喜欢情况

3.png
  • 问题如下:
    • 1、女神喜欢的概率?
    • 2、职业是程序员并且体型匀称的概率?
    • 3、在女神喜欢的条件下,职业是程序员的概率?
    • 4、在女神喜欢的条件下,职业是程序员,体重超重的概率?
  • 计算结果
p(喜欢) = 4/7 (先验概率)
p(程序员,匀称) = 1/7(联合概率)
p(程序员|喜欢) = 2/4 = 1/2(条件概率)
p(程序员,超重|喜欢) = 1/4
  • 思考:在小明是产品经理并且体重超重的情况下,如何计算小明被女神
    喜欢的概率?
    即:p(喜欢|产品,超重) = ?

3、贝叶斯公式

3、1 公式介绍

P(B|A) = \frac{P(A|B)P(B)}{P(A)}

3.2 案例计算

那么思考题可以套用贝叶斯公式来解决:

p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重)

上式中,

  • p(产品,超重|喜欢)和p(产品,超重)的结果均为0,导致无法计算结
    果,原因是我们的样本太少了,不具备代表性;
  • 现实中,肯定存在产品经理是超重的人的,故p(产品,超重)不可能
    为0;
  • 事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的
    事件,但是根据我们的有限的样本计算“p(产品,超重)= p(产品)p(超重)”不成立。
    而朴素贝叶斯可以解决这个问题。
  • 朴素贝叶斯,简单理解,就是假定了特征与特征之间相互独立的贝
    叶斯公式;
  • 即,朴素贝叶斯,之所以朴素,就在于特征之间相互独立。
    按照朴素贝叶斯思路来计算,就可以是
p(产品,超重) = p(产品)p(超重) = 2/7*3/7 = 6/49
p(产品,超重|喜欢) = p(产品|喜欢)*p(超重|喜欢) = 1/2*1/4 = 1/8
p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重) 
 = 1/8*4/7 /6/49 = 7/12

3.3文本分类计算

需求:通过前面4个训练样本,判断第五篇文章,是否属于china类


4.png
  • 公式运用
    P(C|F_1,F_2,\cdots,F_n) = \frac{ P(F_1,F_2,\cdots,F_n|C)*P(C)}{P(F_1,F_2,\cdots,F_n)}
    公式分成三个部分:
    • P(C):每个文档类别的概率(= 某类文档的特征个数/总文档特征数)
    • P(F_1,F_2,\cdots,F_n|C):给定类别下特征(该类别文档中出现的
      词)的概率,计算方法:
      • P(F_1|C) = N_1/N
      • N_1F_1在C类中出现的次数
      • N为C类中所有词出现的次数
    • P(F_1,F_2,\cdots,F_n)预测文档中每个词的概率
      计算出结果并进行比较,所以
      我们只需计算分子的大小就可以得出哪个概率大
p(C|chinese,chinese,chinese,Tokyo,Japan) --->
p(chinese,chinese,chinese,Tokyo,Japan|C) *p(C) /p(chinese,chinese,chinese,Tokyo,Japan)
= p(chinese|C)^3*p(Tokyo|C)*p(Japan|C) *p(C) / p(chinese)^3*p(Tokyo)*p(Japan)

# 首先计算是China类的文章
p(chinese|C) = 5/8
p(Tokyo|C) = 0/8
p(Japan|C) = 0/8

# 接着计算不是china类的文章
p(chinese|C) = 1/3
p(Tokyo|C) = 1/3
p(Japan|C) = 1/3

问题:从上面计算中发现,p(Tokyo|C) = 0 和 p(Japan|C) = 0,这是不
合理的。仍然是样本太少造成的,如果词频列表中有很多的话,可以避
免。
解决方法: 拉普拉斯平滑系数
\begin{equation} P(F1|C) = \frac{N_1+\alpha}{N+\alpha m} \end{equation}

  • \alpha为指定的系数,一般为1
  • m 为训练文档中统计出的特征词个数
# 首先计算是China类的文章
p(chinese|C) = 5/8--->6/14
p(Tokyo|C) = 0/8--->1/14
p(Japan|C) = 0/8--->1/14

# 接着计算不是china类的文章
p(chinese|C) = 1/3--->2/9
p(Tokyo|C) = 1/3--->2/9
p(Japan|C) = 1/3--->2/9

4、认识朴素贝叶斯分类器API

4.1 种类

sklearn 给我们提供了 3 个朴素贝叶斯分类算法,分别是

  • 高斯朴素贝叶斯(GaussianNB)
  • 多项式朴素贝叶斯(MultinomialNB)
  • 伯努利朴素贝叶斯(BernoulliNB)

4.2 应用

特征:

  • 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度;
    class sklearn.naive_bayes.GaussianNB(priors=None)
    
    • \color{green}{priors}: 先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法),P(Y=C_k)=m_k/m。其中m为训练集样本总数量,m_k为输出为第k类别的训练集样本数。
    • 对象:
      • \color{green}{class\_prior\_}:每个样本的概率
      • \color{green}{class\_count}:每个类别的样本数量
      • \color{green}{theta\_}:每个类别中每个特征的均值
      • \color{green}{sigma\_}:每个类别中每个特征的方差
  • 多项式朴素贝叶斯:特征变量是离散变量,符合多项分布;
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
  • \color{green}{alpha}:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑。

  • \color{green}{fit\_prior}:是否去学习类的先验概率,默认是True

  • \color{green}{class\_prior}:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

  • 对象

  • \color{green}{class\_log\_prior\_}:每个类别平滑后的先验概率

  • \color{green}{intercept\_}:是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同

  • \color{green}{feature\_log\_prob\_}:给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+\alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*\alpha

  • \color{green}{coef\_}: 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同

  • \color{green}{class\_count\_}: 训练样本中各类别对应的样本数

  • \color{green}{feature\_count\_}: 每个类别中各个特征出现的次数

  • 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现
sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
  • \color{green}{alpha}:平滑因子,与多项式中的\alpha一致。
  • \color{green}{binarize}:样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
  • \color{green}{fit\_prior}:是否去学习类的先验概率,默认是True
  • \color{green}{class\_prior}:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

对象

  • \color{green}{class\_log\_prior\_}:每个类别平滑后的先验对数概率。
  • \color{green}{feature\_log\_prob\_}:给定特征类别的经验对数概率。
  • \color{green}{class\_count\_}:拟合过程中每个样本的数量。
  • \color{green}{feature\_count\_}:拟合过程中每个特征的数量。

方法
贝叶斯的方法和其他模型的方法一致。

  • \color{green}{fit(X,Y)}:在数据集(X,Y)上拟合模型。
  • \color{green}{predict(X)}:对数据集X进行预测。
  • \color{green}{predict\_log\_proba(X)}:对数据集X预测,得到每个类别的概率对数值。
  • \color{green}{predict\_proba(X)}:对数据集X预测,得到每个类别的概率。
  • \color{green}{score(X,Y)}:得到模型在数据集(X,Y)的得分情况。

5、鸢尾花数据分类

#导入所需要的包
from sklearn.naive_bayes import GaussianNB
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from matplotlib.colors import ListedColormap
%matplotlib inline
#导入函数
muNB = GaussianNB()
#读取数据
iris = load_iris()
#取出数据中的data
data = iris.data
#取出数据中的target
target = iris.target
#取data中所有行前两列为训练数据
samples = data[:,:2]
#训练数据
muNB.fit(samples,target)
#取出训练数据中第一列中的最大与最小值
xmin,xmax = samples[:,0].min(),samples[:,0].max()
#取出训练数据中第二列中的最大与最小值
ymin,ymax = samples[:,1].min(),samples[:,1].max()
#在最大与最小值的区间分成300个数据
x = np.linspace(xmin,xmax,300)
y = np.linspace(ymin,ymax,300)
#然后使这些数据组成一个平面
xx,yy = np.meshgrid(x,y)
#生成90000个坐标点
X_test = np.c_[xx.ravel(),yy.ravel()]
#预测训练数据
y_ = muNB.predict(X_test)
#导入三种不同的颜色
colormap = ListedColormap(['#00aaff','#aa00ff','#ffaa00'])
#生成三个不同颜色的模块,第一列为x轴坐标,第二列为y轴坐标,预测之后,不同的点分成不同的三类

plt.scatter(X_test[:,0],X_test[:,1],c=y_)
3.png
#生成训练数据生成的点的分布,c=target意思是根据target的值,生成不同的颜色的点
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)
4.png
#一起调用的话使两张图结合起来
plt.scatter(X_test[:,0],X_test[:,1],c=y_)
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)
5.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355

推荐阅读更多精彩内容