検出誤差トレードオフ曲線

Beginner

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

はじめに

このチュートリアルでは、検出誤差トレードオフ (DET) 曲線について学び、受信機作動特性 (ROC) 曲線と比較します。DET 曲線は、ROC 曲線のバリエーションであり、y 軸に真陽性率 (TPR) の代わりに偽陰性率 (FNR) がプロットされます。機械学習に人気のある Python ライブラリである scikit-learn を使用して、合成データを生成し、ROC 曲線と DET 曲線を使用して 2 つの分類器の閾値にわたる統計的性能を比較します。

VM のヒント

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

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

学習中に問題に直面した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

合成データの生成

scikit-learn の make_classification 関数を使用して合成データを生成します。この関数は、n_informative 個の情報的な特徴、n_redundant 個の冗長な特徴、および各クラスに n_clusters_per_class 個のクラスターを持つランダムな n クラス分類問題を生成します。2 つの情報的な特徴と乱数シード 1 を使用して 1000 個のサンプルを生成します。その後、データを 60/40 の比率で訓練セットとテストセットに分割します。

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

X, y = make_classification(
    n_samples=1_000,
    n_features=2,
    n_redundant=0,
    n_informative=2,
    random_state=1,
    n_clusters_per_class=1,
)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)

分類器の定義

ROC 曲線と DET 曲線を使用して閾値にわたる統計的性能を比較するために、2 つの異なる分類器を定義します。scikit-learn の make_pipeline 関数を使用して、StandardScaler を使用してデータをスケーリングし、LinearSVC 分類器を訓練するパイプラインを作成します。また、scikit-learn の RandomForestClassifier クラスを使用して、最大深さが 5、推定器が 10 個、最大特徴数が 1 個のランダムフォレスト分類器を訓練します。

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC

classifiers = {
    "Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025, dual="auto")),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1
    ),
}

ROC 曲線と DET 曲線を描画する

それぞれ ROC 曲線と DET 曲線を描画するために、scikit-learn の RocCurveDisplayDetCurveDisplay クラスを使用します。RocCurveDisplay.from_estimator 関数は ROC 曲線を計算し、与えられた軸に描画します。同様に、DetCurveDisplay.from_estimator 関数は DET 曲線を計算し、与えられた軸に描画します。2 つのサブプロットを作成し、1 つは ROC 曲線用で、もう 1 つは DET 曲線用で、各分類器の曲線を描画します。

import matplotlib.pyplot as plt
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))

for name, clf in classifiers.items():
    clf.fit(X_train, y_train)

    RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name)
    DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name)

ax_roc.set_title("Receiver Operating Characteristic (ROC) curves")
ax_det.set_title("Detection Error Tradeoff (DET) curves")

ax_roc.grid(linestyle="--")
ax_det.grid(linestyle="--")

plt.legend()
plt.show()

結果の解釈

ROC 曲線を使用するよりも、DET 曲線を使用した方が、視覚的に異なる分類アルゴリズムの全体的な性能を評価することが容易です。DET 曲線は、検出誤差トレードオフの直接的なフィードバックを提供して、動作点分析を支援します。その後、ユーザーは、FPR を犠牲にすることで許容する FNR(またはその逆)を決定することができます。

まとめ

このチュートリアルでは、検出誤差トレードオフ (DET) 曲線について学び、それを受信機作動特性 (ROC) 曲線と比較しました。scikit-learn を使用して合成データを生成し、ROC 曲線と DET 曲線を使用して 2 つの分類器の閾値にわたる統計的性能を比較しました。DET 曲線は ROC 曲線のバリエーションであり、y 軸に真陽性率 (TPR) の代わりに偽陰性率 (FNR) がプロットされています。DET 曲線は、動作点分析を支援するための検出誤差トレードオフの直接的なフィードバックを提供し、分類アルゴリズムの性能評価に役立つツールになっています。