machine-learning-notes
  • 封面
  • 目录
  • 前言
  • 个人前言
  • 机器学习前言
    • 什么是机器学习和模式识别
    • 机器学习的应用
    • 机器学习的流程
    • 不同的机器学习算法对相同数据预测效果不同
    • 快速入门机器学习
    • 机器学习需要参考哪些书
    • 机器学习的学习路径
    • 深度学习的学习路径
    • 互联网机器学习特定岗位所需技能
  • 机器学习面试
  • 数学基础
  • 微积分
    • 泰勒展开
    • e的直观认识
    • 傅里叶变换
    • 希尔伯特空间
  • 线性代数
    • 范数
    • 矩阵求导
    • 特征值
    • 奇异值分解
  • 概率与信息论
    • 综述概率论基本定义
    • 概率论与贝叶斯先验
    • 正态分布
    • 贝叶斯概率
    • 概率符号说明
    • 共轭先验
    • 信息论
  • 数值计算与优化
    • 最小二乘法
    • 等式约束的拉格朗日乘子法
    • 凸优化
      • 凸集和凸函数
      • 凸优化问题
  • 梯度下降算法
    • 随机梯度下降SGD
    • 动量法Momentum
    • 牛顿动量Nesterov
    • AdaGrad
    • RMSprop
    • Adadelta
    • Adam
    • Nadam
    • AMSGrad
    • AdasMax
  • 概率图模型
    • 概率图模型概论
    • 概率图简介
  • 编程基础
  • linux
    • linux常用命令
    • shell
      • 输入输出重定向
  • python
    • python简介
    • python语法
      • 基础语法
      • 数据结构
      • 过程控制
      • 函数
      • 类和对象
      • 文件操作
      • 正则表达式
    • python库
      • numpy
      • pandas
      • scipy
      • matplotlib
      • scikit-learn
    • python应用
      • 排序算法
  • 数据结构与算法
    • 数据结构
    • 算法思想
      • 排序
        • 堆排序
        • 归并排序
        • 快速排序
      • 递归
    • 剑指offer
      • 链表
      • 二叉树
      • 数组
      • 字符串
      • 栈和队列
      • 递归
      • 动态规划
      • 其他
    • leetcode
    • 编程语言
      • c++
  • Hadoop
    • Hadoop简介
    • MapReduce
  • Hive
  • Spark
  • TensorFlow
    • TensorFlow1.0
      • TensorFlow基础
      • TensorFlow基础概念解析
      • TensorFlow机器学习基础
      • Tensorflow分布式架构
    • TensorFlow2.0
  • PyTorch
  • 机器学习
  • 机器学习概论
  • 特征工程
  • 感知机
  • k近邻
  • 朴素贝叶斯
  • 线性模型
    • 最大熵模型
    • 指数族分布与广义线性模型
    • 线性回归
      • Ridge回归(岭回归)
      • Lasso回归
    • Logistic回归-对数几率回归
  • 决策树
  • 支持向量机
    • 线性可分支持向量机与硬间隔最大化
    • 线性支持向量机与软间隔最大化
    • 非线性支持向量机与核函数
    • 序列最小最优化算法SMO
    • SVM总结
  • 集成学习
    • Bagging
      • 随机森林
    • Boosting
      • AdaBoost
      • GradientBoosting
        • GBDT
        • XGBoost
          • XGBoost理论
          • XGBoost实践
    • Stacking
  • 降维
    • PCA主成分分析
    • 流形学习
  • EM算法
  • HMM隐马尔科夫模型
  • CRF条件随机场
  • 聚类
    • k均值聚类
    • 高斯混合模型
  • 主题模型
    • LDA隐狄利克雷分布
  • 知识点
    • 损失函数
    • 负采样
  • 机器学习算法总结
  • 深度学习
  • 深度学习概论
  • ANN人工神经网络
  • 知识点
    • Batch Normalization
  • CNN卷积神经网络
  • 深度学习优化算法
  • RNN循环神经网络
  • LSTM长短期记忆网络
  • GRU门控循环单元
  • GNN图神经网络
    • GNN图神经网络综述
    • GCN图卷积网络
      • GCN图卷积网络初步理解
      • GCN图卷积网络的numpy简单实现
      • GCN图卷积网络本质理解
      • GCN图卷积网络全面理解
      • SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS ICLR2017
  • 神经网络架构搜索
    • Weight-Agnostic-Neural-Networks Google2019
  • 强化学习
  • 强化学习概论
  • 马尔科夫决策过程
  • 动态规划
  • 无模型方法一:蒙特卡洛
  • 无模型方法二:时间差分
  • 无模型方法三:多步自举
  • 函数近似和深度网络
  • 策略梯度算法
  • 深度强化学习
  • 基于模型的强化学习
  • 强化学习前景
  • 自然语言处理
  • 自然语言处理概论
  • 自然语言
  • 语言模型和中文分词
  • word2vec
    • word2vec概述
    • word2vec算法原理
    • word2vec源码分析
    • word2vec实践
  • Seq2Seq模型和Attention机制
  • Self-Attention和Transformer
  • 知识图谱
  • 推荐系统
  • 推荐系统概论
  • 基础知识
  • 进阶知识
    • 机器学习
      • Factorization Machines ICDM2010
    • embedding
      • Network Embedding
        • LINE: Large-scale Information Network Embedding
    • 深度学习
      • DeepFM: A Factorization-Machine based Neural Network for CTR Prediction 2017
      • DSSM: Learning Deep Structured Semantic Models for Web Search using Clickthrough Data CIKM2013
    • 图卷积网络
      • Graph Convolutional Neural Networks for Web-Scale Recommender Systems KDD2018
    • 强化学习
      • DRN基于深度强化学习的新闻推荐模型
  • 业界应用
    • YouTube
      • Deep Neural Networks for YouTube Recommendations RecSys2016
    • Alibaba
      • Learning Tree-based Deep Model for Recommender Systems KDD2018
      • Deep Interest Network for Click-Through Rate Prediction KDD2018
      • DSIN:Deep Session Interest Network for Click-Through Rate Prediction IJCAI2019
