# 朴素贝叶斯算法
# 直观理解
想象你是一个邮件系统的管理员,需要自动识别垃圾邮件。你会怎么做呢?
- 首先,你知道垃圾邮件和正常邮件的大致比例(先验概率)
- 然后,你发现垃圾邮件常常包含特定的词语,如"免费"、"中奖"等(特征概率)
- 当新邮件来时,你会根据这些词语的出现情况来判断它是否是垃圾邮件(后验概率)
这就是朴素贝叶斯的工作方式!
# 算法原理
# 基本概念(以垃圾邮件分类为例)
- 先验概率:在没看邮件内容前,判断是垃圾邮件的可能性
- 特征概率:某个词语在垃圾邮件中出现的可能性
- 条件独立性:假设每个词语的出现相互不影响
- 后验概率:看到邮件内容后,判断是垃圾邮件的可能性
# 算法流程
# 数学原理
# 贝叶斯定理
其中:
- 是后验概率:观察到特征x后,样本属于类别y的概率
- 是似然概率:类别为y的样本具有特征x的概率
- 是先验概率:类别y在总体中出现的概率
- 是证据因子:特征x出现的概率,可以通过全概率公式计算:
# 条件独立性假设
假设有n个特征,根据条件独立性假设,各个特征之间相互独立:
这个假设大大简化了计算复杂度,但也是朴素贝叶斯的"朴素
# 算法步骤
- 计算每个类别的先验概率
- 计算每个特征在各类别下的条件概率
- 对新样本,计算每个类别的后验概率
- 选择后验概率最大的类别作为预测结果
# 优缺点
# 优点
- 算法简单,计算效率高
- 对小规模数据表现好
- 对缺失值不敏感
- 适合增量学习
# 缺点
- 特征独立性假设过强
- 对数据分布敏感
- 对零概率处理不当
- 特征权重难以确定
# 应用场景
文本分类
- 垃圾邮件过滤
- 新闻分类
- 情感分析
医疗诊断
- 疾病诊断
- 风险评估
- 健康预测
多分类问题
- 图像分类
- 语音识别
- 自然语言处理
# 代码示例
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
# 生成示例数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15,
n_redundant=5, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 创建朴素贝叶斯分类器
nb = GaussianNB()
# 训练模型
nb.fit(X_train, y_train)
# 预测
y_pred = nb.predict(X_test)
# 计算准确率
accuracy = nb.score(X_test, y_test)
print(f"模型准确率: {accuracy:.2f}")
# 预测概率
prob = nb.predict_proba(X_test)
print("\n预测概率示例:")
for i in range(5):
print(f"样本 {i+1}: {prob[i]}")
# 调优技巧
数据预处理
- 处理缺失值
- 特征选择
- 特征编码
概率平滑
- 拉普拉斯平滑
- 加法平滑
- 贝叶斯估计
模型选择
- 高斯朴素贝叶斯
- 多项式朴素贝叶斯
- 伯努利朴素贝叶斯
# 常见问题与解决方案
零概率问题
- 使用平滑技术
- 对数概率转换
- 特征值离散化
特征相关性
- 特征选择
- 特征组合
- 使用其他模型补充
类别不平衡
- 调整先验概率
- 采样平衡
- 代价敏感学习