朴素贝叶斯

  • 前言
  • 1、概述
  • 2、原理
  • 3、算法
  • 4、朴素贝叶斯种类
  • 4.1高斯朴素贝叶斯(GaussianNB)
  • 4.2 多项式朴素贝叶斯(MultinomialNB)
  • 4.3 其他分类
  • 小结


前言

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化朴素贝叶斯算法是解决分类问题的监督学习算法,,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_02

1、概述

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化贝叶斯原理是最大的概念,它解决了概率论中“逆向概率”的问题,在这个理论基础上,人们设计出了贝叶斯分类器朴素贝叶斯分类是贝叶斯分类器中的一种,也是最简单,最常用的分类器。朴素贝叶斯之所以朴素是因为它假设属性是相互独立的,因此对实际情况有所约束,如果属性之间存在关联,分类准确率会降低。 不过好在对于大部分情况下,朴素贝叶斯的分类效果都不错。

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化实际上,贝叶斯原理是数学基础,贝叶斯分类是一种模型,而朴素贝叶斯则是具体方法。

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_05

贝叶斯原理
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化贝叶斯原理是英国数学家托马斯·贝叶斯提出的。

  • 逆向概率是相对于正向概率而言的。
  • 正向概率:一个盒子里面有M个白球,N个黑球,那么我们随机拿一个球出来是黑球(白球)的概率?这就是一个正向概率问题,比较好理解。
  • 逆向概率:现实生活中,绝大部分问题,我们是很难知道具体情况的,那么我们能否根据拿出来球的颜色来判断盒子中黑球和白球的比例呢?贝叶斯公式可以先估计一个值,然后根据实际结果不断进行更新。

2、原理

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布:然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

1、损失函数

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化假设我们使用0-1损失函数,函数表达式如下:

贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_09


式中,贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_10为决策函数。这时,期望风险函数为

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_11

期望是对联合分布贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_12取得。由此由双期望公式得贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_13

为了使期望风险最小,只需对贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_14逐个极小化,由此得到:

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_15


这样一来,根据期望风险最小化准则就得到了后验概率最大化准则:

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_16

即朴素贝叶斯法所采用的原理:求得最大后验概率即能最小化代价函数!

2. 求最大化后验概率

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化基于上面的分析我们知道,对于数据集贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_18,当贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_19的可取值为贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_20 时,我们对待分类样本贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_21求其对应不同类标记贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_22的后验概率值,并选择最后的后验概率值对应的类标号贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_22作为样本的分类结果,我们就能以最小的代价函数获得最优的分类。

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化根据贝叶斯公式来求后验概率:

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_25

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化样本贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_21有J个属性,怎么求得条件概率分布贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_28呢?
这时候朴素贝叶斯的优势就体现出来了,朴素贝叶斯和贝叶斯最重要的区别就在于,朴素贝叶斯假设在类确定的条件下,样本的特征之间是相互独立的! 因此,上面的公式就可以拆分成以下形式:

贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_29
因为分母对于同一样本来说都是一样的,因此我们在具体算法流程中是可以不考虑分母的大小的。

所以,朴素贝叶斯分类器可以表示为:
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_30

3、参数估计

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化目前,我们已经计算好了最大后验概率的公式,但是公式中还有两个重要的部分没有得到解答,一个是条件概率,一个是先验概率。
3.1 极大似然估计

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化先验概率贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_33的极大似然估计
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_34

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化设第j个特征贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_36可能取值的集合为贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_37,则条件概率贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_38的极大似然估计是
贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_39
贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_40
式中,贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_41是第i个样本的第j个特征;贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_42是第j个特征可能取的第l个值;I为指示函数。

3.2 贝叶斯估计
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化用极大似然估计的先验概率及条件概率可能出现概率值为0的情况,比如计算先验概率时,发现没有贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_22类型的样本,那么先验概率贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_33的估计结果将会为0,那么条件概率贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_46的分母将会为0,计算不出结果,后验概率自然也就无法计算了。这种情况下,可以在条件概率中加入一个参数来做平滑即采用贝叶斯估计,公式如下:

条件概率的贝叶斯估计为:
贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_47
贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_40

式中贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_49。等价于在随机变量各个取值的频数上赋予一个正数贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_49。当贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_51时就是极大似然估计。常取贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_52,这时称为拉普拉斯平滑。显然,对任何贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_53

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_54
表明上式为一种概率分布。

先验概率的贝叶斯估计为:
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_55

完成先验概率及条件概率的估算后,我们就可以完成后验概率(不需要计算分母)的计算了。针对不同的类标号计算后验概率,计算结果最大的后验概率对应的类标号即为样本对应的类标号。