Powered by GitBook
On this page
  • 朴素贝叶斯
  • 认识朴素贝叶斯
  • 朴素贝叶斯数学原理
  • 朴素贝叶斯的参数估计
  • 拉普拉斯平滑
  • 朴素贝叶斯的优缺点
  • 项目实践
  • 鸢尾花分类
  • 参考文献

Was this helpful?

朴素贝叶斯

Previousk近邻Next线性模型

Last updated 5 years ago

Was this helpful?

朴素贝叶斯

朴素贝叶斯算法仍然是流行的十大挖掘算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。接下来我们就详细介绍该算法的知识点及实际应用。

朴素贝叶斯分类器是一种基于贝叶斯定理的弱分类器,所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。

朴素贝叶斯分类器很容易建立,特别适合用于大型数据集,众所周知,这是一种胜过许多复杂算法的高效分类方法。

尽管实际上独立假设常常是不准确的,但朴素贝叶斯分类器的若干特性让其在实践中能够取得令人惊奇的效果。特别地,各类条件特征之间的解耦意味着每个特征的分布都可以独立地被当做一维分布来估计。这样减轻了由于维度灾难带来的阻碍,当样本的特征个数增加时就不需要使样本规模呈指数增长。然而朴素贝叶斯在大多数情况下不能对类概率做出非常准确的估计,但在许多应用中这一点并不要求。

朴素贝叶斯分类器通过假设每一个特征的出现都是独立事件,简化了计算复杂度,也避免了样本稀疏的问题。虽然这一假设常常是不准确的,但朴素贝叶斯在实际工程中出乎意料地好用。因为很多应用并不在乎精确的类概率,只关心最后的分类结果。 然而,当特征之间相关性比较强,而我们又要求比较精确的类概率的时候,朴素贝叶斯就不够用了,即如果假设特征之间存在着概率依存关系,模型就变成了贝叶斯网络。贝叶斯网络是一种基于贝叶斯理论以DAG 形式描述全局概率分布的一种统计方法,不属于分类器的一种,主要用于贝叶斯推断。

认识朴素贝叶斯

朴素贝叶斯(Naive Bayes)算法是机器学习中常见的基本算法之一,它主要被用来做分类任务。其理论基础是基于贝叶斯定理和条件独立性假设的一种分类方法。对于给定的训练数据集:

T={(x1,y1),(x2,y2),...,(xn,yn)}T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}T={(x1​,y1​),(x2​,y2​),...,(xn​,yn​)}

