第一部分:初步认识贝叶斯定理
贝叶斯方法的核心思想和原理基于贝叶斯定理,它主要用于在已有知识(先验信息)基础上结合新的数据或证据,逐步更新对某个事件或参数的信念。
贝叶斯方法的核心思想可以总结为 更新信念:我们通过将新的数据与已有的知识结合起来,更新对未知量(如参数、模型或事件)的概率估计。它打破了传统频率统计中的固定参数概念,而是把参数视为随机变量,允许它们根据新的证据不断变化。
贝叶斯方法的基础理论是“概率统计”
宏观上,数据的处理方式可以分为空间和时间以下两类:
以分类问题为例,我们之前学的判别式,是通过已有的规律训练模型,找到划分的决策边界,通过输入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)就相当于是正则化,泛化能力更强了(考虑到了先验的指导)
如果不理解为什么p(s)相当于是损失函数中的正则化,可以看我博客:最大似然估计MLE和最大化后验MAP和贝叶斯估计-CSDN博客
(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)适用场景
文本分类/垃圾文本过滤/情感判别
多分类实时预测
推荐系统
复杂问题建模