PythonによるROC曲線の理解

データサイエンス/AIがブームとなっている現在、複雑なビジネス課題を解決するために、業界で機械学習がどのように活用されているかを理解することが重要です。

どの機械学習モデルを本番で使用するかを選択するために、異なる機械学習モデルを採点する選択指標が選択される。

現在最もよく使われている指標の1つは、AUC-ROC(Area Under Curve – Receiver Operating Characteristics)曲線である。

ROC曲線は、混同行列と様々な種類の誤差をよく理解すれば、理解し評価するのは非常に簡単である。

今回は、以下の項目について説明します。

  • 混同行列とその上で計算される様々な統計量について紹介します。
  • TP、FN、TN、FPの定義
  • タイプ1エラーとタイプ2エラー
  • Recall、Precision、F-Scoreから計算される統計量
  • AUCの紹介 ROCカーブ
  • ROC曲線とモデル選択に関する様々なシナリオ
  • Pythonを使ったROC曲線の例

コンフュージョンマトリックスの紹介

機械学習モデルから予測されるクラスラベルと実際のクラスラベルを表示するために、混同行列が用いられる。

ここでは、2値クラス分類の問題を例にとって説明する。

1とラベル付けされたクラスは、この例では正のクラスである。

0とラベル付けされたクラスは、ここでは負のクラスです。

このように、正と負の実績値が列として表現され、予測値が行として表現されています。

TP、FP、TN、FN の定義

ROC曲線の理解にもよく使われる用語を理解しよう。

  • TP = True Positive – モデルが正クラスを正しく予測したこと。
  • FP = False Positive – モデルが誤ってネガティブ・クラスをポジティブ・クラスと予測した。
  • FN = False Negative – モデルが正クラスを誤って負クラスと予測した。
  • TN = True Negative – モデルが陰性クラスを正しく予測し、陰性クラスとしたもの。

タイプ1エラーとタイプ2エラー

ここでは、2種類のエラーを確認することができます。

  • タイプ 1 エラー。タイプ 1 エラー: モデルがインスタンスを Positive クラスと予測したが、間違っていた。これは False Positive (FP) である。
  • タイプ 2 エラー。Type 2 Error: モデルがインスタンスを Negative クラスと予測したが、正しくない。これは False Negative (FN)である。

混同行列から計算される統計量

モデルを評価するために、混同行列の表現からいくつかの基本的な事実/統計量を計算します。

出典: https://commons.wikimedia.org/wiki/File:Precisionrecall.svg
リコール。

すべての正のクラスのうち、いくつのインスタンスが正しく識別されたか。

Recall = TP / (TP + FN)


精度。

すべての予測された正のインスタンスのうち、いくつが正しく予測されたか。

Precision = TP / (TP + FP)


F-Score。

PrecisionとRecallから、F-Measureが計算され、メトリクスとして使われることがある。

F – MeasureはPrecisionとRecallの調和平均に他ならない。

F-Score = (2 * Recall * Precision) / (Recall + Precision)


AUCの紹介 – ROCカーブ

AUC-ROC 曲線は、二重多クラス分類問題におけるモデル選択指標である。

ROCは、異なるクラスに対する確率曲線である。

ROCは、予測される確率の観点から、与えられたクラスを区別するために、モデルがどの程度優れているかを教えてくれる。

典型的なROC曲線は、X軸に偽陽性率(FPR)、Y軸に真陽性率(TPR)である。

この曲線がカバーする領域は、オレンジ色の線(ROC)と軸の間の領域である。

この面積がAUCである。

この面積が大きいほど、機械学習モデルは与えられたクラスをよりよく識別していることになる。

AUCの理想的な値は1である。

ROC曲線とモデル選択による様々なシナリオ

シナリオ#1(ベストケースシナリオ)

どのような分類モデルでも、2つのクラス/すべてのクラスの間に明確な区別があるときが最良のシナリオである。

上のグラフは、クラス0とクラス1の両方について予測されたクラス確率を示しています。

閾値は0.5で、つまり、あるインスタンスのクラスの予測確率が0.5より小さい場合、そのインスタンスはクラス0のインスタンスであると予測されます。

インスタンスのクラスの確率が0.5以上の場合、そのインスタンスはクラス1のインスタンスとして分類されます。

この場合のAUC-ROC曲線は以下のようになる。

ここでわかるように、2つのクラスが明確に区別され、その結果、AUCが1となり、ROC曲線とベースラインとの間の面積が最大となることがわかる。

シナリオ#2 (ランダム推測)

両方のクラス分布が単にお互いを模倣する場合、AUCは0.5である。

言い換えれば、我々のモデルは、インスタンスとその分類に対して50%の精度である。

この場合、モデルは識別能力を全く持っていない。

2つのクラスの間に明確な識別がないことがわかる。

ROC AUC曲線の図から明らかなように、ROCと軸の間の面積は0.5です。

これはまだ最悪のモデルではないが、人間が行うようなランダムな推測をしている。

シナリオ#3 (最悪のケース)

モデルがクラスを完全に誤分類した場合、それは最悪のケースである。

最良のケース(シナリオ#1)とは完全に逆で、このケースでは、クラス1のすべてのインスタンスがクラス0に誤分類され、クラス0のすべてのインスタンスがクラス1に誤分類されます。

その結果、AUCは0となり、これは最悪のケースである。

シナリオ#4 (業界/標準シナリオ)

通常の産業シナリオでは、ベストケースは決して観測されない。

2つのクラスの明確な区別がつくことはない。

この場合、観察されたように、いくつかの重複があり、モデル予測にタイプ1エラーとタイプ2エラーを導入します。

この場合、AUCは0.5と1の間のどこかになるように得られます。

Pythonを使った例

それでは、ROC曲線の例として、いくつかのデータと分類器を実際に見てみましょう

ステップ 1: ライブラリのインポート

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# roc curve and auc score
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score


ステップ 2: Python 関数を定義して ROC カーブをプロットします。

def plot_roc_curve(fpr, tpr):
    plt.plot(fpr, tpr, color='orange', label='ROC')
    plt.plot([0, 1], [0, 1], color='darkblue', linestyle='--')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic (ROC) Curve')
    plt.legend()
    plt.show()


ステップ3: サンプルデータの生成

data_X, class_label = make_classification(n_samples=1000, n_classes=2, weights=[1,1], random_state=1)


Step 4: データをtrainとtestのサブデータセットに分割する。

trainX, testX, trainy, testy = train_test_split(data_X, class_label, test_size=0.3, random_state=1)


ステップ5: 訓練データに対してモデルを適合させる。

model = RandomForestClassifier()
model.fit(trainX, trainy)


ステップ6: テストデータの確率を予測する。

probs = model.predict_proba(testX)


ステップ7: 正クラスの確率だけを保持する.

probs = probs[:, 1]


ステップ8: AUCスコアを計算する.

auc = roc_auc_score(testy, probs)
print('AUC: %.2f' % auc)


出力する。

出力: “`
AUC: 0.95


ステップ 9: ROC カーブの取得。

fpr, tpr, thresholds = roc_curve(testy, probs)


ステップ10: 定義した関数を用いてROCカーブをプロットする。

plot_roc_curve(fpr, tpr)

“`

出力する。

結論

AUC-ROC曲線は、機械学習アルゴリズムの性能を評価するために最もよく使われる指標の1つで、特に不均衡なデータセットがある場合に有効である。

この記事では、ROC曲線とそれに関連する概念について詳しく説明した。

最後に、Pythonを使用してROC曲線をプロットする方法を示しました。

タイトルとURLをコピーしました