首先基于特征条件独立性假设学习联合概率分布 P(X,Y),然后基于此模型,对于任意的输入x,利用贝叶斯定理求出后验概率最大的P(Y|X=x)对应的y的取值。

基于以上的解释,我们知道:(1)该算法的理论核心是贝叶斯定理;(2)它是基于条件独立性假设这个强假设基础之上的,这也是它为什么被称为“朴素”的主要原因。

朴素贝叶斯数学原理

根据贝叶斯定理,对一个分类问题,给定样本特征x,样本属于类别y的概率是:

P(Y∣X)=P(X∣Y)P(Y)P(X)P(Y|X)=\frac{P(X|Y)P(Y)}{P(X)}P(Y∣X)=P(X)P(X∣Y)P(Y)​

P(Y)是先验概率,P(Y|X)是后验概率,P(X|Y)是似然函数。X在这里是代表“特征”的集合,Y是“类别"。

公式中的X是特征向量的维度,假设为n。因此,有:

P(Y∣X)=P(X(1),X(2),...,X(n)∣Y)P(Y)P(X)P(Y|X)=\frac{P(X^{(1)},X^{(2)},...,X^{(n)}|Y)P(Y)}{P(X)}P(Y∣X)=P(X)P(X(1),X(2),...,X(n)∣Y)P(Y)​

我们以挑西瓜为例子,Y有两种取值“好瓜”和"不是好瓜"。我们先来规定一下符号, “Y=好瓜表示是好瓜,相反$\bar{Y}$=不是好瓜。$X^{(i)}$表示二元离散特征,例如$X^{(1)}$=青绿色,$X^{(2)}$=瓜蒂坚挺,$X^{(3)}$=敲击声清脆。于是贝叶斯公式可以写成了下面这个样子:

P(Y∣X(1),X(2),X(3))=P(X(1),X(2),X(3)∣Y)P(Y)P(X(1),X(2),X(3))P(Y|X^{(1)},X^{(2)},X^{(3)})=\frac{P(X^{(1)},X^{(2)},X^{(3)}|Y)P(Y)}{P(X^{(1)},X^{(2)},X^{(3)})}P(Y∣X(1),X(2),X(3))=P(X(1),X(2),X(3))P(X(1),X(2),X(3)∣Y)P(Y)​

再写出西瓜“不是好瓜”的概率:

P(Yˉ∣X(1),X(2),X(3))=P(X(1),X(2),X(3)∣Yˉ)P(Yˉ)P(X(1),X(2),X(3))P(\bar{Y}|X^{(1)},X^{(2)},X^{(3)})=\frac{P(X^{(1)},X^{(2)},X^{(3)}|\bar{Y})P(\bar{Y})}{P(X^{(1)},X^{(2)},X^{(3)})}P(Yˉ∣X(1),X(2),X(3))=P(X(1),X(2),X(3))P(X(1),X(2),X(3)∣Yˉ)P(Yˉ)​

由于条件概率分布有指数及数量的参数,因此,求解该问题是一个NP难问题,实现中很难解决,所以直接求解不可行。因此,朴素贝叶斯法对条件概率分布做了条件独立性的假设,于是有:

P(X(1)=x(1),X(2)=x(2),...,X(n)=x(n)∣Y=ck)=∏i=0nP(X(i)=x(i)∣Y=ck)P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k)=\prod_{i=0}^n P(X^{(i)}=x^{(i)}|Y=c_k)P(X(1)=x(1),X(2)=x(2),...,X(n)=x(n)∣Y=ck​)=i=0∏n​P(X(i)=x(i)∣Y=ck​)

将上式带入本小节第二个式子中,得:

P(Y=ck∣X)=P(Y=ck) ∏i=0nP(X(i)=x(i)∣Y=ck)P(X)P(Y=c_k|X)=\frac{P(Y=c_k)\ \prod_{i=0}^n P(X^{(i)}=x^{(i)}|Y=c_k)}{P(X)}P(Y=ck​∣X)=P(X)P(Y=ck​) ∏i=0n​P(X(i)=x(i)∣Y=ck​)​

这是朴素贝叶斯法分类的基本公式。因此,朴素贝叶斯分类器可以表示为:

