机器学习之贝叶斯定理,看这一篇就够了!

第一部分:初步认识贝叶斯定理

贝叶斯方法的核心思想和原理基于贝叶斯定理,它主要用于在已有知识(先验信息)基础上结合新的数据或证据,逐步更新对某个事件或参数的信念。

贝叶斯方法的核心思想可以总结为 更新信念:我们通过将新的数据与已有的知识结合起来,更新对未知量(如参数、模型或事件)的概率估计。它打破了传统频率统计中的固定参数概念,而是把参数视为随机变量,允许它们根据新的证据不断变化。

贝叶斯方法的基础理论是“概率统计

宏观上,数据的处理方式可以分为空间和时间以下两类:

以分类问题为例,我们之前学的判别式,是通过已有的规律训练模型,找到划分的决策边界,通过输入x判断y的值,所以叫做判别式。

而现在的生成式模型,不需要决策边界,求的是条件概率分布个联合概率分布求得各个分类类别之间,谁的概率大,就分给哪一个类别。

第二部分:贝叶斯公式

p(s):叫做先验prior

p(o|s):条件概率,可能性,最大似然估计likelihood

p(o):观测的数据Evidence,Marginal,Normaligation

p(s|o):叫做后验:posterior

第三部分:参数估计

一般来说p(o)都是已知的,我们将其视为常数。

(1)最大似然估计(Maximum Likelihood Estimation, MLE)

不需要先验p(s)

MLE 直接最大化似然函数 p(o∣s)

(求的不是概率,而是最大化概率下对应的参数值s)

频率学派使用MLE,班级里的学渣

(2)最大后验估计(Maximum A Posteriori Estimation, MAP)

通过使用:先验概率 p(s)和数据的似然函数 p(o∣s)

求的是最大化后验概率的参数p(s∣o)

即找到使得观测数据 o在给定参数 s 下出现概率最大的参数 s。(求的不是概率,而是最大化概率下对应的参数值s)

贝叶斯学派使用MAP,班级里的学霸(在MLE的基础上加上先验p(s),这里不说p(o)是因为它一般是已知的,当作常数)

这个先验p(s)就相当于是正则化,泛化能力更强了(考虑到了先验的指导)

(3)贝叶斯估计Bayesian Estimation

贝叶斯估计求的是参数的后验分布p(s∣o)

贝叶斯估计属于学神,他是最大后验估计的扩展,最大后验估计求的是参数s的值,而贝叶斯估计直接球的就是这个概率值p(s∣o)

直接求出后验分布

先验很重要

泛化效果更好。

第四部分:朴素贝叶斯(朴素二字来自特征之间符合某种假设)

举个例子:

我们现在有以上这些数据,现在来了一个新人,已知的特征是:本土,非密接,年轻,接种疫苗,但是不知道到底是阴性还是阳性:

我们现在的目标就是求一下这两个的概率,谁大结果就是谁!

基于我们上面的贝叶斯公式,我们可以得到详细的计算公式:

在朴素贝叶斯假设中,条件独立性是核心假设之一。具体来说,朴素贝叶斯假设各个特征在给定类别(如阳性或阴性)的条件下是相互独立的,这意味着每个特征的发生概率仅依赖于类别标签,而不依赖于其他特征。

这一假设的好处是便于计算最终结果,简化计算,但是坏处就是牺牲了一定的准确性。

所以:

进而得到:

这两个的分母一样,因此我们比较分子就可以了

然后我们根据表中的数据计算得到:

第一个阳性的分子为:

(1/2)x(1/6)*(1/6)*(1/6)*(1/2)=1/864

第二个阴性的分子为:

(1/6)*(1/2)*(1)*(1/2)*(1/2)=1/48

由于第二个的大,所以归为阴性。

第五部分:朴素贝叶斯分类

(1)伯努利分布

(2)高斯朴素贝叶斯

第六部分:朴素贝叶斯代码实现

(1)第四部分朴素贝叶斯中的“阳性阴性”为例,探究单个朴素贝叶斯公式(这里以伯努利朴素贝叶斯为例)

①导包

#第一部分:导包
import numpy as np

②创建数据集

#第二部分:获取数据集
#X代表特征矩阵
X = [[1, 0, 0, 1],
     [0, 1, 0, 0],
     [1, 1, 0, 0],
     [0, 1, 2, 0],
     [1, 0, 0, 0],
     [1, 0, 0, 0],
     [1, 1, 2, 1],
     [0, 1, 1, 0],
     [1, 1, 1, 0],
     [1, 0, 2, 0],
     [1, 1, 0, 1],
     [1, 1, 0, 1]]
#代表标签
y = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0]
#代表测试样本
t = [[0, 0, 0, 1]]

③使用伯努利朴素贝叶斯

#第三部分:使用朴素贝叶斯进行训练
#3.1伯努利朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
bnb = BernoulliNB()
bnb.fit(X, y)
print(bnb.predict_proba(t))

由于第一个比较大,所以分类为阴性。

④完整pycharm代码

