机器学习——朴素贝叶斯

一、朴素贝叶斯简介

朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法,其核心思想是通过计算特征与类别之间的概率关系来进行分类。朴素贝叶斯假设所有特征之间相互独立,即便这一假设在现实中可能并不成立,但它在实际应用中往往能够取得较好的效果。

应用场景

  • 文本分类(如垃圾邮件分类、情感分析)
  • 医学诊断
  • 推荐系统

二、贝叶斯定理基础

朴素贝叶斯基于贝叶斯定理,公式如下:

P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)}

  • P(A∣B): 在已知事件B发生的条件下,事件A发生的概率(后验概率)。
  • P(B∣A): 在事件A发生的条件下,事件B发生的概率(似然度)。
  • P(A): 事件A发生的概率(先验概率)。
  • P(B): 事件B发生的概率。

在分类问题中,目标是计算某个样本属于某一类别的后验概率,并选择后验概率最大的类别作为预测结果。


三、朴素假设

朴素贝叶斯的关键在于“特征条件独立假设”,即假设样本的各个特征相互独立。在这种假设下,后验概率可以表示为:

P(C|X_1, X_2, \dots, X_n) = \frac{P(C) \cdot P(X_1|C) \cdot P(X_2|C) \cdots P(X_n|C)}{P(X_1, X_2, \dots, X_n)}

其中:

  • C: 类别
  • X_1, X_2, \dots, X_n: 特征

分母P(X_1, X_2, \dots, X_n)是常数,只需比较分子部分:

P(C) \cdot P(X_1|C) \cdot P(X_2|C) \cdots P(X_n|C)

在多分类问题中,目标是给定一个样本的特征向量 X = (X_1, X_2, \dots, X_n),计算其属于某个类别C_k的后验概率 P(C_k|X)

根据贝叶斯定理

P(C_k|X) = \frac{P(X|C_k) \cdot P(C_k)}{P(X)}

其中:

  • P(C_k|X):给定特征 X 时,样本属于类别 C_k的概率(后验概率)。
  • P(C_k):类别 C_k 的先验概率。
  • P(X|C_k):在类别 C_k 的条件下观察到特征 X 的概率(条件概率)。
  • P(X):特征 X 的联合概率分布,通常无需计算,因为它对所有类别是相同的。

朴素假设的引入
假设特征之间是条件独立的,即每个特征 X_i 在给定类别 C_k 时,与其他特征 X_j (j≠i) 的取值无关,则:

P(X|C_k) = P(X_1, X_2, \dots, X_n | C_k) = P(X_1|C_k) \cdot P(X_2|C_k) \cdots P(X_n|C_k)

带入贝叶斯公式后:

P(C_k|X) \propto P(C_k) \cdot P(X_1|C_k) \cdot P(X_2|C_k) \cdots P(X_n|C_k)

这个公式表明,计算后验概率时,只需要计算每个特征的条件概率,并将它们与类别的先验概率相乘。

朴素假设的意义

朴素假设的核心目的是简化模型计算,使得即便面对高维特征空间,分类器仍能高效计算后验概率。

简化后的优势
  1. 降低复杂性

    • 在没有朴素假设的情况下,联合概率 P(X|C_k) 的计算需要估计 2^n个可能的组合,计算量极大。
    • 引入朴素假设后,仅需计算 n 个条件概率 P(X_i|C_k),显著降低了计算复杂度。
  2. 适合高维数据

    • 在文本分类等场景中,特征数目(如单词总数)可能非常大,朴素假设使模型能够处理这类高维数据。
  3. 易于实现

    • 通过独立计算每个特征的条件概率,避免了复杂的联合分布建模。

四、朴素贝叶斯分类器的实现

训练过程

计算先验概率 P(C)

对于每个类别C_k,计算其在训练集中出现的频率:

计算条件概率P(X_i|C_k)

  • 根据每个特征值在某类别中出现的频率:

  • 为防止概率为零的问题,可以使用拉普拉斯平滑

预测过程

对每个类别 C_k 计算:

P(C_k|X_1, X_2, \dots, X_n) \propto P(C_k) \cdot P(X_1|C_k) \cdot P(X_2|C_k) \cdots P(X_n|C_k)

选择具有最大后验概率的类别:

\hat{C} = \underset{C_k}{\arg\max} \ P(C_k|X_1, X_2, \dots, X_n)

