識別器の較正の比較

Beginner

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

はじめに

この実験では、ロジスティック回帰、ガウスナイーブベイズ、ランダムフォレスト分類器、線形 SVM の 4 つの異なるモデルの較正を比較します。各モデルについて較正曲線をプロットし、予測確率と実際の結果の関係を示します。これは重要です。なぜなら、良好に較正されたモデルは、正確で信頼性の高い確率を生成するからです。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。そうすれば、迅速に問題を解決します。

ライブラリのインポートとデータセットの生成

必要なライブラリをインポートし、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,
)

較正曲線のプロット

4 つのモデルそれぞれを小さな学習データセットで学習させ、テストデータセットの予測確率を使って較正曲線をプロットします。較正曲線は、予測確率をビニングすることで作成され、その後、各ビン内の平均予測確率を観測頻度(「陽性の割合」)に対してプロットします。較正曲線の下には、予測確率の分布、より具体的には各予測確率ビン内のサンプル数を示すヒストグラムをプロットします。

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

較正曲線の解釈

較正曲線は、各モデルの予測確率と実際の結果の関係を示しています。良好に較正されたモデルは、対角線に沿った曲線を生成し、予測確率が実際の結果と一致することを示しています。4 つのモデルは異なる結果を生成します。

  • ロジスティック回帰は、ログ損失を直接最適化するため、良好に較正された予測を生成します。
  • ガウスナイーブベイズは、特徴が条件付き独立であるという仮定が成り立つ場合にのみ確率の正しい推定を提供するため、確率を 0 または 1 に押しやる傾向があります。
  • ランダムフォレスト分類器は、逆の傾向を示します。ヒストグラムは、確率が約 0.2 と 0.9 でピークを示し、0 または 1 に近い確率は非常にまれです。
  • 線形 SVM は、最大マージン法に典型的な、ランダムフォレスト分類器よりもシグモイド曲線が顕著です。

結論

この実験では、ロジスティック回帰、ガウスナイーブベイズ、ランダムフォレスト分類器、線形 SVM の 4 つの異なるモデルの較正を比較しました。各モデルについて較正曲線をプロットし、良好に較正されたモデルは対角線に沿った曲線を生成することを観察しました。4 つのモデルは異なる結果を生じ、ロジスティック回帰は良好に較正されており、他のモデルは様々な程度のバイアスを示していました。較正は機械学習モデルの重要な側面であり、良好に較正されたモデルは正確で信頼性の高い確率を生成します。

まとめ

おめでとうございます!あなたは識別器の較正の比較の実験を完了しました。あなたのスキルを向上させるために、LabEx でさらに多くの実験を行って練習することができます。