朴素贝叶斯(Naive Bayes)是一种常用的分类算法,基于贝叶斯定理和特征条件独立性假设。该算法在自然语言处理、文本分类、垃圾邮件过滤等领域得到广泛应用。
贝叶斯定理是概率论中的一个重要定理,描述了在已知先验概率的情况下,如何根据新的观察结果来更新对事件的概率估计。对于两个事件 A 和 B,贝叶斯定理表示为:
P(A|B) = (P(B|A) * P(A)) / P(B)
其中,P(A|B) 表示在观察到事件 B 发生的条件下事件 A 发生的概率,P(B|A) 表示在事件 A 发生的条件下事件 B 发生的概率,P(A) 和 P(B) 分别表示事件 A 和事件 B 的先验概率。
朴素贝叶斯算法基于贝叶斯定理,假设特征之间相互独立。这是一个较强的假设,因此算法被称为“朴素”。朴素贝叶斯算法通过计算给定特征条件下的类别概率,来预测新样本的类别。
具体来说,假设有一个数据集 D,包含 n 个样本 {x1, x2, …, xn},每个样本包含 m 个特征 {f1, f2, …, fm} 和一个类别标签 {y}。朴素贝叶斯算法的目标是通过计算后验概率 P(y|f1, f2, …, fm) 来预测新样本的类别。根据贝叶斯定理,后验概率表示为:
P(y|f1, f2, ..., fm) = (P(f1, f2, ..., fm|y) * P(y)) / P(f1, f2, ..., fm)
为了简化计算,朴素贝叶斯算法假设特征之间相互独立:
P(f1, f2, ..., fm|y) = P(f1|y) * P(f2|y) * ... * P(fm|y)
根据这个假设,后验概率进一步简化为:
P(y|f1, f2, ..., fm) = (P(y) * Π P(fi|y)) / P(f1, f2, ..., fm)
为了进行分类,我们需要计算每个类别的后验概率,并选择具有最大后验概率的类别作为预测结果。
朴素贝叶斯算法在文本分类任务中广泛应用。可以用于垃圾邮件过滤、情感分析、文档分类等。在这些任务中,文本通常被表示为词袋模型,每个特征表示一个单词,并且特征值表示单词在文本中的出现与否。
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
# 加载数据集
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
data = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(data.data)
y = data.target
# 构建朴素贝叶斯模型
model = MultinomialNB()
# 拟合数据
model.fit(X, y)
# 预测
test_data = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)
X_test = vectorizer.transform(test_data.data)
y_true = test_data.target
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_true, y_pred)
print("Accuracy: {:.2f}%".format(accuracy * 100))
代码中,使用 fetch_20newsgroups
函数加载一个包含多个类别的文本数据集。使用 CountVectorizer
对文本进行特征提取,将文本转换为特征向量表示。接下来,构建一个 MultinomialNB
朴素贝叶斯模型,并使用 fit
方法拟合数据。最后,使用测试集进行预测,并计算准确率。