原力注入

动手学机器学习朴素贝叶斯算法

0.往期文章

  1. 动手学机器学习逻辑回归算法

  2. 动手学机器学习支持向量机

  3. 动手学线性回归算法

  4. 动手学决策树算法

  5. KNN 算法简介

  6. 分类模型评估工具 - 混淆矩阵

源代码:https://github.com/ForceInjection/hands-on-ML/blob/main/nju_software/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF.ipynb

1. 引言

Image

在机器学习领域,朴素贝叶斯算法以其简单高效而备受青睐,尤其适用于文本分类等场景。本文将深入探讨朴素贝叶斯算法的原理、数学推导,并通过实战案例帮助读者掌握其应用。

2. 背景

2.1 贝叶斯定理

贝叶斯定理是朴素贝叶斯算法的理论基础,它描述了在已知某些条件下,事件发生的概率。公式如下:

其中:

  •  是后验概率,即已知  发生后  发生的概率;
  •  是似然,即已知  发生后  出现的概率;
  •  是先验概率,即  发生的概率;
  •  是边缘概率,即  出现的概率。

2.1 计算示例

问题:某 AI 公司招聘工程师,8 名应聘者中有 5 名是 985 院校毕业的,另外 3 人不是。985 毕业生做对算法题的概率是 80%,非985毕业生做对率只有 30%。随机选中的小甲做对了题目,那么小甲是985院校毕业的概率是多少?

解答: 设:

  •  为事件“小甲是985院校毕业的”;
  •  为事件“小甲做对了题”。

根据贝叶斯定理:

计算各项概率:

  1. 先验概率 ,;
  2. 似然概率 ,;
  3. 全概率 。

代入公式:

结论:小甲是985院校毕业生的概率约为 81.63%。

朴素贝叶斯算法原理及数学推导

朴素贝叶斯算法基于贝叶斯定理,并假设特征之间条件独立。对于给定的输入 ,计算其属于每个类别  的概率,并选择概率最大的类别作为预测结果:

根据贝叶斯定理和条件独立性假设:

训练阶段

  1. 先验概率:;
  2. 条件概率:,其中  是拉普拉斯平滑参数, 是特征的取值个数。

预测阶段

对于新样本 ,计算每个类别  的概率:

选取最大概率的类别作为预测结果。

经典案例实战(鸢尾花分类)

实战代码

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineimport numpy as npfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import GaussianNBfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 加载鸢尾花数据集iris = load_iris()X = iris.data  # 特征矩阵y = iris.target  # 目标标签
# 将数据集划分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建高斯朴素贝叶斯分类器gnb = GaussianNB()
# 使用训练数据训练模型gnb.fit(X_train, y_train)
# 使用测试数据进行预测y_pred = gnb.predict(X_test)
# 计算预测准确率accuracy = accuracy_score(y_test, y_pred)print(f"模型准确率: {accuracy:.2f}")
# 输出分类报告print("分类报告:")print(classification_report(y_test, y_pred, target_names=iris.target_names))
# 输出混淆矩阵print("混淆矩阵:")print(confusion_matrix(y_test, y_pred))

运行结果

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line模型准确率: 0.98分类报告:              precision    recall  f1-score   support
      setosa       1.00      1.00      1.00        19  versicolor       1.00      0.92      0.96        13   virginica       0.93      1.00      0.96        13
    accuracy                           0.98        45   macro avg       0.98      0.97      0.97        45weighted avg       0.98      0.98      0.98        45
混淆矩阵:[[19  0  0] [ 0 12  1] [ 0  0 13]]

模型准确率通常较高,例如可能达到 0.98。分类报告和混淆矩阵显示模型对各类别的分类效果良好,表明朴素贝叶斯分类器在鸢尾花数据集上表现优秀。

总结

朴素贝叶斯算法基于贝叶斯定理和特征条件独立性假设,通过计算后验概率进行分类。尽管独立性假设在现实中可能不完全成立,但该算法在许多实际应用中仍能取得较好的效果,尤其在文本分类等任务中表现突出。