y=f(x)=arg maxckP(Y=ck) ∏i=0nP(X(i)=x(i)∣Y=ck)P(X)y=f(x)=\text{arg}\ \mathop{\text{max}}_{c_k}\frac{P(Y=c_k)\ \prod_{i=0}^n P(X^{(i)}=x^{(i)}|Y=c_k)}{P(X)}y=f(x)=arg maxck​​P(X)P(Y=ck​) ∏i=0n​P(X(i)=x(i)∣Y=ck​)​

由于所有的P(x)的分布是一样的,只是起到了归一化的作用,所以:

y=f(x)=arg maxckP(Y=ck) ∏i=0nP(X(i)=x(i)∣Y=ck)y=f(x)=\text{arg}\ \mathop{\text{max}}_{c_k}P(Y=c_k)\ \prod_{i=0}^n P(X^{(i)}=x^{(i)}|Y=c_k)y=f(x)=arg maxck​​P(Y=ck​) i=0∏n​P(X(i)=x(i)∣Y=ck​)

由上述的推导可知,朴素贝叶斯分类是将实例分到后验概率最大的类中。这等价于期望风险最小化。这就是朴素贝叶斯法所采用的原理。

朴素贝叶斯的参数估计

由上式可知,朴素贝叶斯法的学习过程主要是估计$P(y=c_k)$以及$P(x^{(j)}|y=c_k)$。对于类别概率估计可以使用如下的公式进行估计:

P(Y=ck)=∑i=1N I(yi=ck)N, k=1,2,...,KP(Y=c_k)=\frac{\sum_{i=1}^N\ I(y_i=c_k)}{N},\ k=1,2,...,KP(Y=ck​)=N∑i=1N​ I(yi​=ck​)​, k=1,2,...,K

但是对于条件概率$P(x^{(j)}|y=c_k)$的概率分布的估计,我们需要根据特征向量的每一维$X^{(i)}$分两种情况进行讨论:

  • 若$X^{(i)}$为离散型变量;

  • 若$X^{(i)}$为连续型变量

特征值为离散型变量时的参数估计

当特征值为离散型变量时,这时候参数估计非常简单,我们只需要计算出每个特征值在相应的类中出现的概率就可以了。直接使用如下的公式进行估计:

P(X(j)=x(j)∣Y=ck)=∑i=1N I(X(j)=xi(j),Y=ck)∑i=1N I(Yi=ck)P(X^{(j)}=x^{(j)}|Y=c_k)=\frac{\sum_{i=1}^N\ I(X^{(j)}=x_i^{(j)},Y=c_k)}{\sum_{i=1}^{N}\ I(Y_i=c_k)}P(X(j)=x(j)∣Y=ck​)=∑i=1N​ I(Yi​=ck​)∑i=1N​ I(X(j)=xi(j)​,Y=ck​)​

特征值为连续型变量时的参数估计

当特征值为离散型变量的时候,我们使用上式对条件概率分布$P(X^{(j)}=x^{(j)}|Y=c_k)$进行估计。但是如果当特征值$x^{(j)}$为连续型变量,此时这种估计就会失效,此时我们就需要一种新的方式进行估计。常用的方法就是假设特征$x^{(j)}$在条件$Y=c_k$时服从某一分布,如常见的高斯分布、多项式分布以及伯努利分布等。

以高斯分布为例,假设条件概率分布

P(X(j)=x(j)∣Y=ck)P(X^{(j)}=x^{(j)}|Y=c_k)P(X(j)=x(j)∣Y=ck​)

服从如下分布:

P(X(j)=x(j)∣Y=ck)=12πσexp(−(xi−uy)2σ2)P(X^{(j)}=x^{(j)}|Y=c_k)=\frac{1}{\sqrt{2\pi}\sigma}\text{exp}\left(-\frac{(x_i-u_y)}{2\sigma^2}\right)P(X(j)=x(j)∣Y=ck​)=2π​σ1​exp(−2σ2(xi​−uy​)​)

其中,参数$u_y$和$\delta_y$分别表示高斯分布的均值和方差,它们可以使用最大似然估计的方法进行计算得到。

拉普拉斯平滑

到这里好像方法已经介绍完了,但是有一个小问题需要注意:在上述的公式中,如果从样本中算出的概率值为0该怎么办呢?下面介绍一种简单方法,给学习步骤中的两个概率计算公式,分子和分母都分别加上一个常数,就可以避免这个问题。更新过后的公式如下:

