使用朴素贝叶斯进行分类
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_cancerfrom sklearn.model_selection import train_test_splitfrom sklearn.naive_bayes import GaussianNBfrom sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# Load the breast cancer dataset# 加载乳腺癌数据集data = load_breast_cancer()X, y = data.data, data.targetfeature_names = data.feature_namestarget_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 radiusValues 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 171weighted avg 0.94 0.94 0.94 171输出显示了测试样本的预测类别。accuracy_score 提供了整体的正确率。混淆矩阵(confusion matrix)和分类报告(classification report)提供了按类别划分的更详细的性能洞察。
朴素贝叶斯的优点:
Section titled “朴素贝叶斯的优点:”- 计算速度快,易于实现。
- 只需要少量的训练数据来估计参数。
- 在多类别预测中表现良好。
- 即使独立性假设被违反,也通常表现出令人惊讶的良好效果,尤其是在文本分类方面。
朴素贝叶斯的缺点:
Section titled “朴素贝叶斯的缺点:”- 强大的独立性假设在现实世界数据中往往是不现实的。
- 如果测试数据中的一个分类特征在训练数据中从未出现,模型将为其分配零概率(拉普拉斯平滑,通常在
MultinomialNB和BernoulliNB中通过alpha参数默认应用,有助于缓解这个问题)。 - 对于数值特征,
GaussianNB假设正态分布,但这可能并不总是成立。
尽管朴素贝叶斯分类器原理简单且假设“朴素”,但它在许多应用中仍然非常有效,特别是文档分类和垃圾邮件过滤。有关每个算法的更多详细信息和其他朴素贝叶斯变体,请参阅 Scikit-learn 文档:https://scikit-learn.org/stable/modules/naive_bayes.html