#第一部分:导包
import numpy as np
#第二部分:获取数据集
#X代表特征矩阵
X = [[1, 0, 0, 1],
     [0, 1, 0, 0],
     [1, 1, 0, 0],
     [0, 1, 2, 0],
     [1, 0, 0, 0],
     [1, 0, 0, 0],
     [1, 1, 2, 1],
     [0, 1, 1, 0],
     [1, 1, 1, 0],
     [1, 0, 2, 0],
     [1, 1, 0, 1],
     [1, 1, 0, 1]]
#代表标签
y = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0]
#代表测试样本
t = [[0, 0, 0, 1]]
#第三部分:使用朴素贝叶斯进行训练
#3.1伯努利朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
bnb = BernoulliNB()
bnb.fit(X, y)
print(bnb.predict_proba(t))

(2)对比5种贝叶斯公式的效果

我们使用鸢尾花数据集为例,他的数据特征是连续且多分类的:

①导包

#第一部分:导包
import numpy as np

②创建数据集

#第二部分:创建数据集
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

③分割数据集

#第三部分:分割数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

④使用朴素贝叶斯-伯努利朴素贝叶斯

#第四部分:使用朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
nb = BernoulliNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

可以看出来,效果非常不好,因为伯努利适用的是离散的数据,并且是二分类

⑤使用朴素贝叶斯-高斯朴素贝叶斯

#4.2高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

效果非常好,因为高斯朴素贝叶斯就适合用于连续型数据。

⑥使用朴素贝叶斯-CategoricalNB(类别型朴素贝叶斯)

#4.3使用朴素贝叶斯-CategoricalNB(类别型朴素贝叶斯)
from sklearn.naive_bayes import CategoricalNB
nb = CategoricalNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

⑦使用朴素贝叶斯-(多项式朴素贝叶斯)

#4.3使用朴素贝叶斯-(多项式朴素贝叶斯)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

⑧使用朴素贝叶斯-ComplementNB(补集朴素贝叶斯)

#4.5使用朴素贝叶斯-ComplementNB(补集朴素贝叶斯)
from sklearn.naive_bayes import ComplementNB
nb = ComplementNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

⑨上述完整pycharm代码汇总

#第一部分:导包
import numpy as np
#第二部分:创建数据集
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target

#第三部分:分割数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
#第四部分:使用朴素贝叶斯
"""
#4.1伯努利朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
nb = BernoulliNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))
"""
"""
#4.2高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))
"""
'''
#4.3使用朴素贝叶斯-CategoricalNB(类别型朴素贝叶斯)
from sklearn.naive_bayes import CategoricalNB
nb = CategoricalNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))

'''
"""
#4.4使用朴素贝叶斯-(多项式朴素贝叶斯)
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))
"""
#4.5使用朴素贝叶斯-ComplementNB(补集朴素贝叶斯)
from sklearn.naive_bayes import ComplementNB
nb = ComplementNB()
nb.fit(X_train, y_train)
print(nb.score(X_test, y_test))


第七部分:多项式朴素贝叶斯代码实现(多项式分类实现文本分类任务)

(1)导包

#第一部分:导包
import numpy as np

(2)获取数据集

#获取数据集
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
X = news.data
y = news.target

(3)划分数据集

#第三部分:分割数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)

(4)特征提取(因为这个里面全是文本数据,不是数字,所以要把文本提取他们的特征,才能进行处理)

#第四部分:特征提取(因为这个里面全是文本数据,不是数字,所以要把文本提取他们的特征,才能进行处理)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(stop_words='english')#停用词,消除噪音的
vec.fit_transform(X)
X_train_vec = vec.transform(X_train)
X_test_vec = vec.transform(X_test)

(5)使用多项式朴素贝叶斯进行训练模型

#第五部分:
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train_vec, y_train)
print(nb.score(X_test_vec, y_test))

(6)详细输出训练信息

#第六部分:详细输出训练信息
y_predict = nb.predict(X_test_vec)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict, target_names=news.target_names))

(7)完整pycharm代码汇总

#第一部分:导包
import numpy as np
#划分数据集
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
X = news.data
y = news.target
#第三部分:分割数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0)
#第四部分:特征提取(因为这个里面全是文本数据,不是数字,所以要把文本提取他们的特征,才能进行处理)
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(stop_words='english')#停用词,消除噪音的
vec.fit_transform(X)
X_train_vec = vec.transform(X_train)
X_test_vec = vec.transform(X_test)
#第五部分:使用多项式朴素贝叶斯进行训练模型
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train_vec, y_train)
print(nb.score(X_test_vec, y_test))
#第六部分:详细输出训练信息
y_predict = nb.predict(X_test_vec)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict, target_names=news.target_names))

第八部分:贝叶斯定理的优缺点以及适用范围

(1)优点

过程简单速度快;

对多分类问题一样有效

分布独立假设下效果好

贝叶斯思想光芒万丈,“先验”思想打开一扇大门

一般来说比逻辑回归要好。

(2)缺点

条件独立假设在现实中往往很难保证

只适用于简单比大小问题

如果个别类别概率为0,则预测失败(比如说预测一个第一次出现的数,它之前都没出现过,自然计算的结果都是0,出现没法比较的现象)(“平滑”/“拉普拉斯变换”等来解决这一问题)

条件概率和先验分布计算复杂度较高,高维计算困难

(3)适用场景

文本分类/垃圾文本过滤/情感判别

多分类实时预测

推荐系统

复杂问题建模

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值