朴素贝叶斯算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯算法相关的知识,希望对你有一定的参考价值。
参考技术A贝叶斯算法是由英国数学家托马斯·贝叶斯提出的,这个算法的提出是为了解决“逆向概率”的问题。首先我们先来解释下正向概率与逆向概率的含义:
正向概率 :假设一个箱子里有5个黄色球和5个白色球,随机从箱子里拿出一个球,请问取出的是黄球的概率是多少?很容易计算P(黄球)= N(黄球)/N(黄球)+ N(白球) = 5/5+5 = 1/2。
逆向概率 :起初我们并不知道箱子里有多少个球,我们依次从箱子里取出10个球,发现这个10个球中有7个白球,3个黄球,那么我们会根据我们观察到的结果去推测箱子里白球与黄球的分布比例大概是7:3,但是我们无法推测出箱子里的球的个数。
贝叶斯算法是一种基于概率统计的机器学习算法,它会计算出每种情况发生的概率,然后对其进行分类,贝叶斯算法经常用于文本分类问题和垃圾邮件过滤问题。假设有一篇新闻报道news report,我们使用贝叶斯算法来判断它们的类别,结果如下:
p(politics|news) = 0.2
p(entertainment|news) = 0.4
p(sports|news) = 0.7
因为p(sports|news)的概率最大,所以我们判断这篇新闻报道为体育类报道。“|”左边为要判断的类别,右边是我们给定的文章。
贝叶斯公式推导
接下来,我们将通过一个例子来推导贝叶斯公式。在一所学校里,男生和女生的比例分别是60%和40%,男生全部穿长裤,女生一半穿长裤,一半穿裙子。现迎面走来一个同学,你只能看清他(她)穿的是长裤,而无法分辨出他(她)的性别,请问他(她)是女生的概率?
下面我们逐步计算这个问题:
假设学校里的学生总数为N。
男生人数:N * P(boys),女生人数:N * P(girls)。
穿长裤的男生人数:N * P(boys) * P(pants|boys),其中P(pants|boys)是条件概率的表达形式,意思是男生中穿长裤的概率。因为男生都穿长裤,所以N * P(boys) * P(pants|boys) = 60% * N。
穿长裤的女生的人数:N * P(girs) * P(pants|girls) = 0.2 * N。
穿长裤的总人数:N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls)
穿长裤的同学是女生的概率:P(girl|pants) = N * P(girs) * P(pants|girls) / N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls) = P(girs)*P(pants|girls) / P(pants),分母用P(pants)表示穿长裤的概率。
最终结果:P(girl | pants) = P(pants | girl) * P(girl) / P(pants)
其中:P(girl)我们称为先验概率,是已知值,在这个例子中P(girl) = 40%。先验概率:根据以往的经验和分析得到的结果,先验概率和其他条件的影响不受样本影响。
P(girl | pants)我们称为后验概率,根据观察到的结果,去反推是女生的概率。
贝叶斯数学表达式
贝叶斯算法在垃圾邮件过滤中的应用
给定一封邮件,判定它是否属于垃圾邮件?用D 来表示这封邮件,注意D 由N 个单词组成。我们用h+ 来表示垃圾邮件,h-表示正常邮件。
有贝叶斯公式可得:
P(h+ | D) = P(D | h+) * P(h+) / P(D)
P(h- | D) = P(D | h-) * P(h-) / P(D)
其中P(h+),P(h-)为先验概率,假如我们有1000封邮件,其中有50封是垃圾邮件,其他都是正常邮件,那么P(h+),P(h-)的概率就是已知的。两个式子的分母都是P(D),所以P(D)对于最终结果的比较是没有影响的。接下来就是要求P(D | h+),P(D | h-)垃圾邮件中或正常邮件中是邮件D的概率。
我们都知道一封邮件是由许多词构成的,所以我们将P(D | h+)的表达式转化为P(d1,d2,d3......dn | h+),就是看垃圾邮件中出现d1,d2...dn这些词的概率是多少。
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 |d1,h+) * P(d3 |d1,d2,h+) ...
这个式子计算起来非常困难,所以在这里我们做一个假设,假设每个词都是独立的并且互不影响,那么这个式子就可以表示为:
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)
P(h+ | D) = P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)* P(h+) / P(D)
上述这个式子我们就称为朴素贝叶斯公式,朴素贝叶斯公式是对贝叶斯公式的简化,它建立在每个条子互相独立的基础上。
在现实生活中,我们写的每一句话中词与词之间肯定是有相互联系,如果没有联系,那么这句话是读不通的。那么为什么朴素贝叶斯能够在计算中使用,首先是计算简单,其次对最终结果的影响非常小。
参考资料
1.唐宇迪,《机器学习与数据分析实战》课程。
2.Peter,《机器学习实战》。
朴素贝叶斯并不朴素
算法简介[1]算法原理贝叶斯公式朴素贝叶斯算法实现数据处理特征工程API贝叶斯算法API[2]高斯朴素贝叶斯多项分布朴素贝叶斯补充朴素贝叶斯伯努利朴素贝叶斯算法代码CNBMNB尾声
算法简介[1]
朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。
算法原理
贝叶斯公式
简单来说是一种通过以往经验数据推断事实结果的一种方式。
但行为经济学家发现,人们在决策过程中往往并不遵循贝叶斯规律,而是给予最近发生的事件和最新的经验以更多的权值,在决策和做出判断时过分看重近期的事件。面对复杂而笼统的问题,人们往往走捷径,依据可能性而非根据概率来决策。这种对经典模型的系统性偏离称为“偏差”。由于心理偏差的存在,投资者在决策判断时并非绝对理性,会行为偏差,进而影响资本市场上价格的变动。但长期以来,由于缺乏有力的替代工具,经济学家不得不在分析中坚持贝叶斯法则。
------《百度百科·贝叶斯公式》
朴素贝叶斯
是贝叶斯算法的简化版,更有利于机器学习模型。至于公式推导请移步:百度百科 ,但在机器学习的过程中必须明白以下几个名词:
先验概率
是指根据以往经验和分析得到的概率。这也是人脑对事物进行判断的最常用方式,对未知事物根据以往经验进行结果推断。
后验概率
是指根据结果信息重新修正的概率。
似然函数
是指根据结果猜原因。根据公式的结果推断参数的最可能的值。
三者关系
在使用贝叶斯定理时,我们通过将先验概率
与似然函数
相乘,随后标准化,来得到后验概率
分布,也就是给出某数据,该不确定量的条件分布。
贝叶斯学派告诉我们,对于一个未知事件的看法,是可以一步一步根据不断观测到的数据(信息)来不断更新我们的先验(Prior)来得到一个更接近事实的后验(Posterior)。
算法实现
数据处理
sklearn官方提供了一个练习的数据集:from sklearn.datasets import fetch_20newsgroups
引入数据集
data = fetch_20newsgroups(subset='all')
x_train,x_test,y_train,y_test = train_test_split(data.data,data.target,train_size=0.25) #分割数据集
特征工程
API
from sklearn.feature_extraction.text import TfidfVectorizer
这是tfidf
的API,专门用于处理文本数据,计算文本单词的权重,具体参照我公号的往期文章。
tf = TfidfVectorizer() #实例化
x_train = tf.fit_transform(x_train) #将训练集进行特征处理
x_test = tf.transform(x_test) # 将测试集放到训练集同维度上进行处理
贝叶斯算法API[2]
高斯朴素贝叶斯
GaussianNB
常用于数据成正态分布,比如身高、智商等自然界的。
多项分布朴素贝叶斯
MultinomialNB
常用于文本分类等。
拉普拉斯平滑曲线
当样本中没有出现特征时概率会出现为0的情况,比如某篇文章通篇在讲云端技术,但不能否认这和娱乐类文章无关(营销号大肆吹捧百度网盘??)。此时加入拉普拉斯参数alpha
防止出现此情况。
补充朴素贝叶斯
ComplementNB
(CNB)在文本分类中,数据往往是不平衡的,补充朴素贝叶斯改进了多项分布朴素贝叶斯。CNB使用来自每个类的补数的统计数据来计算模型的权重。
伯努利朴素贝叶斯
BernoulliNB
实现了用于多重伯努利分布数据的朴素贝叶斯训练和分类算法,即有多个特征,但每个特征 都假设是一个二元 (Bernoulli, boolean) 变量。即特征只有0和1两种,也成零一分布。
算法代码
对于文本分类,更建议使用补充朴素贝叶斯,两种常用的朴素贝叶斯都可以一试,看最后的正确率。
CNB
from sklearn.naive_bayes import MultinomialNB,ComplementNB
cnb = ComplementNB()
cnb.fit(x_train,y_train)
sor = cnb.score(x_test,y_test)
print(sor)
0.8554651574106827
MNB
自己尝试,一般来说准确率不如CNB。
尾声
朴素贝叶斯在目前也常有使用,来分辨垃圾邮件,因为它有着古典数学作为基础。另一方面也符合人类思考的方式:我们根据经验来判断结果,又根据结果修改自己认知来帮助下次判断更加准确。相比k近邻一个个去手动测算距离来推断分类,k近邻更像是机器在干的事。
参考:
[1]: https://baike.baidu.com/item/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF/4925905
[2]: https://sklearn.apachecn.org/docs/master/10.html
以上是关于朴素贝叶斯算法的主要内容,如果未能解决你的问题,请参考以下文章