P(Y=ck)=∑i=−1N I(yi=ck)+λN+Kλ, k=1,2,...,KP(Y=c_k)=\frac{\sum_{i=-1}^N\ I(y_i=c_k)+\lambda}{N+K\lambda},\ k=1,2,...,KP(Y=ck​)=N+Kλ∑i=−1N​ I(yi​=ck​)+λ​, k=1,2,...,K

K是类的个数,

P(X(j)=x(j)∣Y=ck)=∑i=1N I(X(j)=xi(j),Y=ck)+λ∑i=1N I(Yi=ck)+Ljλ, k=1,2,...,KP(X^{(j)}=x^{(j)}|Y=c_k)=\frac{\sum_{i=1}^N\ I(X^{(j)}=x_i^{(j)},Y=c_k)+\lambda}{\sum_{i=1}^{N}\ I(Y_i=c_k)+L_j\lambda},\ k=1,2,...,KP(X(j)=x(j)∣Y=ck​)=∑i=1N​ I(Yi​=ck​)+Lj​λ∑i=1N​ I(X(j)=xi(j)​,Y=ck​)+λ​, k=1,2,...,K

$L_j$是第j维特征的最大值取值个数。

特别的,当上述估计中λ=1时,此时称为拉普拉斯平滑(Laplace smoothing)。

朴素贝叶斯的优缺点

优点:

  • 既简单又快速,预测表现良好;

  • 如果变量独立这个条件成立,相比Logistic回归等其他分类方法,朴素贝叶斯分类器性能更优,且只需少量训练数据;

  • 相较于数值变量,朴素贝叶斯分类器在多个分类变量的情况下表现更好。若是数值变量,需要正态分布假设。

缺点:

  • 如果分类变量的类别(测试数据集)没有在训练数据集总被观察到,那这个模型会分配一个0(零)概率给它,同时也会无法进行预测。这通常被称为“零频率”。为了解决这个问题,我们可以使用平滑技术,拉普拉斯估计是其中最基础的技术。

  • 朴素贝叶斯也被称为bad estimator,所以它的概率输出predict_proba不应被太认真对待。

  • 朴素贝叶斯的另一个限制是独立预测的假设。在现实生活中,这几乎是不可能的,各变量间或多或少都会存在相互影响。

项目实践

scikit-learn里有3种朴素贝叶斯的模型:

高斯模型:适用于多个类型变量,假设特征符合高斯分布。

多项式模型:用于离散计数。如一个句子中某个词语重复出现,我们视它们每个都是独立的,所以统计多次,概率指数上出现了次方。

伯努利模型:如果特征向量是二进制(即0和1),那这个模型是非常有用的。不同于多项式,伯努利把出现多次的词语视为只出现一次,更加简单方便。

你可以根据特定数据集选取上述3个模型中的合适模型。

鸢尾花分类

本节实战中,我们仍然使用iris数据集,详细步骤如下:

# -*- coding: utf-8 -*-

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn import datasets

# 加载数据集
iris = datasets.load_iris()

X = iris.data
y = iris.target
print('Sample num:', len(y))
# 随机分配训练集和测试集,比例大小为7:3
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 42)


# 初始化模型
clf = GaussianNB()

# 训练模型
clf.fit(X_train, y_train)

# 在测试集上预测
ans = clf.predict(X_test)

# 计算准确率
cnt = 0
for i in range(len(y_test)):
    if ans[i] - y_test[i] < 1e-1:
        cnt += 1
    print(ans[i], ' ', y_test[i])
print("Accuracy:", (cnt * 100.0 / len(y_test)), "%")
# Accuracy:, 97.77777777777777%

参考文献

“认识朴素贝叶斯”一节就参考的这篇知乎回答。

"朴素贝叶斯的优缺点"和“用scikit-learn进行朴素贝叶斯分类”参考此知乎回答。

"理解朴素贝叶斯分类"参考此专栏文章。

"拉普拉斯平滑"参考此专栏文章。

逻辑回归与朴素贝叶斯有什么区别?
请用简单易懂的语言描述朴素贝叶斯分类器?
带你理解朴素贝叶斯分类算法
理解朴素贝叶斯分类的拉普拉斯平滑
返回顶层目录
认识朴素贝叶斯
朴素贝叶斯数学原理
朴素贝叶斯的参数估计
拉普拉斯平滑
朴素贝叶斯的优缺点
项目实践
鸢尾花分类