モデル選択

Eval

モデル選択

まとめ
  • モデル選択で用いる検証手法と情報量規準の位置づけを整理します。
  • 交差検証・検証曲線・情報量規準・ハイパーパラメータ探索の考え方を俯瞰します。
  • データ制約やコストを踏まえた検証フローの作り方と注意点をまとめます。

Chapter 1 #

モデル選択の全体像 #

最適なモデルを選ぶためには「どのように汎化性能を推定するか」「どの指標で比較するか」「探索コストをどう抑えるか」を同時に考える必要があります。この章では、回帰・分類に共通する代表的な検証手法を整理し、目的に応じた選び方のガイドラインを示します。


主なモデル選択手法 #

  • K-Fold / Stratified K-Fold交差検証 / 層化 K-Fold): データ量が限られるときの基本。分類では層化を推奨。
  • ネストした交差検証Nested CV): ハイパーパラメータ探索込みで汎化性能を推定するときに。
  • 時系列交差検証:時間情報を保持したまま評価する必要がある場合。

2. 曲線による挙動の把握 #

  • 検証曲線Validation Curve): ハイパーパラメータとスコアの関係を可視化。
  • 学習曲線Learning Curve): サンプルサイズとスコアの関係を把握。追加データの価値を判断。

3. 情報量規準 #

  • AIC / BICAIC・BIC): ガウス線形モデルや一般化線形モデルで、複雑さをペナルティ付きで評価。
  • Mallow’s (C_p) など: モデル族によって利用可能な規準を選択。

4. ハイパーパラメータ探索 #

  • グリッドサーチ / ランダムサーチ: 小規模空間なら網羅的に、大規模ならサンプリングで。
  • ベイズ最適化 / Hyperband: 実験コストが高いときや探索空間が大きいときに有効。
  • AutoML: 探索と特徴量生成を一括で最適化する場合。

クロスバリデーションの比較例 #

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_breast_cancer(return_X_y=True)

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
models = {
    "LogReg (L2)": make_pipeline(
        StandardScaler(),
        LogisticRegression(max_iter=2000, penalty="l2", C=1.0, solver="lbfgs"),
    ),
    "LogReg (ElasticNet)": make_pipeline(
        StandardScaler(),
        LogisticRegression(
            max_iter=2000,
            penalty="elasticnet",
            solver="saga",
            C=1.0,
            l1_ratio=0.4,
        ),
    ),
    "RandomForest": RandomForestClassifier(
        n_estimators=200, max_depth=6, random_state=42
    ),
}

means = []
stds = []
labels = []
for name, model in models.items():
    scores = cross_val_score(model, X, y, cv=cv, scoring="roc_auc")
    means.append(scores.mean())
    stds.append(scores.std())
    labels.append(name)

y_pos = np.arange(len(labels))

fig, ax = plt.subplots(figsize=(6.5, 3.8))
ax.barh(y_pos, means, xerr=stds, color="#2563eb", alpha=0.8)
ax.set_yticks(y_pos)
ax.set_yticklabels(labels)
ax.set_xlabel("ROC-AUC (5-fold mean ± std)")
ax.set_xlim(0.9, 1.0)
ax.set_title("Cross-validation comparison across models")
ax.grid(axis="x", alpha=0.3)
plt.tight_layout()
交差検証によるモデル比較の棒グラフ

5-fold ROC-AUC の平均と標準偏差を比較。ElasticNet 正則化でわずかに性能が向上し、分散も把握できる。


評価フロー構築のポイント #

  1. データの分布を理解する
    • ラベル不均衡や時系列性がある場合は層化・時系列スプリットを採用。
  2. 探索対象を明確化する
    • モデルタイプ・前処理・特徴量選択など、比較する対象を明示する。
  3. 指標と閾値を共有
    • ROC-AUC、RMSE、コストなど意思決定に使う指標を関係者と合意。
  4. 実験管理と再現性
    • シード、分割、バージョンを記録し、追試しやすい体制を整える。
  5. 計算コストとタイムライン
    • 探索に要する時間を見積もり、段階的にモデルを絞る(例:粗い探索 → 精査)。

クイックリファレンス #

テーマ関連ページ補足
交差検証の基本交差検証 / 層化 K-Foldデータ分割戦略の基本を整理
ネストした検証Nested CVハイパーパラメータ探索込みの汎化推定
曲線による分析学習曲線 / 検証曲線サンプル数とハイパーパラメータの影響を可視化
情報量規準AIC・BIC統計モデルでのモデル比較

チェックリスト #

  • データ分割方法(層化・時系列など)を明示したか
  • 主要指標と報告フォーマットを決めたか
  • ハイパーパラメータ探索の範囲とステップを定義したか
  • 実験結果を再現できる設定・コードを共有したか
  • ビジネス上の制約(推論時間・モデルサイズ)を考慮したか