原作:https://jakevdp.github.io/PythonDataScienceHandbook/05.05-naive-bayes.html
牢骚
最近准备把机器学习领域的几大经典算法好好研究一下。我刚入门的时候,是一股脑钻进神经网络的,而且上来就是Faster RCNN。现在在日常工作中经常会看到贝叶斯、SVM、决策树等等这些名词,可是自己却一知半解,很多时候感觉很难堪,是时候系统地研究一下这些算法了。
在google发现了这个好书,我是直接通过线上的电子书学习的。这本书最后一章中介绍了多种机器学习算法,包括:朴素贝叶斯分类器、线性回归、支持向量机(SVM)、决策树和随机森林、主成分分析(PCA)、流形学习(Manifold Learning)、K-Means聚类、高斯混合模型、核密度估计。
需要说明的是,这本书主要是讲如何基于Python进行数据分析的,因此书中有现成的案例,这点非常好。但是,因为书中使用到了一些第三方库,Scikt-learn,因此导致没有详细介绍这些算法的核心概念。因此,对于一些基础概念还需要另行google或者百度或者知乎。
昨天把朴素贝叶斯分类器给看了,今天稍微总结一下:
朴素贝叶斯分类器Naive Bayes Classification
朴素贝叶斯模型代表的不是某种算法,而是一系列算法。
几大优点:
- 非常快
- 非常简单
- 非常适合分析超高维的数据
- 几乎没有可调的参数
- 适合快速、粗略的分类问题
贝叶斯分类器
朴素贝叶斯分类器是基于贝叶斯分类方法的。这些都基于贝叶斯定理:
就是一个概率转化,将我们不易观察的概率转换成我们易于观察的概率
在这个公式右边,
P
(
features
∣
L
)
P(\text { features } | L)
P( features ∣L)的取值就成为了关键。在这里,我们引入一个叫做“生成模型”的东西,通过这个模型我们可以轻易的知道
P
(
features
∣
L
)
P(\text { features } | L)
P( features ∣L)的取值。实际上,所谓的训练贝叶斯分类器也就是训练这样的一个“生成模型”。如果要训练一个公版的生成模型非常困难(The general version of such a training step is a very difficult task),然而,我们可以通过引入一些假设(assumption)让这个生成模型可以更容易地获得。引入这些假设之后,我们的分类器也就变成了朴素贝叶斯分类器了。而各式各样不同的假设,使得朴素贝叶斯有多种不同的类别。
下面将介绍高斯朴素贝叶斯(Gaussian Naive Bayes)
高斯朴素贝叶斯
在回顾一下我们要得到的是 P ( features ∣ L ) P(\text { features } | L) P( features ∣L),用文字解释就是:在某个Label中,某特征(features)出现的概率。想想这不就是高斯模型吗,如果我们的特征是符合高斯分布的,根据高斯函数,我们给定一个特征,我们就能计算出该特征出现的概率。是的,我们就假设我们的特征是符合高斯分布的,换句话说,我们要用高斯模型来拟合我们的特征分布。
再简单一点!我们假设特征维度是独立的!那么我们就可以在每个维度上单独进行高斯拟合!根据高斯函数,实际上我们只需要计算各个特征维度的标准差和均值就行了,这个生成模型变得非常简单。
当然,高斯朴素贝叶斯并不是万能的,它的效果是基于它的假设的,也就是说如果我们的假设是背离实际的,那么我们的模型效果肯定也是不理想的。实际上,当特征维度太多的时候,这种方法就不太理想,因为各个特征之间难免存在一些关联,无法做到特征独立。
其它
举个例子,我们要对网络上的新闻进行智能分类,分成体育新闻、时政新闻、娱乐新闻等等。我们想到的是根据一些关键词的统计数量来进行分类,例如体育新闻中提到“竞技、冠军、训练”这些词肯定次数多,那么这个时候,我们用于分类的特征中应该就是一些词的计数值。这种情况下,多项式朴素贝叶斯(Multinomial Naive Bayes)就非常适用。
什么时候适用朴素贝叶斯
- 当我们的假设和数据非常吻合的情况下(实际情况中非常罕见)
- 当类间差异很大的时候,实际上这种时候用什么分类器效果都不错,因此不妨使用简单的朴素贝叶斯
- 当数据维度很大的时候,这点和第二点有点类似,因为当数特征空间维度很大的时候,不同类间的差距也在加大