Python朴素贝叶斯算法代码2025年1月5日 | 17 分钟阅读 假设您是一名产品经理,希望将客户评价分为好评和差评两类。或者作为贷款经理,您希望识别哪些贷款申请人是安全的,哪些是危险的?作为一名医疗分析师,您希望预测哪些人会患糖尿病。在所有情况下,都存在对评论、贷款申请和患者进行分类的问题。 朴素贝叶斯是最简单、最快速的分类技术,适用于处理大量数据。许多应用程序,包括垃圾邮件过滤、文本分类、情感分析和推荐系统,都成功地使用了朴素贝叶斯分类器。它应用贝叶斯概率定理进行类别预测。 分类工作流程进行分类时,第一步是理解问题,找到潜在特征,并给它们分配标签。特征是那些影响标签结果的特性或品质。例如,银行管理层会了解客户的就业、收入、年龄、位置、过往贷款记录、交易记录和信用评分,以进行贷款发放。这些特性被称为帮助模型对客户进行分类的特征。 分类过程由学习阶段和评估阶段组成。分类器在学习阶段使用给定的数据集训练其模型,并在评估阶段评估性能。性能根据准确度、误差、精确度和召回率等多种因素进行评估。 ![]() 什么是朴素贝叶斯分类器?朴素贝叶斯是一种基于贝叶斯定理的统计分类方法。它是最简单的监督学习方法之一。朴素贝叶斯分类器是一种快速、准确、可靠的方法。在大型数据集上,朴素贝叶斯分类器执行速度快且准确。 朴素贝叶斯分类器假设单个特征对类别的影响与其他特征的影响无关。例如,贷款申请人的适用性取决于他们的收入、贷款和交易历史、年龄和地理位置等因素。这些特征仍然被单独考虑,尽管它们是相互关联的。这种假设被认为是朴素的,因为它使计算更容易。这种假设被称为“类别条件独立性”。 ![]()
朴素贝叶斯分类器如何运作?让我们用一个例子更好地理解朴素贝叶斯的工作原理。以玩体育和天气为例。您应该确定参与体育的可能性。您现在应该根据天气对参与者是否会玩进行分类。 第一种方法(在单个特征的情况下):朴素贝叶斯分类器执行以下计算来确定事件的可能性 在步骤 2 中确定每个类别中每个特征的可能性概率。在步骤 3 中确定给定类别标签的先验概率。将这些值输入贝叶斯公式并计算后验概率。 步骤 4:确定输入属于较高概率类别时,哪个类别的可能性更大。 频率表和似然表这两个表可以简化先验和后验概率的计算。可以使用其中任何一个表来计算先验和后验概率。频率表列出了每个特征的标签频率。显示了两个概率表。似然表 1 显示了标签的先验概率,而似然表 2 显示了后验概率。 ![]() 您想确定在多云天气下玩耍的可能性。 参与的可能性P(是 | 阴天) 等于 P(是 | 阴天)。P (是) / P (阴天) .....................(1) 确定先验概率 P(阴天) = 4/14 = 0.29 P(是) = 9/14 = 0.64 首先,确定后验概率。 P(阴天 | 是) = 4/9 = 0.44 使用先验和后验概率填写方程 (1)。P (是 | 阴天) = 0.44 * 0.64 / 0.29 = 0.98 (更高)。 同样,您可以确定不参与的可能性不参与的几率:P(否 | 阴天) = P(否 | 阴天)。P(否) / P (阴天)..........(2) 确定先验概率 P(阴天) = 4/14 = 0.29 P(否) = 5/14 = 0.36 首先,确定后验概率。 P(阴天 | 否) = 0/9 = 0。 1. 将过去和未来的概率包含在方程 (2) 中。 P (否 | 阴天) 等于 0*0.36/0.29,即零。 “是”类别的可能性更大。因此,您可以评估如果天气多云,参与者是否会参与这项运动。 第二种方法(当存在多个特征时)![]() 您想确定在多云和温暖的天气下玩耍的可能性。 参与的可能性P(天气=阴天, 温度=温和 | 玩= 是) = (玩= 是 | 天气= 阴天, 温度=温和)P(玩=是) (1) P(玩=是, 天气=阴天, 温度=温和)=P(阴天 |是) P(温和 |是)..........(2)
同样,您可以确定不参与的可能性 不参与的可能性P(天气=阴天, 温度=温和 | 玩= 否) = (玩= 否 | 天气= 阴天, 温度=温和)P(玩=否)... (3) 天气:阴天,温和,玩:否,P(天气:阴天 | 玩:否) P(温度=低 | 玩=无) ………..(4)
“是”类别的可能性更大。因此,可以得出结论,当天空阴沉时,运动员将参加他们的运动。 朴素贝叶斯分类器使用合成数据集在 Scikit-Learn 中构建 在第一个示例中,我们将使用 scikit-learn 创建人工数据,然后训练和评估高斯朴素贝叶斯算法。 建立数据集 为了创建数据集和测试多种机器学习算法,Scikit-learn 为我们提供了一个机器学习环境。 在此实例中,正在使用“make_classification”函数创建包含六个特征、三个类别和 800 个样本的数据集。 说明 此代码导入了 sklearn.datasets 模块中的 make_classification 函数。
为了显示数据集,我们将使用 matplotlib.pyplot 中的散点图函数。 说明 在导入 matplotlib.pyplot 模块后,使用 scatter() 方法生成散点图。
正如我们所看到的,有三种不同的目标标签类型,我们将开发一个多类分类模型。 划分训练集和测试集在开始训练过程之前,我们必须将数据集分为训练集和测试集,以便进行模型评估。 说明
模型构建与训练构建一个通用高斯朴素贝叶斯模型,然后使用训练数据对其进行训练。然后,将随机测试样本输入模型以获得预测值。 说明 此代码使用 scikit-learn 包创建高斯朴素贝叶斯分类器。
输出 Actual Value: 0 Predicted Value: 0 模型评估我们不会在尚未看到的测试数据集上训练模型。首先,我们将对测试数据集的值进行预测,并利用这些预测来计算准确率和 F1 分数。 输出 Accuracy: 0.8484848484848485 F1 Score: 0.8491119695890328 说明
F1 分数,通过考虑精确度和召回率来衡量模型的准确性,为 0.8491119695890328。更高的 F1 值表示模型性能更好。 计算混淆矩阵的真阳性和真阴性时,我们将使用“confusion_matrix”函数。显示带有标签的混淆矩阵时,我们将使用“ConfusionMatrixDisplay”函数。 说明 此代码中使用 ConfusionMatrixDisplay 生成混淆矩阵,使用 scikit-learn 模块。
我们可以通过缩放、预处理交叉验证和超参数调整来提高模型性能。我们的模型表现相当不错。 带有朴素贝叶斯分类器的贷款数据集让我们使用实际数据集来训练朴素贝叶斯分类器。除了数据探索和准备,我们将重复大部分操作。 数据加载在此示例中,我们将使用 pandas 的“read_csv”方法从 DataCamp Workspace 加载贷款数据。 说明
数据探索'.info()' 将用于了解有关数据集的更多信息。
说明 此 Python 程序在带有标识符 df 的 Pandas DataFrame 对象上调用 info() 函数。 为了快速了解 DataFrame 的结构和内容,info() 函数提供了 DataFrame 的摘要,包括行数和列数、每列的数据类型以及每列中的非空值数量。 说明 此代码片段显示了一个包含 9578 个条目和 14 列的数据集的摘要。
在这种情况下,我们将创建一个模型来识别尚未全额偿还贷款的客户。让我们使用 Seaborn 的 countplot 来检查目的和目标列。 说明 此 Python 工具 seaborn 和 matplotlib 用于计算 df 数据框中的目的列,并使用 not.fully.paid 列按颜色分隔条形图。
我们数据集中的不平衡将影响模型的性能。要获得处理不平衡数据集的实践经验,请参阅教程“重采样不平衡数据集”。 数据处理现在我们将使用 pandas 的“get_dummies”方法将分类“purpose”列转换为整数。 说明 此代码使用 Python pandas 包为 DataFrame 'df' 的 'purpose' 列生成虚拟变量。
一旦我们指定了特征 (X) 和目标 (Y) 变量,数据集将被划分为训练集和测试集。 说明 此代码从 sklearn.model_selection 模块导入 train_test_split 函数。
模型构建与训练构建和训练模型非常容易。在训练数据集上,我们将训练一个具有默认超参数的模型。 说明 此代码中使用 from sklearn.naive_bayes import GaussianNB 行从 Scikit-Learn 库导入高斯朴素贝叶斯算法。
模型评估我们将使用准确率和 F1 分数来衡量模型性能,高斯朴素贝叶斯方法表现得相当不错。 说明 此代码从 sklearn.metrics 模块导入 accuracy_score、confusion_matrix、ConfusionMatrixDisplay、f1_score 和 classification_report 方法。
然后,代码使用 print 函数将准确率和 F1 分数报告到控制台。f1_score 函数计算 F1 分数,它是精确度和召回率的加权平均值。 说明 此代码片段是某些代码运行的结果,而不是实际代码本身。
我们可以观察到,由于数据不平衡,混淆矩阵提供了不同的叙述。在少数目标“未全额支付”中发现了更多错误标记的数据。 说明 此代码片段可用于绘制二元分类问题的混淆矩阵。
如果您在训练或模型评估方面需要帮助,请查看带有 Scikit-learn Workspace 的朴素贝叶斯分类教程。它包括数据集、源代码和结果。 零概率问题如果数据集中不存在危险贷款的元组,则后验概率将为 0,模型将无法预测任何内容。此问题被称为零概率,因为不存在该特定类别的实例。 拉普拉斯校正或拉普拉斯变换可用于解决此类问题。拉普拉斯调整是一种实现平滑的方法。在这里,您可以假设数据集足够大,如果您添加每种类型的一行,估计的概率将保持不变。这将解决概率值为零的问题。 例如,假设数据库包含 1000 个类别为贷款风险的训练元组。此数据库的收入字段中,低收入有 0 个元组,中等收入有 990 个,高收入有 10 个。如果没有拉普拉斯调整,这些事件的几率分别为 0、0.990(来自 990/1000)和 0.010(来自 10/1000)。 现在对给定的数据集应用拉普拉斯调整。对于每个收入-值对,让我们再添加一个元组。这些事件的可能性 优点
缺点
结论您已完成本教程,恭喜! 在本课程中,您学习了朴素贝叶斯方法、其工作原理、假设问题、其实现以及其优缺点。您还学习了在 scikit-learn 中为二元和多项式类别开发和评估模型。 最基本和最有效的方法是朴素贝叶斯。即使机器学习在过去几年取得了巨大进步,它仍然证明了其有用性。它已成功应用于各种应用程序,包括文本分析和推荐引擎。 下一个主题Python 预测算法 |
我们请求您订阅我们的新闻通讯以获取最新更新。