天天看点

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

朴素贝叶斯

文章目录

  • 朴素贝叶斯
    • 1、概率基础
      • 随机事件
      • 样本空间
      • 概率
      • 联合概率
      • 条件概率
      • 独立性
      • 全概率公式
      • 贝叶斯公式
    • 2、朴素贝叶斯
    • 3、拉普拉斯平滑处理
    • 4、算法处理流程
    • 5、sklearn中的朴素贝叶斯
      • 高斯朴素贝叶斯
      • 多项式朴素贝叶斯
      • 伯努利朴素贝叶斯
    • 6、python实现
      • 高斯朴素贝叶斯
      • 多项式朴素贝叶斯——用于文本分类
      • 伯努利朴素贝叶斯
    • 7、朴素贝叶斯算法的优缺点

朴素贝叶斯模型(Naive Bayesian Model,NBM)

朴素贝叶斯分类器是一个以贝叶斯定理为基础 的多分类的分类器。 对于给定数据,首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模型,对给定的输入X,利用贝叶斯定理求出后验概率最大的输出Y。

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

1、概率基础

随机事件

随机事件是在随机试验中,可能出现也可能不出现,而在大量重复试验中具有某种规律性的事件叫做随机事件(简称事件)。

例如,当我们抛硬币的时候,设出现正面为事件A,则事件A可能发生,也可能不发生。

样本空间

随机试验E的所有基本结果组成的集合为E的样本空间。样本空间的元素称为样本点或基本事件。习惯用S表示。

概率

概率,亦称“或然率”,它是反映随机事件出现的可能性(likelihood)大小。习惯用P(A)来表示事件A的概率。

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

从面积的角度,也可以这样表示:

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

联合概率

联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。假设X和Y都服从正态分布,那么P{X<4,Y<0}就是一个联合概率,表示X<4,Y<0两个条件同时成立的概率。表示两个事件共同发生的概率。A与B的联合概率表示为 P(AB) 或者P(A,B),或者P(A∩B)。

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯
机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

条件概率

条件概率是指事件A在另外一个事件B已经发生条件下的发生概率。条件概率表示为:P(A|B),读作“在B的条件下A的概率”。

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

独立性

设A,B为随机事件,若同时发生的概率等于各自发生的概率的乘积,则A,B相互独立。

一般地,设A1,A2,…,An是n(n≥2) 个事件,如果对于其中任意2个,任意3个,…,任意n个事件的积事件的概率,都等于各事件概率之积,则称A1,A2,…,An相互独立。

定义

若AB两事件满足等式

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

则称事件A与B相互独立。

全概率公式

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

贝叶斯公式

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

2、朴素贝叶斯

朴素贝叶斯表达式:

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

目标函数为

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

3、拉普拉斯平滑处理

缺陷:受样本个数限制,若某个属性值在训练集中没有与某个同类同时出现过,则连乘公式结果则必为零,其他属性取任意值都不能改变这一结论。

修正:拉普拉斯平滑处理

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

N表示训练集样本的类别数,Ni表示训练集样本在第 i 个属性上的取值个数

4、算法处理流程

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

5、sklearn中的朴素贝叶斯

在sklearn库中,实现了三个朴素贝叶斯分类器,如下表所示:

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

区别在于假设某一特征的所有属于某个类别的观测值符合特定分布,如高斯朴素贝叶斯:分类问题的特征包括人的身高,身高符合高斯分布,这类问题适合高斯朴素贝叶斯。

高斯朴素贝叶斯

  • 机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯
    是连续变量时,我们可以使用高斯朴素贝叶斯(Gaussian Naive Bayes)完成分类任务。
  • 当处理连续数据时,一种经典的假设是:与每个类相关的连续变量的分布是基于高斯分布的

高斯贝叶斯的公式如下:

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯
机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

多项式朴素贝叶斯

多项式朴素贝叶斯:适用于特征为离散变量时的多分类情景

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

伯努利朴素贝叶斯

适用于二分类情景

设实验E只有两个可能的结果,A与非A,则称E为伯努利实验

