朴素贝叶斯算法概述:
朴素贝叶斯(Naïve Bayes, NB)算法,是一种基于贝叶斯定理与特征条件独立假设的分类方法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。
贝叶斯定理
贝叶斯定理描述了在给定某些先验条件下,通过新的证据来更新对事件的信念的过程。它的数学表达式如下:
P(A|B)是在给定B条件下A的概率,即后验概率。
P(B|A)是在给定A条件下B的概率,即似然度。
P(A)是A的先验概率。
P(B)是B的先验概率,也称为归一化常量。
朴素贝叶斯:
朴素贝叶斯算法基于贝叶斯定理,但是做了一个“朴素”的假设,即假设每个特征都是相互独立的。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y:
朴素贝叶斯算法原理:在朴素贝叶斯算法中,对于给定的输入 ( x ),我们计算每个可能的类别 ( ck ) 下的后验概率,并选择具有最大后验概率的类别作为输出。
P(Y = ck |X = x) 是在给定输入 ( x ) 的情况下输出类别 ( ck ) 的后验概率。
P(X = x |Y = ck) 是在给定输出类别 ( ck ) 的情况下输入 ( x ) 的概率,即似然度。
P(Y = ck) 是输出类别 ( ck ) 的先验概率。
P(X = x) 是输入 ( x ) 的先验概率,也称为归一化常量。
朴素贝叶斯分类模型为:
朴素贝叶斯算法的步骤如下:
准备数据集:收集并准备带有标签的训练数据。
计算类别的先验概率:计算每个类别的先验概率,即在没有任何信息的情况下,每个类别发生的概率。
计算每个特征在每个类别下的条件概率:对于每个特征,计算在每个类别下的条件概率。这里使用了贝叶斯定理。
预测新数据:对于新的未标记数据,通过计算其在每个类别下的概率,选择概率最大的类别作为预测结果。
算法实现:
加载并处理数据集(从csv文件中读取)
data = pd.read_csv(r'C:\Users\86187\Desktop\iris.csv')
# X是特征,y是标签
X = data[['Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width']]
y = data['Species']
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
建立朴素贝叶斯模型:
# 初始化朴素贝叶斯分类器
nb_classifier = GaussianNB()
# 训练模型
nb_classifier.fit(X_train, y_train)
# 使用训练好的模型进行预测
y_pred = nb_classifier.predict(X_test)
验证模型是否可以使用:
# 评估模型准确率
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
同时计算了每个类别的召回率以及查准率,最后输出混淆矩阵
# 计算每个类别的查准率和召回率
precision = precision_score(y_test, y_pred, average=None)
recall = recall_score(y_test, y_pred, average=None)
print("每个类别的查准率:", precision)
print("每个类别的召回率:", recall)
# 计算混淆矩阵
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['Species'].unique(), yticklabels=data['Species'].unique())
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
# 计算混淆矩阵
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['Species'].unique(), yticklabels=data['Species'].unique())
plt.xlabel('Predicted')
plt.ylabel('True')
plt.title('Confusion Matrix')
plt.show()
最后只实现了一个简单的贝叶斯