机器学习训练营(三):朴素贝叶斯(Naive Bayes)

贝叶斯分类理论

简单的说,贝叶斯定理是基于假设的先验概率、给定假设下观察到不同数据的概率,提供了一种计算后验概率的方法。

一、贝叶斯公式定义

Ω \Omega Ω 为试验 E E E 的样本空间, A A A E E E 的事件, B 1 , B 2 , . . . , B n B_1,B_2,...,B_n B1,B2,...,Bn Ω \Omega Ω 的一个划分,且 P ( A ) > 0 P(A)>0 P(A)>0, P ( B i ) > 0 ( i = 1 , 2 , . . . , n ) P(B_i)>0(i=1,2,...,n) P(Bi)>0(i=1,2,...,n),则
P ( B i ∣ A ) = P ( A ∣ B i ) P ( B i ) P ( A ) , i = 1 , 2 , . . . , n . P(B_i|A)=\frac{P(A|B_i)P(B_i)}{P(A)},i=1,2,...,n. P(BiA)=P(A)P(ABi)P(Bi),i=1,2,...,n.
其中 P ( A ) P(A) P(A)也可写为 P ( A ) = ∑ j = 1 n P ( A ∣ B j ) P ( B j ) 。 P(A)=\sum\limits_{j=1}^n P(A|B_j)P(B_j)。 P(A)=j=1nP(ABj)P(Bj)
更一般地,贝叶斯公式可简化为 P ( B ∣ A ) = P ( A ∣ B ) P ( B ) P ( A ) 。 P(B|A)=\frac{P(A|B)P(B)}{P(A)}。 P(BA)=P(A)P(AB)P(B)

P ( A ) P(A) P(A)称为先验概率, P ( B ) P(B) P(B)为后验概率, P ( A ∣ B ) P(A|B) P(AB)是已知 B B B发生后 A A A的条件概率,也被称为 A A A的后验概率, P ( B ∣ A ) P(B|A) P(BA)是已知 A A A发生后 B B B的条件概率,也被称为 B B B的后验概率。

二、贝叶斯算法

基于贝叶斯定理的贝叶斯算法是一类简单常用的分类算法,有严谨的数学理论作支撑。而假设待分类项的各个属性相互独立的情况下,构造出来的分类算法就称为朴素的,即朴素贝叶斯算法。
基本思想是:对于给定的待分类项 X ( a 1 , a 2 , . . . , a n ) , X (a_1,a_2,...,a_n ), X(a1,a2,...,an),求解在此项出现的条件下各个类别 y i y_i yi出现的概率,哪个 P ( y i ∣ X ) P(y_i|X) P(yiX)最大,就把此待分类项归属于哪个类别。

三、贝叶斯算法的优缺点

朴素贝叶斯算法的优点:
1、算法逻辑简单, 易于实现;
2、分类过程中时空开销小;
3、算法稳定,对于不同的数据特点其分类性能差别不大,健壮性比较好。
朴素贝叶斯算法的缺点:
1、朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。
2、需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
3、由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。

算法实践:莺尾花数据集–贝叶斯分类

Step1: 库函数导入
import numpy as np
# 加载莺尾花数据集
from sklearn import datasets
# 导入高斯朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
Step2: 数据导入&分析
X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
Step3: 模型训练
# 使用高斯朴素贝叶斯进行计算
clf = GaussianNB(var_smoothing=1e-8)
clf.fit(X_train, y_train)
Step4: 模型预测
# 评估
y_pred = clf.predict(X_test)
acc = np.sum(y_test == y_pred) /float(len( X_test))
print("Test Acc : %.3f" % acc)

输出为:
在这里插入图片描述

# 预测
y_proba = clf.predict_proba(X_test[:1])
print(clf.predict(X_test[:1]))
print "预计的概率值:", y_proba 

输出为:
在这里插入图片描述
由y_proba知预测为2的概率最大,故clf.predict(X_test[:1])被预测为2。

模拟离散数据集–贝叶斯分类

Step1: 库函数导入
import random
import numpy as np
# 使用先验为伯努利分布的朴素贝叶斯
from sklearn.naive_bayes import  BernoulliNB
from sklearn.model_selection import train_test_split
Step2: 数据导入&分析
# 模拟数据
rng = np.random.RandomState(1)
# 随机生成600个100维的数据,每一维的特征都是[0, 4]之间的整数
X = rng.randint(5, size=(600, 100))
y = np.array([1, 2, 3, 4, 5, 6] * 100)
data = np.c_[X, y]#X和y合并
# X和y进行整体打散
random.shuffle(data)
X = data[:,:-1]
y = data[:, -1]
#此时X和y都是随机排序后的结果
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
Step3: 模型训练&预测
clf =   BernoulliNB(alpha=1.2, binarize=0.0, fit_prior=True, class_prior=None)
clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print("Test Acc : %.3f" % acc)

在这里插入图片描述

# 随机数据测试,分析预测结果,贝叶斯会选择概率最大的预测结果
# 比如这里的预测结果是3,3对应的概率最大,预测结果可能随不同的人不一样
x = rng.randint(5, size=(1, 100))
print(clf.predict_proba(x))
print(clf.predict(x))

在这里插入图片描述
参考链接:
1、十大经典算法朴素贝叶斯讲解PPT
2、朴素贝叶斯算法优缺点
3、sklearn朴素贝叶斯类库(naive_bayes)使用小结

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值