Skip to content

使用朴素贝叶斯进行分类

Scikit-learn - 使用朴素贝叶斯进行分类

Section titled “Scikit-learn - 使用朴素贝叶斯进行分类”

朴素贝叶斯分类器(Naïve Bayes classifiers)是一系列基于贝叶斯定理的简单概率分类器,其特点是强烈的(“朴素”)特征独立性假设。这意味着在给定类别变量的情况下,假设某个特定特征的出现(或不出现)与其他任何特征的出现(或不出现)无关。

贝叶斯定理提供了一种计算后验概率 P(Y|features) 的方法:

P(Y|features) = [P(features|Y) * P(Y)] / P(features)

其中:

  • P(Y|features) 是在给定观测特征下类别 Y 的后验概率(posterior probability)。
  • P(Y) 是类别 Y 的先验概率(prior probability)。
  • P(features|Y) 是似然(likelihood),即在给定类别 Y 下观测到这些特征的概率。
  • P(features) 是特征的先验概率(证据,evidence)。

由于独立性假设,似然 P(features|Y) 可以分解为每个特征概率的乘积:P(feature_1|Y) * P(feature_2|Y) * … * P(feature_n|Y)。分类器随后会分配使这个后验概率最大化的类别标签 Y。

Scikit-learn 实现了几种朴素贝叶斯算法,它们的主要区别在于对 P(features|Y) 分布所做的假设。

Scikit-learn 中的朴素贝叶斯分类器类型

Section titled “Scikit-learn 中的朴素贝叶斯分类器类型”
模型 (Model)描述与用例 (Description & Use Case)
GaussianNB (sklearn.naive_bayes.GaussianNB)假设特征服从高斯(正态)分布。适用于近似服从正态分布的连续数值特征。
MultinomialNB (sklearn.naive_bayes.MultinomialNB)假设特征是从多项式分布中抽取的。通常用于离散计数数据,例如文本分类中的词频(如词袋模型)。
BernoulliNB (sklearn.naive_bayes.BernoulliNB)假设特征是二元的(0 和 1,即布尔变量)。也用于文本分类,特别是使用二元词项出现特征(词语是否存在)时。
ComplementNB (sklearn.naive_bayes.ComplementNB)MultinomialNB 的一个变体,专门设计用于在不平衡数据集上表现更好。它使用除了当前类别之外的所有类别的数据来估计参数。
CategoricalNB (sklearn.naive_bayes.CategoricalNB)假设特征是分类分布的。适用于具有离散、无序类别的特征。需要将特征编码为数值(例如,不同类别编码为 0, 1, 2)。

构建朴素贝叶斯分类器:GaussianNB 示例

Section titled “构建朴素贝叶斯分类器:GaussianNB 示例”

让我们将高斯朴素贝叶斯分类器应用于 Scikit-learn 中的 breast_cancer 数据集。该数据集具有连续特征,如果我们假设这些特征在每个类别内服从正态分布,那么 GaussianNB 是一个合适的选择。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Load the breast cancer dataset
# 加载乳腺癌数据集
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names
target_names = data.target_names
print(f"Target names: {target_names}")
print(f"First target label: {y[0]} (corresponds to '{target_names[y[0]]}')")
print(f"First feature name: {feature_names[0]}")
print(f"Values for first sample's first feature: {X[0,0]}")
# Split data into training and testing sets
# 将数据分割为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.30, random_state=42, stratify=y
)
# Initialize and train the Gaussian Naive Bayes classifier
# 初始化并训练高斯朴素贝叶斯分类器
gnb_clf = GaussianNB()
model = gnb_clf.fit(X_train, y_train)
# Make predictions on the test set
# 在测试集上进行预测
y_pred = gnb_clf.predict(X_test)
# Evaluate the model
# 评估模型
accuracy = accuracy_score(y_test, y_pred)
print(f"\nAccuracy: {accuracy:.4f}")
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred))
print("\nClassification Report:")
print(classification_report(y_test, y_pred, target_names=target_names))
Target names: ['malignant' 'benign']
First target label: 0 (corresponds to 'malignant')
First feature name: mean radius
Values for first sample's first feature: 17.99
Accuracy: 0.9415
Confusion Matrix:
[[ 59 4]
[ 6 102]]
Classification Report:
precision recall f1-score support
malignant 0.91 0.94 0.92 63
benign 0.96 0.94 0.95 108
accuracy 0.94 171
macro avg 0.93 0.94 0.94 171
weighted avg 0.94 0.94 0.94 171

输出显示了测试样本的预测类别。accuracy_score 提供了整体的正确率。混淆矩阵(confusion matrix)和分类报告(classification report)提供了按类别划分的更详细的性能洞察。

  • 计算速度快,易于实现。
  • 只需要少量的训练数据来估计参数。
  • 在多类别预测中表现良好。
  • 即使独立性假设被违反,也通常表现出令人惊讶的良好效果,尤其是在文本分类方面。
  • 强大的独立性假设在现实世界数据中往往是不现实的。
  • 如果测试数据中的一个分类特征在训练数据中从未出现,模型将为其分配零概率(拉普拉斯平滑,通常在 MultinomialNB 和 BernoulliNB 中通过 alpha 参数默认应用,有助于缓解这个问题)。
  • 对于数值特征,GaussianNB 假设正态分布,但这可能并不总是成立。

尽管朴素贝叶斯分类器原理简单且假设“朴素”,但它在许多应用中仍然非常有效,特别是文档分类和垃圾邮件过滤。有关每个算法的更多详细信息和其他朴素贝叶斯变体,请参阅 Scikit-learn 文档:https://scikit-learn.org/stable/modules/naive_bayes.html