朴素贝叶斯模型(Naive Bayes Model, NBM)是一种基于贝叶斯定理和特征条件独立性假设的分类算法。其核心思想是通过给定特征X的条件下,预测样本属于某类别c的后验概率P(c|X),选择后验概率最大的类别作为分类结果。
基本原理
朴素贝叶斯模型的基本原理基于贝叶斯定理,公式如下:
[ P(c|X) = \frac{P(X|c)P(c)}{P(X)} ]
其中:
( P(c|X) )表示在给定样本特征X的条件下,样本属于类别c的后验概率。
( P(X|c) )表示在类别c已知的情况下,样本特征X出现的概率。
( P(c) )表示类别c本身的概率。
( P(X) )表示样本特征X出现的总概率,通常用于归一化。
特征条件独立性假设
朴素贝叶斯模型的关键假设是特征之间在给定类别的情况下是相互独立的。这一假设极大地简化了计算,使得似然( P(X|c) )可以分解为各个特征的条件概率的乘积:
[ P(X|c) = \prod_{j=1}^n P(X^{(j)}|c) ]
这一假设虽然在实际中往往不完全成立,但在许多任务中仍然表现良好。
应用场景和优缺点
朴素贝叶斯模型在许多领域有广泛的应用,如文本分类、垃圾邮件识别等。其优点包括实现简单、计算效率高、所需估计的参数少;缺点是假设特征之间完全独立,这在现实中很少见,可能导致分类效果不佳。
今天我们仍以熟悉的示例数据集为例,演示一下朴素贝叶斯(Naive Bayes)模型的操作及拟合效果的ROC曲线、混淆矩阵评价。
加载程序包(openpyxl和pandas等)
#使用pandas读取示例数据xlsx文件
import openpyxl
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.model_selection import train_test_split
# 加载数据集
dataknn = pd.read_excel(r'C:\Users\L\Desktop\示例数据.xlsx')
# 查看前几行数据
print(dataknn.head())
# 分离特征和目标变量
X = dataknn[['指标1', '指标2', '指标3','指标4','指标5','指标6']]
y = dataknn['结局']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#加载朴素贝叶斯模型所需要的库
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import roc_curve, auc, confusion_matrix
from matplotlib import pyplot as plt
# 假设X_train和y_train已经是训练数据和目标值
# 创建Naive Bayes模型
bysmodel = MultinomialNB()
bysmodel.fit(X_train, y_train)
# 对测试集进行预测
y_pred = bysmodel.predict(X_test)
accuracy = bysmodel.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
print("预估值:\n",y_pred)
acc = sum(y_pred == y_test) / y_pred.shape[0]
print("预测的准确率ACC: %.2f%%" % (acc*100))
# 计算ROC曲线和面积
fpr, tpr, thresholds = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic example')
plt.legend(loc="lower right")
plt.show()
# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
# 打印模型拟合效果的评价指标
print(f"ROC AUC: {roc_auc}")
print(f"Confusion Matrix:\n{cm}")
# 使用Seaborn的heatmap绘制混淆矩阵
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns
sns.heatmap(sklearn.metrics.confusion_matrix(y_test, y_pred), annot=True, fmt='d')
plt.title('Confusion Matrix')
plt.xlabel('Predicted label')
plt.ylabel('True label')
plt.show()
医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文修回,医学统计,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!