以二维高斯分布数据集为例,使用高斯朴素贝叶斯分类器,并绘制分类决策边界和样本分布。


五、模型变种

(1) 高斯朴素贝叶斯

适用于连续特征,假设特征服从正态分布,条件概率为:

P(X_i|C_k) = \frac{1}{\sqrt{2\pi\sigma_k^2}} \exp\left(-\frac{(X_i - \mu_k)^2}{2\sigma_k^2}\right)

其中 \mu_k\sigma_k^2分别是类别C_k下特征的均值和方差。

(2) 多项式朴素贝叶斯

适用于离散特征,常用于文本分类,假设特征的分布服从多项式分布。

条件概率采用多项式分布:

P(x_i | C_k) = \frac{n_{ik} + \alpha}{n_k + \alpha d}

其中n_{ik} 是类别 C_k 中特征 x_i​ 的计数;n_k是类别 C_k 中所有特征的总计数;α 是平滑参数,通常取 1(拉普拉斯平滑);d 是特征总数

(3) 伯努利朴素贝叶斯

适用于二元特征,假设每个特征是二值变量。

条件概率采用伯努利分布:

P(x_i | C_k) = p_k^{x_i} (1 - p_k)^{1 - x_i}

其中p_k是特征在类别 C_k中为 1 的概率。


六、优缺点分析

优点

  • 简单高效,易于实现。
  • 对小规模数据表现良好。
  • 对缺失数据和噪声具有一定的鲁棒性。

缺点

  • 假设特征条件独立可能与现实不符。
  • 对概率计算精度较为敏感。
  • 当特征相关性较高时,效果会受到限制。

七、朴素贝叶斯实例以及代码实现

实例:垃圾邮件分类

朴素贝叶斯广泛应用于垃圾邮件过滤,这是一个经典的文本分类问题。通过训练一个朴素贝叶斯分类器,我们可以将电子邮件划分为“垃圾邮件”或“非垃圾邮件”。

1. 问题描述
  • 目标:根据电子邮件内容判断邮件是垃圾邮件还是非垃圾邮件。
  • 数据集:使用使用 Spam (垃圾邮件) 分类数据集
  • 特征:文本中的词频(词袋模型)。
  • 分类器:使用多项式朴素贝叶斯(适合离散型特征,如词频)。

代码实现(Python)

以下是简单的多项式朴素贝叶斯实现:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_curve, auc
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import fetch_20newsgroups
from sklearn.preprocessing import label_binarize

# 加载数据集:SMS Spam Collection 数据集(或其他文本数据集)
data = fetch_20newsgroups(subset='train', categories=['rec.autos', 'comp.graphics', 'sci.space', 'talk.politics.mideast', 'soc.religion.christian'], remove=('headers', 'footers', 'quotes'))

# 使用文本数据作为特征,类别标签作为目标值
X = data.data
y = data.target

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 1. 特征提取:将文本转换为TF-IDF特征
vectorizer = TfidfVectorizer(stop_words='english', max_features=5000)
X_train_tfidf = vectorizer.fit_transform(X_train)
X_test_tfidf = vectorizer.transform(X_test)

# 2. 训练朴素贝叶斯模型
model = MultinomialNB()
model.fit(X_train_tfidf, y_train)

# 3. 模型预测
y_pred = model.predict(X_test_tfidf)

# 4. 评估模型
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred, target_names=data.target_names)

# 输出结果
print("准确率:", accuracy)
print("\n分类报告:\n", report)

# 5. 混淆矩阵可视化
conf_matrix = confusion_matrix(y_test, y_pred)

plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=data.target_names, yticklabels=data.target_names)
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()

# 6. 绘制ROC曲线
y_test_bin = label_binarize(y_test, classes=[0, 1, 2, 3, 4])  # 目标标签二值化
y_pred_bin = model.predict_proba(X_test_tfidf)

fpr, tpr, _ = roc_curve(y_test_bin.ravel(), y_pred_bin.ravel())
roc_auc = auc(fpr, tpr)

plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='gray', linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()


八、总结

朴素贝叶斯在许多实际应用中表现优异,特别是在文本分类领域。然而,随着数据复杂性增加,其独立性假设的局限性逐渐显现。实际应用中,可以通过特征选择或模型组合(如与逻辑回归结合)提升性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值