朴素贝叶斯并不朴素

Posted 新青年TALKS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯并不朴素相关的知识,希望对你有一定的参考价值。

算法简介[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

以上是关于朴素贝叶斯并不朴素的主要内容,如果未能解决你的问题,请参考以下文章

回归的朴素贝叶斯

机器学习—朴素贝叶斯

朴素贝叶斯算法

概率学习——朴素贝叶斯算法

朴素贝叶斯之实践篇

数据挖掘十大经典算法(1)——朴素贝叶斯(Naive Bayes)