伯努利朴素贝叶斯,适用于离散变量,其假设各个特征Xi在各个类别下y下是服从n重伯努利分布(二项分布)的,因为伯努利实验仅有两个结果,因此算法会首先对特征值进行二值化处理(假设二值化的结果为1和0)

机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

6、python实现

  • naive Bayes is a decent classifier, but a bad estimator

高斯朴素贝叶斯

  • 构造方法:sklearn.naive_bayes.GaussianNB

GaussianNB 类构造方法无参数,属性值有:

  • class_prior_

    #每一个类的概率

  • theta_

    #每个类中各个特征的平均

  • sigma_

    #每个类中各个特征的方差

注:GaussianNB 类无score 方法

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB

np.random.seed(0)
X = np.random.randint(0, 10, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

gnb = GaussianNB() 
gnb.fit(X, y)
# 每个类别的先验概率。P(y)
print("概率:", gnb.class_prior_)
# 每个类别样本的数量。
print("样本数量:", gnb.class_count_) 
# 每个类别的标签。
print("标签", gnb.classes_) 
# 每个特征在每个类别下的均值。 
print("均值:", gnb.theta_) 
# 每个特征在每个类别下的方差。 
print("标准差:", gnb.sigma_)

# 测试集
X_test = np.array([[6, 3]])
print("预测结果:", gnb.predict(X_test)) 
print("预测结果概率:", gnb.predict_proba(X_test))
print("预测结果:", np.argmax(gnb.predict_proba(X_test)))
           
机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

多项式朴素贝叶斯——用于文本分类

构造方法:

sklearn.naive_bayes.MultinomialNB(alpha=1.0 #平滑参数 
   , fit_prior=True    #学习类的先验概率 
   , class_prior=None)    #类的先验概率 
           
from sklearn.naive_bayes import MultinomialNB

np.random.seed(0)
X = np.random.randint(0, 4, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

mnb = MultinomialNB() 
mnb.fit(X, y)
# 每个类别的样本数量。
print(mnb.class_count_)
# 每个特征在每个类别下发生(出现)的次数。 
print(mnb.feature_count_)
# 每个类别下,每个特征所占的比例(概率),即P(x}y)。注意,该值为概率 
# 取对数之后的结果,如果需要查看原有的概率,需要使用指数还原。 
print(np.exp(mnb.feature_log_prob_))
           
机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

伯努利朴素贝叶斯

from sklearn.naive_bayes import BernoulliNB

np.random.seed(0)
X = np.random.randint(-5, 5, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"]) 
display(data)

bnb = BernoulliNB()
bnb.fit(X, y)
# 每个特征在每个类别下发生(出现)的次数。因为伯努利分布只有两个值,
# 我们只需要计算出现的概率P(x=1|y),不出现的概率P(x=0|y)使用1减去P(x=1|y)即可。 
print("数值1出现次数:", bnb.feature_count_)
# 每个类别样本所占的比重,即P(y)。注意,该值为概率取对数之后的结果,如果需要查看
# 原有的概率,需要使用指数还原。
print("类别占比p(y):", np.exp(bnb.class_log_prior_))
# 每个类别下,每个特征(值为1)所占的比例(概率),即P(x}y)。注意,该值为概率 
#取对数之后的结果,如果需要查看原有的概率,需要使用指数还原。
print("特征概率:", np.exp(bnb.feature_log_prob_))
           
机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

7、朴素贝叶斯算法的优缺点

朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得后验概率分布。

朴素贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务

算法优点

相比较与其他算法,朴素贝叶斯算法具有下面两大优势:

  • 在训练集数据较少的情况下,也能够实现预测,且效果不错
  • 算法训练速度非常快
    机器学习笔记--4、朴素贝叶斯及python实现朴素贝叶斯

算法缺点

  • 属性独立性的条件同时也是朴素贝叶斯分类器的不足之处。
  • 数据集属性的独立性在很多情况下是很难满足的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果大大降低

详细代码我将放在GitHub上,需要的小朋友们可自行下载:点此进入GitHub

前文回顾:

机器学习笔记 – 1、认识机器学习

机器学习笔记 – 2、回归分析及python实现

机器学习笔记 – 3、KNN及python实现