Shikata Ga Nai

Private? There is no such things.

34. モデル評価の方法② 〜交差検証・AUC・ROC曲線〜

Hello there, ('ω')ノ

📌 1. 交差検証とは?

交差検証(Cross Validation) とは、データを複数の分割パターンで学習・評価することで、
「データ分割の偏り」や「過学習」を防ぐ手法 です。

✅ なぜ交差検証が必要なのか?

通常の評価では、データを 「学習用(train)」と「テスト用(test)」 に分けてモデルを作成します。
しかし、「データの分割方法によって精度が変わる」 という問題があります。

「特定の分割で高い精度が出ても、それが本当に良いモデルとは限らない!」
「異なるデータでも同じように良い精度が出るか?」 をチェックするために、交差検証を使う!


📌 2. K分割交差検証(K-Fold Cross Validation)

最も一般的な交差検証は K分割交差検証(K-Fold Cross Validation) です。
📌 手順

  1. データをK個のグループ(Fold)に分割する
  2. 1つのFoldをテスト用、残りを学習用にしてモデルを学習・評価
  3. これをK回繰り返し、すべてのデータをテストに使う
  4. 各回の精度を平均し、最終的なモデルの評価とする

📌 K=5 の場合(5-Fold Cross Validation のイメージ)

1回目: [train train train train **test**]
2回目: [train train train **test** train]
3回目: [train train **test** train train]
4回目: [train **test** train train train]
5回目: [**test** train train train train]

すべてのデータが1回はテストに使われるので、より公平な評価ができる!


📌 3. ROC曲線・AUCとは?

ROC曲線(Receiver Operating Characteristic Curve) は、
モデルの分類性能を視覚的に評価するためのグラフです。

📌 横軸(False Positive Rate, FPR) [ FPR = \frac{FP}{FP + TN} ] (誤ってPositiveと予測した割合 → 偽陽性率)

📌 縦軸(True Positive Rate, TPR = Recall) [ TPR = \frac{TP}{TP + FN} ] (正しくPositiveと予測した割合 → 再現率)

「閾値を変えたときのFPRとTPRの関係」をプロットすると、ROC曲線ができる!


📌 4. AUC(Area Under the Curve)とは?

AUC(Area Under the Curve) は、ROC曲線の下の面積を表します。
AUCが1に近いほど、分類性能が高い!
AUC=0.5 ならランダム分類(悪いモデル)!

📌 AUCの評価基準

AUC値 モデルの評価
0.9〜1.0 優秀なモデル
0.8〜0.9 良いモデル
0.7〜0.8 まずまず
0.5〜0.7 まあまあ(改善の余地あり)
0.5以下 ランダム予測と同じ(ダメ)

AUCが高いほど、全体的に「良いモデル」と言える!


📌 5. Pythonで交差検証&ROC曲線を実装

✅ ① K分割交差検証(K-Fold Cross Validation)

from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris

# データの読み込み
iris = load_iris()
X, y = iris.data, iris.target

# 5-Fold Cross Validation
kf = KFold(n_splits=5, shuffle=True, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)

# クロスバリデーションのスコアを計算
scores = cross_val_score(model, X, y, cv=kf, scoring="accuracy")

# 結果を表示
print(f"各FoldのAccuracy: {scores}")
print(f"平均Accuracy: {scores.mean():.2f}")

5-Fold交差検証でモデルの安定性を評価!
全データを公平に評価し、汎化性能をチェック!


✅ ② ROC曲線とAUCを可視化

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

# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 2クラス分類用にデータを変換(Irisの2クラスを抽出)
X_train, X_test = X_train[y_train != 2], X_test[y_test != 2]
y_train, y_test = y_train[y_train != 2], y_test[y_test != 2]

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

# 予測確率を取得
y_scores = model.predict_proba(X_test)[:, 1]

# ROC曲線を計算
fpr, tpr, _ = roc_curve(y_test, y_scores)
roc_auc = auc(fpr, tpr)

# ROC曲線を描画
plt.figure(figsize=(6,6))
plt.plot(fpr, tpr, color="blue", lw=2, label=f"AUC = {roc_auc:.2f}")
plt.plot([0, 1], [0, 1], color="gray", linestyle="--")  # ランダム分類の線
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.title("ROC Curve")
plt.legend(loc="lower right")
plt.show()

ROC曲線を可視化し、モデルの分類性能を評価!
AUCを計算し、モデルの品質をチェック!


📌 6. どの評価方法を使うべきか?

問題 適切な評価指標
クラスのバランスが良い Accuracy, F1スコア
クラスのバランスが悪い(例: 病気の診断) Recall, ROC-AUC
モデルの汎化性能を評価 K-Fold交差検証

データの特性に応じて、適切な評価指標を選ぶことが重要!


🎯 まとめ

交差検証(K-Fold CV)を使うと、より公平なモデル評価ができる!
ROC曲線を使うと、モデルの分類性能を視覚的に評価できる!
AUCを計算すると、モデルの全体的な品質がわかる!
Pythonで交差検証&ROC曲線を実装し、モデルの性能をチェック!

Best regards, (^^ゞ