目录
一、概述
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,在给定一个待分类项的情况下,通过学习得到的模型计算各个条件概率,进而得到该待分类项属于各个类别的概率,最后选择概率最大的类别作为待分类项的类别。朴素贝叶斯的基本假设是条件独立性,即假设待分类项的每个特征与其他特征相互独立。这个假设使得计算各个条件概率变得简单,因为只需要单独考虑每个特征与类别的概率关系,而不需要考虑特征之间的相互影响。
二、贝叶斯定理
贝叶斯定理是概率论中的一个定理,它描述了在已知的一些条件下,某事件发生的概率。人对某一事件未来会发生的认知,大多取决于该事件或类似事件过去发生的频率。这就是贝叶斯定理的数学模型,它最早由数学家托马斯·贝叶斯提出。贝叶斯定理的过程可以归纳为:“过去经验”加上“新的证据”得到“修正后的判断”。它提供了一种将新观察到的证据和已有的经验结合起来进行推断的客观方法。在介绍贝叶斯定理前,先为大家引入先验概率、后验概率和条件概率的概念。
2.1 先验概率
先验概率是基于统计的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件。
2.2 条件概率
记事件A发生的概率为P(A),事件B发生的概率为P(B),则在事件B发生的前提下,事件A发生的概率即为条件概率,记为P(A|B)。
2.3 后验概率
则是从条件概率而来,由因推果,是基于当下发生了事件之后计算的概率,依赖于当前发生的条件
2.4 贝叶斯公式
假设有随机事件A和B,则贝叶斯公式如下:
2.5 朴素贝叶斯
2.6 朴素贝叶斯实现的流程
朴素贝叶斯分类器实现的流程通常包括以下几个步骤:
2.6.1. 数据准备:
- 收集并整理数据集,包括特征数据和对应的类别标签。
- 对数据进行预处理,如缺失值处理、数据清洗、特征选择等。
- 将数据集划分为训练集和测试集,通常使用较大的部分作为训练集,较小的部分作为测试集。
2.6.2. 计算先验概率:
- 对于每个类别,计算其在训练集中的频率,即先验概率。
- 先验概率可以通过计算每个类别在训练集中的出现次数除以训练集的总数得到。
2.6.3. 计算似然概率:
- 对于每个特征,计算其在给定类别下的条件概率,即似然概率
- 对于连续特征,通常假设其分布符合高斯分布(正态分布),并计算该分布的参数(均值和方差)。
- 对于离散特征,计算每个可能值在给定类别下的频率。
2.6.4. 模型训练:
- 使用训练集中的数据来计算先验概率和似然概率。
- 保存这些概率值,以便后续用于分类新实例。
2.6.5. 分类预测:
- 对于一个新的实例,计算其在每个类别下的后验概率 。
- 选择具有最高后验概率的类别作为预测结果。
2.6.6. 模型评估:
- 使用测试集来评估模型的性能。
- 计算准确率、召回率、F1分数等指标来衡量模型的分类效果。
- 根据评估结果调整模型参数或特征选择,以提高模型的性能。
2.7.7. 应用模型:
- 将训练好的朴素贝叶斯分类器应用于实际问题,如文本分类、情感分析、垃圾邮件检测等。
朴素贝叶斯分类器的关键在于假设特征之间相互独立,这使得模型计算简单且高效。尽管这个假设在实际应用中往往不成立,但朴素贝叶斯分类器在很多情况下仍然能够提供不错的分类效果。
三、代码实现
3.1 获取数据集
从python中的sklearn库中导入自带的乳腺癌数据集;
# 从sklearn库中获取自带的乳腺癌数据集
from sklearn import datasets
cancers = datasets.load_breast_cancer()
3.2 数据处理
用X存放乳腺癌数据集的患者的具体信息,用Y存放该数据集的目标值(乳腺癌数据集的类别);
#数据处理 划分特征向量和目标向量
X = cancers.data
Y = cancers.target
# 打印特征矩阵(属性)
# print(X.shape)
# 打印标签向量矩阵(分类)
# print(Y.shape)
# 描述数据集的详细信息
# print(cancers.DESCR)
3.3 划分训练集和测试集
在划分训练集和测试集时,调用sklearn库中的train_test_split函数来分割训练集和测试集;
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
3.4 创建朴素贝叶斯模型
以下是分别使用GaussianNB(高斯朴素贝叶斯)、MultinomialNB(多项式朴素贝叶斯)、BernouliNB(伯努利朴素贝叶斯)3种方法创建朴素贝叶斯模型的代码;
#利用高斯朴素贝叶斯创建分类器
from sklearn.naive_bayes import GaussianNB
model_linear1 = GaussianNB()
model_linear1.fit(x_train, y_train)
# 使用多项式贝叶斯创建分类器
from sklearn.naive_bayes import MultinomialNB
model_linear2 = MultinomialNB()
model_linear2.fit(x_train, y_train)
# 使用伯努利贝叶斯创建分类器
from sklearn.naive_bayes import BernoulliNB
model_linear3 = BernoulliNB()
model_linear3.fit(x_train, y_train)
3.5 模型预测与评估
#高斯贝叶斯分类器
train_score1 = model_linear1.score(x_train, y_train)
test_score1 = model_linear1.score(x_test, y_test)
print('高斯贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score1, test_score1))
preresult = model_linear1.predict(x_test)
print(preresult)
print(y_test)
#多项式贝叶斯分类器
train_score2 = model_linear2.score(x_train, y_train)
test_score2 = model_linear2.score(x_test, y_test)
print('多项式贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score2, test_score2))
preresult = model_linear2.predict(x_test)
print(preresult)
print(y_test)
#伯努利贝叶斯分类器
train_score3 = model_linear3.score(x_train, y_train)
test_score3 = model_linear3.score(x_test, y_test)
print('伯努利贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score3, test_score3))
preresult = model_linear3.predict(x_test)
print(preresult)
print(y_test)
3.6 代码汇总
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.naive_bayes import BernoulliNB
# 从sklearn库中获取自带的乳腺癌数据集
cancers = datasets.load_breast_cancer()
#数据处理 划分特征向量和目标向量
X = cancers.data
Y = cancers.target
# print(X.shape) #打印特征矩阵(属性)
# print(Y.shape) #打印标签向量矩阵(分类)
# print(cancers.DESCR) #描述数据集的详细信息
# x_train为训练集的特征值,y_train为训练集的目标值,x_test为测试集的特征值,y_test为测试集的目标值
# 划分训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)
#三种朴素贝叶斯分类方式
#高斯贝叶斯分类器
model_linear1 = GaussianNB()
model_linear1.fit(x_train, y_train)
train_score1 = model_linear1.score(x_train, y_train)
test_score1 = model_linear1.score(x_test, y_test)
print('高斯贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score1, test_score1))
preresult = model_linear1.predict(x_test)
print(preresult)
print(y_test)
#多项式贝叶斯分类器
model_linear2 = MultinomialNB()
model_linear2.fit(x_train, y_train)
train_score2 = model_linear2.score(x_train, y_train)
test_score2 = model_linear2.score(x_test, y_test)
print('多项式贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score2, test_score2))
preresult = model_linear2.predict(x_test)
print(preresult)
print(y_test)
#伯努利贝叶斯分类器
model_linear3 = BernoulliNB()
model_linear3.fit(x_train, y_train)
train_score3 = model_linear3.score(x_train, y_train)
test_score3 = model_linear3.score(x_test, y_test)
print('伯努利贝叶斯训练集的准确率:%f; 测试集的准确率:%f'%(train_score3, test_score3))
preresult = model_linear3.predict(x_test)
print(preresult)
print(y_test)
3.7 运行结果截图
四、实验总结
4.1 优缺点分析:
优点:
1. 简单易懂:朴素贝叶斯分类器的原理相对简单,易于理解和使用。
2. 计算效率高:由于假设特征之间相互独立,模型的计算复杂度较低,适用于处理大量数据。
3. 不需要大量的训练数据:朴素贝叶斯分类器对训练数据的需求相对较小,可以快速构建模型。
4. 可以处理多分类问题:朴素贝叶斯分类器可以同时处理多个类别的分类问题。
缺点:
1. 特征独立性假设:朴素贝叶斯分类器假设特征之间相互独立,但在实际应用中,特征之间往往存在一定的相关性,这可能导致模型的分类效果不佳。
2. 对缺失数据敏感:朴素贝叶斯分类器对缺失数据较为敏感,需要额外的预处理步骤来处理缺失值。
3. 不适用于特征数量远大于样本数量的情况:当特征数量远大于样本数量时,模型的计算可能会遇到数值稳定性问题。
4.2 总结
在本次实验中,我们使用了朴素贝叶斯分类器对给定的数据集进行分类。首先,我们对数据进行了预处理,包括数据清洗、特征选择等。然后,我们将数据集划分为训练集和测试集,并使用训练集来计算先验概率和似然概率。接着,我们使用测试集来评估模型的性能,并计算了准确率、召回率、F1分数等指标。
实验结果显示,朴素贝叶斯分类器在处理大量数据时表现出较高的分类准确性和效率。特别是在特征之间相互独立的条件下,模型能够提供较好的分类效果。然而,我们也发现当特征之间存在较强相关性时,模型的性能会受到影响。综上所述,朴素贝叶斯分类器是一种简单有效的分类方法,适用于特征之间相互独立的场合。然而,当特征之间存在较强相关性时,需要考虑其他更复杂的分类算法。在实际应用中,我们需要根据具体问题和数据集的特点来选择合适的分类方法。