朴素贝叶斯算法及其代码实现


朴素贝叶斯

朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。在机器学习分类算法中,朴素贝叶斯和其他绝多大的分类算法都不同,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。但是朴素贝叶斯却是生成方法,这种算法简单,也易于实现。

1.基本概念

朴素贝叶斯:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类时贝叶斯分类中最简单,也是最常见的一种分类方法。

贝叶斯公式

image-20220204145355488

先验概率P(X):先验概率是指根据以往经验和分析得到的概率。

后验概率P(Y|X):事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小,后验分布P(Y|X)表示事件X已经发生的前提下,事件Y发生的概率,叫做事件X发生下事件Y的条件概率。

后验概率P(X|Y):在已知Y发生后X的条件概率,也由于知道Y的取值而被称为X的后验概率。

朴素:朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思,那么贝叶斯公式中的P(X|Y)可写成:

img

朴素贝叶斯公式

img

2,贝叶斯算法简介

  贝叶斯方法源域它生前为解决一个“逆概”问题写的一篇文章。其要解决的问题:

  正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大

  逆向概率:如果我们事先不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或者好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例做出什么样的推测。

  那么什么是贝叶斯呢?

  • 1,现实世界本身就是不确定的,人类的观察能力是有局限性的
  • 2,我们日常观察到的只是事物表明上的结果,因此我们需要提供一个猜测

  NaiveBayes算法,又称朴素贝叶斯算法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现监督,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。

  朴素贝叶斯会单独考量每一维独立特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,朴素贝叶斯的基本数据假设是:各个维度上的特征被分类的条件概率之间是相互独立的。它经常被用于文本分类中,包括互联网新闻的分类,垃圾邮件的筛选。

  朴素贝叶斯分类时一种十分简单的分类算法,叫他朴素贝叶斯分类时因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,即认为此待分类项属于哪个类别。

3.贝叶斯算法的推导过程

联合概率:表示两件事共同发生(数学概念上的交集)的概念,A和B的联合概率表示为

P(AnB)。

  根据条件概率的定义,在事件B发生的条件下事件A发生的概率为:

img

  同样地,在事件A发生的条件下事件B发生的概率为:

img

  结合这两个方程式,我们可以得到:

img

  这个引理有时称为概率乘法规则。上式两边同时除以P(A),若P(A)是非零的,我们可以得到贝叶斯定理:
img

事件X在事件Y发生的条件下的概率,与事件Y在事件X发生的条件下的概率是不一样的;然而这两者是有确定关系的,贝叶斯定理就是这种关系的陈述。

img

4.朴素贝叶斯分类的优缺点

优点:

(1) 算法逻辑简单,易于实现

(2)分类过程中时空开销小

缺点:

理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

5.代码实现

import pandas as pd
import numpy as np
import time
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB, BernoulliNB, MultinomialNB
from sklearn.metrics import precision_score, recall_score
from sklearn.metrics import f1_score

data = np.load('datapca.npz')
word_vector = data['word_vectors']
label = data['label']

X_train, X_test, y_train, y_test = train_test_split(word_vector,label, test_size=0.8, random_state=int(time.time()))

gnb = GaussianNB()
gnb.fit(
X_train,
y_train
)

y_pred = gnb.predict(X_test)
y_pred.shape
y_test.shape
y_test[0]

right=0
for i in range(len(y_pred)):
if(y_pred[i]==y_test[i]):
right+=1
print("accuracy:%f"%(right/len(y_pred)))
print("precision:%f"%(precision_score(y_test, y_pred)))
print("recall:%f"%(recall_score(y_test, y_pred)))
print("f1:%f"%(f1_score(y_test, y_pred)))

6.数据

链接:https://pan.baidu.com/s/1fmccMOFenxeWJtSE_GB4nw?pwd=6666
提取码:6666
降维前 accuracy:0.553063 降维后accuracy:0.917209
precision:0.953216 precision:0.979962
recall:0.507788 recall:0.923435
f1:0.662602 f1:0.950859

参考文章:

1.[Python机器学习笔记:朴素贝叶斯算法 - 战争热诚 - 博客园 (cnblogs.com)](https://www.cnblogs.com/wj-1314/p/10560870.html#:~:text=Python机器学习笔记:朴素贝叶斯算法. 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。.,对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。. 比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。. 但是朴素贝叶斯却是生成方法,该算法原理简单,也易于实现。.)

2.带你理解朴素贝叶斯分类算法 - 忆臻的文章 - 知乎 https://zhuanlan.zhihu.com/p/262621511. 1.


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM