一、朴素贝叶斯简介
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理的分类算法,其核心思想是通过计算特征与类别之间的概率关系来进行分类。朴素贝叶斯假设所有特征之间相互独立,即便这一假设在现实中可能并不成立,但它在实际应用中往往能够取得较好的效果。
应用场景
- 文本分类(如垃圾邮件分类、情感分析)
- 医学诊断
- 推荐系统
二、贝叶斯定理基础
朴素贝叶斯基于贝叶斯定理,公式如下:
- P(A∣B): 在已知事件B发生的条件下,事件A发生的概率(后验概率)。
- P(B∣A): 在事件A发生的条件下,事件B发生的概率(似然度)。
- P(A): 事件A发生的概率(先验概率)。
- P(B): 事件B发生的概率。
在分类问题中,目标是计算某个样本属于某一类别的后验概率,并选择后验概率最大的类别作为预测结果。
三、朴素假设
朴素贝叶斯的关键在于“特征条件独立假设”,即假设样本的各个特征相互独立。在这种假设下,后验概率可以表示为:
其中:
- C: 类别
: 特征
分母是常数,只需比较分子部分:
在多分类问题中,目标是给定一个样本的特征向量 ,计算其属于某个类别
的后验概率
。
根据贝叶斯定理:
其中:
:给定特征 X 时,样本属于类别
的概率(后验概率)。
:类别
的先验概率。
:在类别
的条件下观察到特征 X 的概率(条件概率)。
- P(X):特征 X 的联合概率分布,通常无需计算,因为它对所有类别是相同的。
朴素假设的引入
假设特征之间是条件独立的,即每个特征 在给定类别
时,与其他特征
(j≠i) 的取值无关,则:
带入贝叶斯公式后:
这个公式表明,计算后验概率时,只需要计算每个特征的条件概率,并将它们与类别的先验概率相乘。
朴素假设的意义
朴素假设的核心目的是简化模型计算,使得即便面对高维特征空间,分类器仍能高效计算后验概率。
简化后的优势
-
降低复杂性
- 在没有朴素假设的情况下,联合概率
的计算需要估计
个可能的组合,计算量极大。
- 引入朴素假设后,仅需计算 n 个条件概率
,显著降低了计算复杂度。
- 在没有朴素假设的情况下,联合概率
-
适合高维数据
- 在文本分类等场景中,特征数目(如单词总数)可能非常大,朴素假设使模型能够处理这类高维数据。
-
易于实现
- 通过独立计算每个特征的条件概率,避免了复杂的联合分布建模。
四、朴素贝叶斯分类器的实现
训练过程
计算先验概率 P(C)
对于每个类别,计算其在训练集中出现的频率:

计算条件概率
- 根据每个特征值在某类别中出现的频率:

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

预测过程
对每个类别 计算:
选择具有最大后验概率的类别:
以二维高斯分布数据集为例,使用高斯朴素贝叶斯分类器,并绘制分类决策边界和样本分布。

五、模型变种
(1) 高斯朴素贝叶斯
适用于连续特征,假设特征服从正态分布,条件概率为:
其中 和
分别是类别
下特征的均值和方差。
(2) 多项式朴素贝叶斯
适用于离散特征,常用于文本分类,假设特征的分布服从多项式分布。
条件概率采用多项式分布:
其中 是类别
中特征
的计数;
是类别
中所有特征的总计数;α 是平滑参数,通常取 1(拉普拉斯平滑);d 是特征总数
(3) 伯努利朴素贝叶斯
适用于二元特征,假设每个特征是二值变量。
条件概率采用伯努利分布:
其中是特征在类别
中为 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()



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

3万+

被折叠的 条评论
为什么被折叠?



