在机器学习中,投票分类器是一种集成学习方法,它结合了多个分类器的预测结果来提高整体的预测性能。本文将介绍如何使用Python的scikit-learn库来初始化不同的分类器,并通过软投票的方式将它们组合成一个投票分类器。将特别关注如何计算并可视化这些分类器对单个样本的类别概率预测。
首先,初始化了三个示例分类器:逻辑回归(LogisticRegression)、高斯朴素贝叶斯(GaussianNB)和随机森林分类器(RandomForestClassifier)。这些分类器被用来初始化一个软投票的VotingClassifier,其权重设置为[1, 1, 5]。这意味着在计算平均概率时,随机森林分类器的预测概率将比其他分类器的权重大5倍。
为了可视化概率加权,对每个分类器进行了训练,并绘制了这个示例数据集中第一个样本的预测类别概率。以下是实现这一过程的Python代码:
import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
# 初始化分类器
clf1 = LogisticRegression(max_iter=1000, random_state=123)
clf2 = RandomForestClassifier(n_estimators=100, random_state=123)
clf3 = GaussianNB()
# 创建数据集
X = np.array([[-1.0, -1.0], [-1.2, -1.4], [-3.4, -2.2], [1.1, 1.2]])
y = np.array([1, 1, 2, 2])
# 初始化投票分类器
eclf = VotingClassifier(estimators=[("lr", clf1), ("rf", clf2), ("gnb", clf3)], voting="soft", weights=[1, 1, 5])
# 预测所有分类器的类别概率
probas = [c.fit(X, y).predict_proba(X) for c in (clf1, clf2, clf3, eclf)]
# 获取数据集中第一个样本的类别概率
class1_1 = [pr[0, 0] for pr in probas]
class2_1 = [pr[0, 1] for pr in probas]
# 绘图
N = 4 # 分组数量
ind = np.arange(N) # 分组位置
width = 0.35 # 条形图宽度
fig, ax = plt.subplots() # 创建子图
# 绘制分类器1-3的条形图
p1 = ax.bar(ind, np.hstack(([class1_1[:-1], [0]])), width, color="green", edgecolor="k")
p2 = ax.bar(ind + width, np.hstack(([class2_1[:-1], [0]])), width, color="lightgreen", edgecolor="k")
# 绘制投票分类器的条形图
p3 = ax.bar(ind, [0, 0, 0, class1_1[-1]], width, color="blue", edgecolor="k")
p4 = ax.bar(ind + width, [0, 0, 0, class2_1[-1]], width, color="steelblue", edgecolor="k")
# 添加绘图注释
plt.axvline(2.8, color="k", linestyle="dashed")
ax.set_xticks(ind + width)
ax.set_xticklabels(["LogisticRegression\n权重 1", "GaussianNB\n权重 1", "RandomForestClassifier\n权重 5", "VotingClassifier\n(平均概率)"], rotation=40, ha="right")
plt.ylim([0, 1])
plt.title("不同分类器对样本1的类别概率")
plt.legend([p1[0], p2[0]], ["类别 1", "类别 2"], loc="upper left")
plt.tight_layout()
plt.show()
在上述代码中,首先导入了必要的库,然后初始化了三个分类器和一个投票分类器。接着,创建了一个简单的数据集,并使用这些分类器来预测类别概率。最后,使用matplotlib库来绘制条形图,展示了每个分类器对第一个样本的类别概率预测。
通过这种方式,可以直观地比较不同分类器对同一样本的预测结果,以及它们是如何被投票分类器整合的。这种可视化方法对于理解模型的行为和性能非常有帮助。