贝叶斯算法简介
贝叶斯算法是一种基于概率论的统计学方法,广泛应用于机器学习领域。它基于贝叶斯定理,用于计算后验概率。贝叶斯定理可以表述为:
其中:
- P(A∣B) 表示在事件 B 发生的情况下事件 A 发生的概率,称为后验概率。
- P(B∣A) 表示在事件 A 发生的情况下事件 B 发生的概率,称为似然度。
- P(A) 和 P(B) 分别是事件 A 和 B 的先验概率。
在机器学习中,贝叶斯算法通常用于分类任务,特别是文本分类和垃圾邮件过滤等领域。
朴素贝叶斯分类器
朴素贝叶斯分类器是一种简单的贝叶斯分类器,它假设特征之间相互独立。虽然这种假设在实际应用中很少成立,但朴素贝叶斯分类器仍然能够取得很好的效果。
朴素贝叶斯分类器的主要优点包括:
- 计算效率高。
- 需要较少的训练数据。
- 对缺失数据不敏感。
- 特征独立性假设简化了模型,使得训练过程更加高效。
准备数据
我们将使用 Iris 数据集来进行分类任务,数据如下:
实现代码
下面是使用 Python 和 scikit-learn 库实现朴素贝叶斯分类器的代码示例。
导入库
import pandas as pd
import matplotlib.pyplot as plt
定义一个混淆函数
# 定义一个绘制混淆矩阵的函数
def cm_plot(y, yp):
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
# 计算混淆矩阵
cm = confusion_matrix(y, yp)
# 使用 matshow 绘制混淆矩阵
plt.matshow(cm, cmap=plt.cm.Blues)
plt.colorbar()
# 在每个格子里添加数值
for x in range(len(cm)):
for y in range(len(cm)):
plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',
verticalalignment='center')
# 设置坐标轴标签
plt.ylabel('True label')
plt.xlabel('Predicted label')
# 返回绘制好的混淆矩阵图像
return plt
导入数据
读取iris.csv文件,第一行不设为列名,选择特征集和标签集,因为第一列数据为序列,所以不能作为特征集继续预测。
# 读取数据集
data = pd.read_csv('iris.csv', header=None)
# 选择特征列
x = data.iloc[:, 1:-1]
# 选择标签列
y = data.iloc[:, -1]
划分数据集和特征集
随机划分数据集和特征集,并设置测试集的占比为0.2,即训练集占比为0.8。随机种子设置为100,确保每一次运行代码时都能得到相同的数据分割结果。
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = \
train_test_split(x, y, test_size=0.2, random_state=100)
训练模型
# 创建并训练多项式朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(x_train, y_train)
预测结果
分别对训练集和测试集继续预测
# 在训练集上进行预测
train_pred = classifier.predict(x_train)
# 在测试集上进行预测
test_pred = classifier.predict(x_test)
分类报告
# 计算并打印训练集上的分类报告
from sklearn import metrics
print(metrics.classification_report(y_train, train_pred))
# 绘制训练集上的混淆矩阵并打印
print(cm_plot(y_train, train_pred))
# 计算并打印测试集上的分类报告
print(metrics.classification_report(y_test, test_pred))
# 绘制测试集上的混淆矩阵并打印
print(cm_plot(y_test, test_pred))
plt.show()
输出结果
分类报告
混淆矩阵
总结
这个输出包含了两个分类报告和混淆矩阵,分别对应训练集和测试集的结果。这两个分类报告显示了模型在训练集和测试集上都取得了完美的性能。