分类器校准比较

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将比较四种不同模型的校准:逻辑回归、高斯朴素贝叶斯、随机森林分类器和线性支持向量机。将为每个模型绘制校准曲线,该曲线显示预测概率与实际结果之间的关系。这很重要,因为校准良好的模型产生的概率准确且可靠。

虚拟机提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/linear_model("Linear Models") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/naive_bayes("Naive Bayes") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/calibration("Probability Calibration") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49088{{"分类器校准比较"}} sklearn/naive_bayes -.-> lab-49088{{"分类器校准比较"}} sklearn/ensemble -.-> lab-49088{{"分类器校准比较"}} sklearn/svm -.-> lab-49088{{"分类器校准比较"}} sklearn/model_selection -.-> lab-49088{{"分类器校准比较"}} sklearn/calibration -.-> lab-49088{{"分类器校准比较"}} sklearn/datasets -.-> lab-49088{{"分类器校准比较"}} ml/sklearn -.-> lab-49088{{"分类器校准比较"}} end

导入库并生成数据集

我们首先导入必要的库,并生成一个具有100,000个样本和20个特征的合成二元分类数据集。在这20个特征中,只有2个是信息性的,2个是冗余的,其余16个是无信息的。在100,000个样本中,100个将用于模型拟合,其余的用于测试。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

## Generate dataset
X, y = make_classification(
    n_samples=100_000, n_features=20, n_informative=2, n_redundant=2, random_state=42
)

train_samples = 100  ## Samples used for training the models
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    shuffle=False,
    test_size=100_000 - train_samples,
)

绘制校准曲线

我们使用小训练数据集训练四个模型中的每一个,并使用测试数据集的预测概率绘制校准曲线。校准曲线是通过对预测概率进行分箱,然后绘制每个箱中的平均预测概率与观察频率(“正例的比例”)得到的。在校准曲线下方,我们绘制一个直方图,显示预测概率的分布,或者更具体地说,每个预测概率箱中的样本数量。

import numpy as np
from sklearn.svm import LinearSVC
from sklearn.calibration import CalibrationDisplay
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

## Create classifiers
lr = LogisticRegression()
gnb = GaussianNB()
svc = NaivelyCalibratedLinearSVC(C=1.0, dual="auto")
rfc = RandomForestClassifier()

clf_list = [
    (lr, "Logistic"),
    (gnb, "Naive Bayes"),
    (svc, "SVC"),
    (rfc, "Random forest"),
]

fig = plt.figure(figsize=(10, 10))
gs = GridSpec(4, 2)
colors = plt.get_cmap("Dark2")

ax_calibration_curve = fig.add_subplot(gs[:2, :2])
calibration_displays = {}
markers = ["^", "v", "s", "o"]
for i, (clf, name) in enumerate(clf_list):
    clf.fit(X_train, y_train)
    display = CalibrationDisplay.from_estimator(
        clf,
        X_test,
        y_test,
        n_bins=10,
        name=name,
        ax=ax_calibration_curve,
        color=colors(i),
        marker=markers[i],
    )
    calibration_displays[name] = display

ax_calibration_curve.grid()
ax_calibration_curve.set_title("Calibration plots")

## Add histogram
grid_positions = [(2, 0), (2, 1), (3, 0), (3, 1)]
for i, (_, name) in enumerate(clf_list):
    row, col = grid_positions[i]
    ax = fig.add_subplot(gs[row, col])

    ax.hist(
        calibration_displays[name].y_prob,
        range=(0, 1),
        bins=10,
        label=name,
        color=colors(i),
    )
    ax.set(title=name, xlabel="Mean predicted probability", ylabel="Count")

plt.tight_layout()
plt.show()

解读校准曲线

校准曲线展示了每个模型的预测概率与实际结果之间的关系。校准良好的模型所产生的曲线会沿着对角线,这表明预测概率与实际结果相匹配。这四个模型产生了不同的结果:

  • 逻辑回归产生校准良好的预测,因为它直接优化对数损失。
  • 高斯朴素贝叶斯倾向于将概率推向0或1,主要是因为朴素贝叶斯方程只有在特征条件独立的假设成立时,才会提供正确的概率估计。
  • 随机森林分类器表现出相反的行为:直方图显示在大约0.2和0.9的概率处有峰值,而接近0或1的概率非常罕见。
  • 线性支持向量机显示出比随机森林分类器更明显的S形曲线,这是最大间隔方法的典型特征。

结论

在本实验中,我们比较了四种不同模型的校准:逻辑回归、高斯朴素贝叶斯、随机森林分类器和线性支持向量机。我们为每个模型绘制了校准曲线,并观察到校准良好的模型所产生的曲线会沿着对角线。这四个模型产生了不同的结果,逻辑回归校准良好,而其他模型则表现出不同程度的偏差。校准是机器学习模型的一个重要方面,校准良好的模型产生的概率准确且可靠。

总结

恭喜你!你已经完成了“分类器校准比较”实验。你可以在LabEx中练习更多实验来提升你的技能。