3、算法

基于极大似然估计的朴素贝叶斯算法

输入:训练数据贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_56,其中贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_57是第i个样本的第j个特征,贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_58贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_42是第j个特征可能取的第l个值,贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_60;实例x

输出:实例x的分类

(1)计算先验概率及条件概率
贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_34

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_39
贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_40
(2)对于给定的实例贝叶斯优化算法调参python程序 贝叶斯优化原理_机器学习_64,计算

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化_65
(3)确定实例x的类

贝叶斯优化算法调参python程序 贝叶斯优化原理_后验概率_66

4、朴素贝叶斯种类

在sklearn中,朴素贝叶斯种类有三种,分别是GaussianNB、MultinomialNB和BernoulliNB。

4.1高斯朴素贝叶斯(GaussianNB)

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化高斯模型,当特征是连续变量时,运用多项式模型,条件概率难以描述真实情况。因此此时用高斯模型,假设特征都服从正态分布。就是求出某一特征的样本和方差得到该特征的正态分布,然后带入样本点进概率密度函数估计为条件概率值,这样就可以计算分类了。

正态分布的概率密度函数计算公式如下:

贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_68


其中,贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_69为Y的第k类类别。贝叶斯优化算法调参python程序 贝叶斯优化原理_贝叶斯优化算法调参python程序_70贝叶斯优化算法调参python程序 贝叶斯优化原理_朴素贝叶斯_71为第k类样本在第i个属性上的取值的均值和方差。

sklearn中的GaussianNB实战

采用sklearn中的鸾尾花数据集,由于数据集都是连续属性,所以采用GaussianNB来进行实现。

from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
gnb = GaussianNB()
y_pred = gnb.fit(X_train, y_train).predict(X_test)
print("Number of mislabeled points out of a total %d points : %d"
      % (X_test.shape[0], (y_test != y_pred).sum()))
predict_class = gnb.predict( X_test)
# predict_class_proba = gnb_clf.predict_proba(test_x)
print("测试集准确率为:",accuracy_score(y_test,predict_class))

4.2 多项式朴素贝叶斯(MultinomialNB)

贝叶斯优化算法调参python程序 贝叶斯优化原理_最小化多项式模型,特征是离散的时候,用多项式模型或做一些平滑的处理。一般是拉普拉斯平滑,这时候用到的是贝叶斯估计,不再是极大似然估计。因为如果不做平滑,当出现一些训练样本中没有的数据时,会使条件概率为0,从而导致后验概率为0。

sklearn中的MultinomialNB实现
官方文档

多项式所涉及的特征往往是次数,频率,计数这样的概念,这些概念都是离散的正整数,因此,sklearn中的MultinomialNB不接受负值的输入。

MultinomialNB包含如下的参数和属性:

class sklearn.naive_bayes.MultinomialNB(*, alpha=1.0, fit_prior=True, class_prior=None)

其中

  • alpha : 浮点数, 可不填 【默认为1.0】
    平滑系数λ,如果为0,则表示完全没有平滑选项。需注意,平滑相当于人为给概率加上一些噪音,因此λ设置得越大,精确性会越低(虽然影响不是非常大)
  • fit_prior : 布尔值, 可不填【默认为True】

是否学习先验概率P(Y=c)。如果为False,则所有的样本类别输出都有相同的类别先验概率。即认为每个标签类出现的概率是1/总类别数

  • class_prior:形似数组的结构,结构为(n_classes,),可不填【默认为None】
    表示类的先验概率P(Y=c)。如果没有给出具体的先验概率则自动根据数据来进行计算。

【实战】

import numpy as np
rng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 100))
y = np.array([1, 2, 3, 4, 5, 6])
from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X, y)

print(clf.predict(X[2:3]))

4.3 其他分类

见文档

  • 如果样本特征的分布大部分是连续值(如人的身高,体重等),建议使用GaussianNB会比较好;
  • 如果样本特征的分布大部分是多元离散值(如在文档分类中特征是单词出现次数),建议使用MultinomialNB比较好;
  • 如果样本特征是二元离散值(如在文档分类中特征是单词是否出现) ,建议使用BernoulliNB比较好。

小结

朴素贝叶斯优缺点

  • 优点
    算法逻辑简单,易于实现
    分类过程,时间和空间开销小
  • 缺点
    朴素贝叶斯假设特征之间相互独立,然而现实中往往不成立,在特征个数较多或者特征相关性较高时,分类效果不好

参考资料:
1、统计学习方法
2、