Hello there, ('ω')ノ
📌 1. 交差検証とは?
交差検証(Cross Validation) とは、データを複数の分割パターンで学習・評価することで、
「データ分割の偏り」や「過学習」を防ぐ手法 です。
✅ なぜ交差検証が必要なのか?
通常の評価では、データを 「学習用(train)」と「テスト用(test)」 に分けてモデルを作成します。
しかし、「データの分割方法によって精度が変わる」 という問題があります。
➡ 「特定の分割で高い精度が出ても、それが本当に良いモデルとは限らない!」
➡ 「異なるデータでも同じように良い精度が出るか?」 をチェックするために、交差検証を使う!
📌 2. K分割交差検証(K-Fold Cross Validation)
最も一般的な交差検証は K分割交差検証(K-Fold Cross Validation) です。
📌 手順
- データをK個のグループ(Fold)に分割する
- 1つのFoldをテスト用、残りを学習用にしてモデルを学習・評価
- これをK回繰り返し、すべてのデータをテストに使う
- 各回の精度を平均し、最終的なモデルの評価とする
📌 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, (^^ゞ