使用投票分类器的类别概率

Beginner

This tutorial is from open-source community. Access the source code

简介

在本实验中,我们将学习如何绘制由 Scikit-Learn 中的 VotingClassifier 计算出的类别概率。我们将使用三种不同的分类器,包括 LogisticRegression、GaussianNB 和 RandomForestClassifier,并使用 VotingClassifier 对它们的预测概率进行平均。然后,我们将通过在训练集上拟合每个分类器来可视化概率加权,并绘制数据集中第一个样本的预测类别概率。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。

初始化分类器和数据集

我们首先将初始化三个分类器和一个简单的数据集。我们将使用 LogisticRegression、GaussianNB 和 RandomForestClassifier 作为分类器,并使用 X 和 y 作为简单数据集。

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier

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])

初始化投票分类器

然后,我们将使用权重 [1, 1, 5] 初始化一个软投票的 VotingClassifier,这意味着在计算平均概率时,RandomForestClassifier 的预测概率的权重是其他分类器权重的 5 倍。

eclf = VotingClassifier(
    estimators=[("lr", clf1), ("rf", clf2), ("gnb", clf3)],
    voting="soft",
    weights=[1, 1, 5],
)

预测所有分类器的类别概率

我们将使用 predict_proba() 函数预测所有分类器的类别概率。

probas = [c.fit(X, y).predict_proba(X) for c in (clf1, clf2, clf3, eclf)]

获取数据集中第一个样本的类别概率

我们将获取数据集中第一个样本的类别概率,并将它们存储在 class1_1class2_1 中。

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(
    [
        "逻辑回归\n权重 1",
        "高斯朴素贝叶斯\n权重 1",
        "随机森林分类器\n权重 5",
        "投票分类器\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()

总结

在本实验中,我们学习了如何绘制由 Scikit-Learn 中的投票分类器计算出的类别概率。我们使用了三种不同的分类器,包括逻辑回归、高斯朴素贝叶斯和随机森林分类器,并通过投票分类器对它们的预测概率进行平均。然后,我们通过在训练集上拟合每个分类器来可视化概率加权,并绘制数据集中第一个样本的预测类别概率。