1、理解朴素贝叶斯
朴素贝叶斯(Naive Bayes)是基于贝叶斯定理的一种简单概率分类器,其特点是在特征间假设了强独立性。尽管这种假设在实际中往往不成立,朴素贝叶斯在诸如文本分类和垃圾邮件识别等领域却展现出了良好的性能。贝叶斯定理提供了一种计算条件概率的方法,即在已知某条件下事件发生的概率。朴素贝叶斯利用这一原理来计算给定特征集下某个类别的后验概率。这个计算过程涉及到将类别的先验概率与特征给定类别的概率相乘,然后规范化这些概率。
朴素贝叶斯的主要变体包括高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯,它们分别适用于不同类型的数据分布和分类问题。这种算法的优点在于实现简单、计算效率高、适用于高维数据,且能处理缺失数据和不相关特征。然而,由于忽略了特征间的相关性,朴素贝叶斯的模型精度可能受到影响。尽管有这些限制,朴素贝叶斯因其在实际应用中的有效性而广受欢迎,特别是在需要快速处理大量数据并做出预测决策的场景中。
2、scikit-learn
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,假设各特征之间相互独立。在scikit-learn库中,提供了几种朴素贝叶斯模型,包括高斯朴素贝叶斯(GaussianNB
)、多项式朴素贝叶斯(MultinomialNB
)和伯努利朴素贝叶斯(BernoulliNB
),适用于不同类型的数据集。
1)安装命令
pip install scikit-learn
2)导入所需模块
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score
3、数据集
手写数字数据集,通常称为digits数据集,是机器学习和模式识别领域中用于分类算法实验的一个经典数据集。它包含了从0到9的手写数字的1797个样本,每个样本是一个8x8像素的图像,因此每个图像可以被视为一个64维的向量。这个数据集通常用于测试和演示分类算法,如支持向量机(SVM)、随机森林、k近邻(k-NN)和线性判别分析(LDA)等。手写数字数据集(通常称为"Digits"数据集)包含了1797个手写数字的图像,每个图像为8x8像素的灰度图。这个数据集经常被用作机器学习入门项目,特别是在分类算法的教学和实践中。
使用 scikit-learn 加载手写数字数据集代码如下,
from sklearn.datasets import load_digits digits = load_digits() X = digits.data # 特征矩阵 y = digits.target # 目标值 print(X) print(y)
4、划分数据集
使用train_test_split
函数将数据集划分为训练集和测试集,train_test_split
函数是Scikit-Learn库中一个非常重要的工具。常用参数如下,
参数 | 描述及类型 |
arrays | 输入数据,可以是列表、numpy数组、 pandas的DataFrame或Series, 通常包括特征数据X 和标签 y。 |
test_size | 测试集占比,介于0到1之间的浮点数或整数, 指定测试集在数据集中所占的比例或样本数量。 |
train_size | 训练集占比,介于0到1之间的浮点数或整数, 指定训练集在数据集中所占的比例或样本数量。 通常,只设置 test_size 或 train_size 之一即可。 |
random_state | 控制数据分割的随机性。 整数或RandomState实例。 通过设置相同的值, 可以确保每次运行代码时数据以相同的方式分割。 |
shuffle | 是否在分割之前对数据进行洗牌。 布尔值,默认为True 。如果设置为 False, 则不打乱数据, 直接按顺序分割。 |
stratify | 用于进行分层抽样的标签数组。 数组型数据。设置这个参数后, train_test_split 会以此数组中的类 分布比例来分割数据, 确保训练集和测试集中 各类数据的比例与原始数据集相同。 |
使用代码,
from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split # 加载手写数字数据集 digits = load_digits() # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.2, random_state=42) # 输出分割后的结果大小 print("训练集数据点数量: ", X_train.shape[0]) print("测试集数据点数量: ", X_test.shape[0])
5、训练朴素贝叶斯模型
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,假设特征之间相互独立。对于手写数字识别这样的任务,高斯朴素贝叶斯通常是一个不错的选择,因为它假设特征遵循正态分布。Python 的scikit-learn 库中,使用 GaussianNB
类实现,常用参数如下,
参数 | 类型 | 描述 |
priors | 数组 | 类别的先验概率。形状为 ( 则先验不再根据数据自动调整。 可以用于基于先前知识调整模型的偏好。 |
var_smoothing | 浮点数 | 为了保证计算稳定性, 所有特征的方差都会增加一小部分的最大方差。 用于防止在计算概率时出现除以零的错误。 |
使用代码,
# 导入必要的库 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 加载手写数字数据集 digits = datasets.load_digits() X = digits.data y = digits.target # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) # 初始化高斯朴素贝叶斯分类器 gnb = GaussianNB() # 训练模型 gnb.fit(X_train, y_train) # 预测测试集 y_pred = gnb.predict(X_test) # 计算并打印准确率 accuracy = accuracy_score(y_test, y_pred) print(f'模型准确率: {accuracy}')