[機械学習のはじめ方] Part21: ROC曲線とAUC

機械学習

機械学習 Step 4: モデル評価と改善手法

機械学習モデル、特に分類モデルを作った後、その性能をどう評価すれば良いでしょうか? 🤔 正解率 (Accuracy) だけを見ていると、データの偏りがある場合にモデルの真の性能を見誤ることがあります。そこで登場するのが、ROC曲線AUCです! これらは、分類モデルがどれだけ上手くクラスを区別できるかを、より深く理解するための強力なツールです。

このブログでは、ROC曲線とAUCの基本的な考え方から、Python (scikit-learn) を使った具体的な計算・描画方法まで、初学者の方にもわかりやすく解説していきます。📈

🔍 なぜROC曲線とAUCが必要なの?

例えば、「99%のメールはスパムではない」という状況で、「すべてのメールをスパムではない」と予測するモデルを考えてみましょう。このモデルの正解率は99%と非常に高いですが、スパムメールを全く検出できないため、実用的ではありません。このように、正解率だけではモデルの性能を正しく評価できないケースがあります。特に、クラス間のデータ数に偏りがある場合(不均衡データ)にこの問題は顕著になります。

ROC曲線とAUCは、このような状況でもモデルの性能を閾値(threshold)に依存せずに評価できるという利点があります。分類モデルは内部的に「クラスAである確率」のようなスコアを出力し、そのスコアがある閾値を超えたかどうかで最終的なクラス分類を行います。ROC曲線は、この閾値を様々に変化させたときのモデルの挙動を可視化するものです。

📈 ROC曲線とは?

ROC曲線(Receiver Operating Characteristic curve)は、日本語では「受信者操作特性曲線」と呼ばれます。この曲線は、分類モデルの分類閾値を変化させたときの、以下の2つの指標の関係をプロットしたものです。

  • 真陽性率 (True Positive Rate, TPR): 実際に陽性のデータのうち、モデルが正しく陽性と予測した割合。感度 (Sensitivity)再現率 (Recall) とも呼ばれます。
  • 偽陽性率 (False Positive Rate, FPR): 実際に陰性のデータのうち、モデルが誤って陽性と予測した割合。1 – 特異度 (Specificity) とも言えます。
💡 混同行列 (Confusion Matrix) との関係
TPRとFPRを理解するには、混同行列を思い出すと良いでしょう。
予測: 陽性 (Positive)予測: 陰性 (Negative)
実際: 陽性 (Positive)真陽性 (TP)偽陰性 (FN)
実際: 陰性 (Negative)偽陽性 (FP)真陰性 (TN)
  • TPR = TP / (TP + FN) (陽性のものをどれだけ正しく陽性と見抜けたか)
  • FPR = FP / (FP + TN) (陰性のものをどれだけ間違って陽性としてしまったか)

ROC曲線は、横軸にFPR、縦軸にTPRをとってプロットします。分類の閾値を下げていくと、より多くのデータが陽性と判定されるようになり、TPRとFPRは両方とも増加します。閾値を0から1まで動かしたときの (FPR, TPR) の点の軌跡がROC曲線です。

ROC曲線の見方

  • 📈 左上 (0, 1) に近いほど良いモデル: FPRが0(偽陽性がない)に近く、TPRが1(真陽性しかない)に近い状態が理想的です。曲線がグラフの左上の角に近づくほど、モデルの識別性能が高いことを意味します。
  • 📉 対角線 (y=x) はランダムな予測: FPRとTPRが同じ割合で増える対角線は、モデルがランダムに予測している状態(当てずっぽう)と同じ性能であることを示します。
  • 📊 曲線が対角線より上にあれば意味のあるモデル: モデルのROC曲線が対角線よりも上側にあれば、ランダムな予測よりは優れていると言えます。

💯 AUCとは?

AUC (Area Under the Curve) は、その名の通りROC曲線の下側の面積を表す指標です。AUCの値は通常0から1の間の数値を取り、モデルの性能を一つの数値で要約してくれます。

AUCの値の解釈

  • AUC = 1.0: 完璧なモデル。陽性クラスと陰性クラスを完全に分離できます。ROC曲線は左上の角 (0, 1) を通ります。
  • 0.5 < AUC < 1.0: ランダムな予測よりも良いモデル。値が1.0に近いほど、識別性能が高いことを示します。一般的に、0.8以上あれば良好なモデルとされることが多いです。
  • AUC = 0.5: ランダムな予測と同等。モデルに識別能力がない状態です。ROC曲線は対角線に近くなります。
  • AUC < 0.5: ランダムな予測よりも悪いモデル。予測結果を反転させれば、ランダムより良いモデルになる可能性があります。

🐍 Python (scikit-learn) での実装例

それでは、実際にPythonのライブラリ scikit-learn を使ってROC曲線を描画し、AUCを計算してみましょう。ここでは、簡単なダミーデータとロジスティック回帰モデルを使います。

import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc

# 1. データの準備 (二値分類のダミーデータ生成)
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 2. モデルの学習 (ロジスティック回帰)
model = LogisticRegression()
model.fit(X_train, y_train)

# 3. 予測確率の取得 (陽性クラスである確率)
# predict_proba() は [クラス0の確率, クラス1の確率] の配列を返すので、クラス1の確率を取得
y_pred_proba = model.predict_proba(X_test)[:, 1]

# 4. ROC曲線の計算
# roc_curve() は FPR, TPR, 閾値のリストを返す
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)

# 5. AUCの計算
roc_auc = auc(fpr, tpr)

# 6. ROC曲線の描画
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC curve (AUC = {roc_auc:.2f})') # FPR, TPRプロット
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--', label='Random guess') # ランダム予測の線
plt.xlim([0.0, 1.0]) # x軸の範囲
plt.ylim([0.0, 1.05]) # y軸の範囲
plt.xlabel('False Positive Rate (FPR)') # x軸ラベル
plt.ylabel('True Positive Rate (TPR)') # y軸ラベル
plt.title('Receiver Operating Characteristic (ROC) Curve') # グラフタイトル
plt.legend(loc="lower right") # 凡例を右下に表示
plt.grid(True) # グリッド表示
plt.show()

print(f'AUC: {roc_auc:.4f}')

このコードを実行すると、ROC曲線が描画され、AUCの値が出力されます。`roc_curve`関数がFPR、TPR、およびそれに対応する閾値を計算し、`auc`関数がそれらからAUCを計算してくれます。描画には`matplotlib`を使用しています。

📝 まとめ

今回は、分類モデルの評価指標であるROC曲線AUCについて解説しました。

  • ✅ ROC曲線は、分類閾値を変化させたときの真陽性率 (TPR)偽陽性率 (FPR) の関係をプロットしたグラフです。
  • ✅ 曲線が左上に近いほど、モデルの性能が高いことを示します。
  • ✅ AUCはROC曲線の下側の面積で、モデルの識別能力を0から1の間の数値で示します。
  • ✅ AUCは閾値に依存せず、モデル全体の性能を評価するのに役立ちます。
  • ✅ 特に不均衡データを扱う際に有用な評価指標です。

精度や再現率、適合率といった他の評価指標と合わせてROC曲線とAUCを使うことで、構築したモデルの性能を多角的に評価し、より良いモデル選択や改善につなげることができます。ぜひ活用してみてください!🚀

コメント

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