动手学机器学习朴素贝叶斯算法
0.往期文章
源代码: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. 引言
在机器学习领域,朴素贝叶斯算法以其简单高效而备受青睐,尤其适用于文本分类等场景。本文将深入探讨朴素贝叶斯算法的原理、数学推导,并通过实战案例帮助读者掌握其应用。
2. 背景
2.1 贝叶斯定理
贝叶斯定理是朴素贝叶斯算法的理论基础,它描述了在已知某些条件下,事件发生的概率。公式如下:
其中:
是后验概率,即已知 发生后 发生的概率; 是似然,即已知 发生后 出现的概率; 是先验概率,即 发生的概率; 是边缘概率,即 出现的概率。
2.1 计算示例
问题:某 AI 公司招聘工程师,8 名应聘者中有 5 名是 985 院校毕业的,另外 3 人不是。985 毕业生做对算法题的概率是 80%,非985毕业生做对率只有 30%。随机选中的小甲做对了题目,那么小甲是985院校毕业的概率是多少?
解答: 设:
为事件“小甲是985院校毕业的”; 为事件“小甲做对了题”。
根据贝叶斯定理:
计算各项概率:
先验概率 ,; 似然概率 ,; 全概率 。
代入公式:
结论:小甲是985院校毕业生的概率约为 81.63%。
朴素贝叶斯算法原理及数学推导
朴素贝叶斯算法基于贝叶斯定理,并假设特征之间条件独立。对于给定的输入 ,计算其属于每个类别 的概率,并选择概率最大的类别作为预测结果:
根据贝叶斯定理和条件独立性假设:
训练阶段
先验概率:; 条件概率:,其中 是拉普拉斯平滑参数, 是特征的取值个数。
预测阶段
对于新样本 ,计算每个类别 的概率:
选取最大概率的类别作为预测结果。
经典案例实战(鸢尾花分类)
实战代码
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 supportsetosa 1.00 1.00 1.00 19versicolor 1.00 0.92 0.96 13virginica 0.93 1.00 0.96 13accuracy 0.98 45macro 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。分类报告和混淆矩阵显示模型对各类别的分类效果良好,表明朴素贝叶斯分类器在鸢尾花数据集上表现优秀。
总结
朴素贝叶斯算法基于贝叶斯定理和特征条件独立性假设,通过计算后验概率进行分类。尽管独立性假设在现实中可能不完全成立,但该算法在许多实际应用中仍能取得较好的效果,尤其在文本分类等任务中表现突出。