朴素贝叶斯算法简介
朴素贝叶斯(Naive Bayes)算法是一种基于贝叶斯定理的分类算法。它广泛应用于文本分类、垃圾邮件检测和情感分析等领域。该算法假设特征之间是独立的,这个假设在实际情况中可能并不完全成立,但Naive Bayes在许多实际应用中仍表现良好。
贝叶斯定理描述了后验概率的计算方法,公式如下:
在分类问题中,A表示类别,B表示特征向量。Naive Bayes算法通过最大化后验概率来进行分类:
由于特征之间独立的假设,后验概率可以简化为:
其中,( P(c) ) 是先验概率,可以通过样本中的类别频率估计;( P(x_i|c) ) 是条件概率,可以通过类别中特征的频率估计。
Python实现和可视化示例
下面是一个使用Python实现朴素贝叶斯分类算法的示例,并对其结果进行可视化。我们将使用scikit-learn库来简化实现过程,并使用经典的鸢尾花数据集进行分类。我们首先加载鸢尾花数据集并将其拆分为训练集和测试集。然后,我们使用scikit-learn中的GaussianNB类创建一个高斯朴素贝叶斯分类器,并对训练集进行训练。接下来,我们对测试集进行预测并计算准确率。最后,我们通过混淆矩阵和决策边界的可视化来展示分类结果。
# 导入必要的库
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入Matplotlib库,用于数据可视化
from sklearn.datasets import load_iris # 从scikit-learn库导入加载鸢尾花数据集的函数
from sklearn.model_selection import train_test_split # 从scikit-learn库导入拆分数据集的函数
from sklearn.naive_bayes import GaussianNB # 从scikit-learn库导入高斯朴素贝叶斯分类器
from sklearn.metrics import accuracy_score, ConfusionMatrixDisplay # 从scikit-learn库导入计算准确率和显示混淆矩阵的函数
# 加载数据集
iris = load_iris() # 加载鸢尾花数据集,iris 是一个包含数据和目标值的字典对象
X, y = iris.data, iris.target # 将数据集中的数据赋值给 X,将目标值赋值给 y
# 数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 使用train_test_split函数将数据集拆分为训练集和测试集,测试集占30%,随机种子设为42以保证结果可复现
# 创建高斯朴素贝叶斯分类器
gnb = GaussianNB() # 实例化一个高斯朴素贝叶斯分类器对象
# 训练模型
gnb.fit(X_train, y_train) # 使用训练集数据训练模型
# 进行预测
y_pred = gnb.predict(X_test) # 使用测试集数据进行预测
# 计算准确率
accuracy = accuracy_score(y_test, y_pred) # 计算预测结果的准确率
print(f"Accuracy: {accuracy:.2f}") # 输出准确率,保留两位小数
# 混淆矩阵可视化
disp = ConfusionMatrixDisplay.from_estimator(gnb, X_test, y_test, display_labels=iris.target_names, cmap=plt.cm.Blues)
# 创建混淆矩阵显示对象,并使用测试集的预测结果和真实结果
plt.title("Confusion Matrix") # 设置图表标题
plt.show() # 显示混淆矩阵图表
# 绘制特征空间中的决策边界
def plot_decision_boundaries(X, y, model):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 # 计算特征1的取值范围
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 # 计算特征2的取值范围
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))
# 创建一个网格,用于绘制决策边界
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) # 对网格上的每个点进行预测
Z = Z.reshape(xx.shape) # 将预测结果的形状重塑为与网格相同
plt.contourf(xx, yy, Z, alpha=0.3) # 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, edgecolor='k') # 绘制样本点
plt.title("Decision Boundaries") # 设置图表标题
plt.xlabel('Feature 1') # 设置x轴标签
plt.ylabel('Feature 2') # 设置y轴标签
plt.show() # 显示图表
# 由于鸢尾花数据集有4个特征,我们只选取前两个特征来绘制决策边界
X_train_2d = X_train[:, :2] # 选择训练集的前两个特征
X_test_2d = X_test[:, :2] # 选择测试集的前两个特征
gnb_2d = GaussianNB() # 实例化一个新的高斯朴素贝叶斯分类器对象
gnb_2d.fit(X_train_2d, y_train) # 使用前两个特征的训练集数据训练模型
plot_decision_boundaries(X_test_2d, y_test, gnb_2d) # 绘制测试集的决策边界
运行结果:
混淆矩阵(Confusion Matrix)是用于评估分类模型性能的工具。它通过对实际类别和预测类别进行对比,详细展示了分类模型的性能表现。混淆矩阵是一个方阵,矩阵中的每个元素表示在某个实际类别和某个预测类别之间的实例数量。具体来说,混淆矩阵可以帮助我们了解以下几个方面:
-
True Positives (TP): 正确预测为正类的样本数量。
-
True Negatives (TN): 正确预测为负类的样本数量。
-
False Positives (FP): 错误预测为正类的样本数量(实际上是负类)。
-
False Negatives (FN): 错误预测为负类的样本数量(实际上是正类)。
在示例中,我们有以下的混淆矩阵,表示模型在三类鸢尾花上的分类结果:
Setosa Versicolor Virginica
Actual
Setosa 19 0 0
Versicolor 0 12 1
Virginica 0 0 13
-
Setosa: 19个样本被正确分类为Setosa。
-
Versicolor: 12个样本被正确分类为Versicolor。
-
Virginica: 13个样本被正确分类为Virginica,1个样本被错误分类为Versicolor。
上图是针对数据前两维特征进行分类的结果。可以看出与混淆矩阵所展现的情况并不一致。这是因为上述两种情况使用的特征维度不同,在决策边界图中,我们只使用了前两个特征(X_train[:, :2]
和 X_test[:, :2]
)来绘制二维平面中的决策边界,而混淆矩阵的分类结果是基于所有特征(鸢尾花数据集有四个特征)。其次,在决策边界图中数据点在二维平面中的分布可能无法完全代表高维空间中的数据分布。
以上内容总结自网络,如有帮助欢迎转发,我们下次再见!