【Python】贝叶斯,条件概率是怎么回事儿
- 一、原理简介
- 1.1 贝叶斯定理
- 1.2 朴素贝叶斯假设
- 二、算法实现过程
- 2.1 数据准备与预处理
- 2.2 模型训练与预测
- 2.2.1 高斯朴素贝叶斯 - 对应连续型数据
- 2.2.2 多项式朴素贝叶斯 - 离散型数据
- 2.3 模型评估
- 三、算法优缺点分析
- 3.1 核心优势
- 3.2 主要局限
- 四、典型应用场景
- 五、完整实现示例:垃圾邮件分类
一、原理简介
1.1 贝叶斯定理
贝叶斯定理是概率论中的核心公式,用于计算在已知某些条件下事件发生的后验概率,即我们常说的条件概率(面试会考哦):
P(A∣B)= P(B∣A)⋅P(A) / P(B)
其中:
- P(A∣B) 是后验概率(已知B发生时的A概率)
- P(B∣A) 是似然概率(已知A发生时B的条件概率)
- P(A) 是先验概率(A的独立发生概率)
- P(B) 是边际概率(B的总发生概率)
1.2 朴素贝叶斯假设
朴素贝叶斯算法基于特征条件独立性假设,即所有特征在类别确定的条件下相互独立。
这一简化使得计算复杂度显著降低(划重点),适用于高维数据场景。
二、算法实现过程
2.1 数据准备与预处理
还是老样子,咱们使用Scikit-learn库加载鸢尾花数据集,并进行标准化处理:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.preprocessing import StandardScaler # 数据标准化处理
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 标准化处理数据 便于后续处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
2.2 模型训练与预测
2.2.1 高斯朴素贝叶斯 - 对应连续型数据
from sklearn.naive_bayes import GaussianNB # 高斯朴素贝叶斯
# 创建模型
gnb = GaussianNB()
# 训练与预测
gnb.fit(X_train, y_train)
y_pred = gnb.predict(X_test)
2.2.2 多项式朴素贝叶斯 - 离散型数据
from sklearn.naive_bayes import MultinomialNB # 多项式朴素贝叶斯
# 文本分类示例(需先进行词袋向量化)
from sklearn.feature_extraction.text import CountVectorizer
texts = ["free investment", "normal message", "urgent promotion"]
vectorizer = CountVectorizer()
X_text = vectorizer.fit_transform(texts)
mnb = MultinomialNB()
mnb.fit(X_text, [1, 0, 1]) # 1:垃圾邮件,0:正常邮件
2.3 模型评估
from sklearn.metrics import accuracy_score, classification_report # 分析评估报告生成
# 计算准确率
print(f"准确率: {accuracy_score(y_test, y_pred):.2%}")
# 输出分类报告
print(classification_report(y_test, y_pred, target_names=iris.target_names))
三、算法优缺点分析
3.1 核心优势
- 计算效率高:时间复杂度为O(n⋅d),适合高维数据(如文本分类)
- 增量学习能力:支持在线学习,新数据可直接更新概率分布
- 抗噪声能力强:对小规模数据仍能保持较好性能
3.2 主要局限
- 独立性假设缺陷:实际场景中特征往往存在相关性
- 零概率问题:未出现的特征组合会导致概率估计失效(可通过拉普拉斯平滑解决)
- 先验敏感度:先验概率的选择显著影响结果准确性
四、典型应用场景
领域 | 应用实例 | 适用算法类型 |
---|---|---|
自然语言处理 | 垃圾邮件过滤、情感分析 | 多项式朴素贝叶斯 |
生物医学 | 疾病诊断、基因分类 | 高斯朴素贝叶斯 |
推荐系统 | 用户兴趣预测 | 贝叶斯网络 |
金融风控 | 欺诈检测 | 层次贝叶斯模型 |
图像处理 | 手写数字识别 | 伯努利朴素贝叶斯 |
五、完整实现示例:垃圾邮件分类
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
# 构建示例数据集
data = {
'text': ['free lottery', 'meeting notes', 'win cash now', 'project update'],
'label': [1, 0, 1, 0] # 1:垃圾邮件,0:正常邮件
}
df = pd.DataFrame(data)
# 创建处理管道
model = make_pipeline(
TfidfVectorizer(stop_words='english'),
MultinomialNB(alpha=0.1)
)
# 训练模型
model.fit(df['text'], df['label'])
# 预测新样本
test_emails = ["urgent money offer", "weekly report"]
predictions = model.predict(test_emails)
print(f"预测结果: {predictions}") # 输出: [1 0]