Day 068 — Phase 2 総復習 — Kaggle初コンペ出場戦略

2026-06-18 緑 / Phase 2 戦略 CV vs LB / アンサンブル選択 / Phase 2 完了

📚 背景知識(読んでから問題へ)

🎯
Day 068 — Phase 2(Day 049〜068)最終回。線形回帰・ロジスティック回帰・評価指標・CV・決定木・ランダムフォレスト・GBDT・Optuna・スタッキング・SHAP を統合し、Kaggle初コンペ出場戦略を体系化する。

Kaggle コンペの全体構造

1
EDA — 分布確認・欠損・相関・外れ値の把握
2
ベースライン構築 — シンプルなモデルで CV スコアを計測 → すぐ提出
3
特徴量エンジニアリング — 欠損補完・エンコーディング・新特徴量生成(1つずつ追加)
4
モデル選択・Optuna チューニング — LightGBM を中心にハイパーパラメータ最適化
5
アンサンブル / スタッキング — 複数モデルの統合で安定したスコアアップ
6
最終提出選択 — CV vs LB 相関を確認し、最良2件を選択

CV(Cross Validation)vs LB(Leaderboard)の関係

用語意味重要度
CV スコア ローカルで計算した交差検証スコア(手元で計算可能) ★★★ 最重要
Public LB Kaggle のパブリックリーダーボード(テストの一部) ★★☆ 参考程度
Private LB 最終評価(コンペ終了まで見えない) ★★★ 最終順位
CV-LB 差 CV − LB の差。大きいほど過学習の疑いあり ★★☆ 常に監視

📋 Phase 2 習得技術の総整理

評価指標
Day 049–057
Accuracy / AUC-ROC / Log Loss / RMSE / MAE / F1 の使い分け。コンペの目的関数を正確に理解。
交差検証
Day 049, 058
Stratified K-Fold で汎化性能を安定推定。LB に提出する前に必ず CV を確認。
ロジスティック回帰
Day 050–052
分類ベースライン・スタッキングのメタモデルに活用。確率出力が特長。
決定木
Day 059
GBDT の基礎。情報利得・木の深さ・過学習の直感を習得。
ランダムフォレスト
Day 060
バギングで分散を下げる。OOB スコア・特徴量重要度の基礎。
GBDT 3大ライブラリ
Day 061–063
XGBoost / LightGBM / CatBoost の違い・使い分け。表形式データの主力。
Optuna
Day 064
ベイズ最適化でハイパーパラメータを自動チューニング。trial/suggest_float。
スタッキング・ブレンディング
Day 065–066
OOF 予測でメタモデルを学習。加重平均ブレンドで手軽にスコアアップ。
SHAP・特徴量重要度
Day 067
gain 重要度と SHAP 値でモデルを解釈。特徴量エンジニアリングの改善に活用。

📊 CV vs LB スコア比較(問題の状況)

各モデルの CV・LB スコアと乖離(Gap)を視覚化。青 = CV緑 = LB

ベースライン(LightGBM デフォルト)
CV Accuracy
0.806
0.806
LB Score
0.779
0.779
Gap: 0.027 — 小さい(良好)
Optuna チューニング後 ⭐ 推奨
CV Accuracy
0.821
0.821
LB Score
0.786
0.786
Gap: 0.035 — 許容範囲。LB 最高 → 第1選択
新特徴量追加(Title, FamilySize, IsAlone)
CV Accuracy
0.834
0.834
LB Score
0.782
0.782
Gap: 0.052 ⚠️ 乖離大 — CV は最高だが LB が下がった。CV 過学習の疑い。
スタッキング(LightGBM + LogReg + RF)⭐ 推奨
CV Accuracy
0.829
0.829
LB Score
0.784
0.784
Gap: 0.045 — LB 2位・多様性あり。→ 第2選択
💡
選択基準: LB スコアが最高で、かつ CV-LB 差が小さいモデルを優先。
最終2提出: ① Optuna(LB最高 + Gap小) ② スタッキング(LB2位 + 多様性)

🗺️ スコア改善ループ(反復サイクル)

ベースライン CV: 0.806 特徴量追加 CV変化を監視 Optuna CV: 0.821 アンサンブル CV: 0.829 最終提出 LB: 0.786 LB: 0.779 LB: 0.786 ✓ LB: 0.784 Kaggle スコア改善サイクル CV を信頼しながら LB との相関を確認する反復プロセス

🧩 問題

⚠️
以下の状況は Titanic コンペ初参加を想定した実践的な戦略問題です。正解は1つではなく、理由の説明が重要です。

状況

モデルCV AccuracyLB ScoreCV-LB 差
ベースライン(LightGBM デフォルト) 0.806 0.779 0.027
Optuna チューニング後 0.821 0.786 0.035
新特徴量追加(Title, FamilySize, IsAlone) 0.834 0.782 0.052
スタッキング(LightGBM + LogReg + RF) 0.829 0.784 0.045

設問 1

Kaggle では最終提出として2件を選択できます。最良の組み合わせを選び、理由を説明してください。

設問 2

新特徴量追加後に CV は 0.834(過去最高)に上がったが、LB は 0.782(Optuna より低い)に下がりました。この現象の名称と対処法を説明してください。

設問 3

Phase 2(Day 049〜068)で習得した技術の中で、最も重要な3つを自分の言葉で説明してください。

💡 ヒント

ヒント1 — 方向性
2提出の選択は「CV と LB の相関が高く、かつ LB スコアが高い」ものを選ぶ。CV-LB 乖離(Gap)が大きいモデルは避けること。
ヒント2 — アプローチ
設問2のキーワードは「CV 過学習」または「特徴量リーク」。訓練データに特有なパターンを拾いすぎている可能性がある。
Gap が 0.05 を超えたら危険信号。特徴量をトレイン/テストで分布比較することが重要。
ヒント3 — コード骨格
import pandas as pd

results = {
    'ベースライン':      {'cv': 0.806, 'lb': 0.779},
    'Optuna':          {'cv': 0.821, 'lb': 0.786},
    '新特徴量':         {'cv': 0.834, 'lb': 0.782},
    'スタッキング':      {'cv': 0.829, 'lb': 0.784},
}

df = pd.DataFrame(results).T
df['gap'] = df['cv'] - df['lb']
print(df.sort_values('lb', ascending=False))

# → LB 降順: Optuna(0.786) > Stack(0.784) > 新特徴量(0.782) > Base(0.779)
# → Gap:     Base(0.027) < Optuna(0.035) < Stack(0.045) < 新特徴量(0.052)
# → 第1: Optuna(LB最高 + Gap小)
# → 第2: スタッキング(LB2位 + 多様性あり)

模範解答

設問 1: 最良の2提出

🥇
第1選択: Optuna チューニング後(CV=0.821, LB=0.786)
LB スコアが最高(0.786)かつ Gap が 0.035 と許容範囲内。汎化性能が信頼できる。
🥈
第2選択: スタッキング(CV=0.829, LB=0.784)
LB 2位(0.784)かつ複数モデルのアンサンブルで多様性あり。Private LB での安定性を期待。
※「新特徴量追加」は CV が最高だが LB が下がっており、Gap も 0.052 と大きい → 選択しない。
import pandas as pd

results = {
    'ベースライン':  {'cv': 0.806, 'lb': 0.779},
    'Optuna':       {'cv': 0.821, 'lb': 0.786},
    '新特徴量':      {'cv': 0.834, 'lb': 0.782},
    'スタッキング':  {'cv': 0.829, 'lb': 0.784},
}

df = pd.DataFrame(results).T
df['gap'] = df['cv'] - df['lb']
print(df.sort_values('lb', ascending=False))

#              cv     lb    gap
# Optuna    0.821  0.786  0.035  ← 第1選択: LB最高 + Gap小
# スタッキング 0.829  0.784  0.045  ← 第2選択: LB2位 + 多様性
# 新特徴量    0.834  0.782  0.052  ← 除外: Gap大きい
# ベースライン 0.806  0.779  0.027

設問 2: CV上がり LB下がりの原因と対処

現象名: CV 過学習(CV Overfitting)

訓練データに特有のパターン(Title・FamilySize・IsAlone などが訓練データ固有の分布)を新特徴量が拾ってしまい、テストデータに汎化できていない状態。

# 対処法1: 特徴量の分布をトレイン vs テストで比較
for col in ['Title', 'FamilySize', 'IsAlone']:
    print(f"=== {col} ===")
    print("Train:", train[col].value_counts(normalize=True).to_dict())
    print("Test: ", test[col].value_counts(normalize=True).to_dict())

# 対処法2: 特徴量を1つずつ追加してCVとLBの変化を個別確認
# → 一度に全部追加しない

# 対処法3: CV fold数を増やして variance を下げる
from sklearn.model_selection import StratifiedKFold
cv10 = StratifiedKFold(n_splits=10, shuffle=True, random_state=42)

設問 3: Phase 2 で最重要な3技術(例)

#技術なぜ重要か
1 交差検証(Stratified K-Fold) LB を信頼する前に CV で汎化性能を検証する唯一の手段。これなしにコンペは戦えない。
2 LightGBM(GBDT) 表形式データの主力モデル。Optuna・SHAP と組み合わせることで強力な武器になる。
3 評価指標の正確な理解 コンペの目的関数を理解しないと改善方向が分からない。Accuracy / AUC / RMSE の使い分けが必須。

🔢 Step-by-Step 解説

1 CV-LB 差を数値化して比較する

import pandas as pd

results_df = pd.DataFrame({
    'cv':  [0.806, 0.821, 0.834, 0.829],
    'lb':  [0.779, 0.786, 0.782, 0.784],
}, index=['ベースライン', 'Optuna', '新特徴量', 'スタッキング'])

results_df['gap'] = results_df['cv'] - results_df['lb']
print(results_df.sort_values('lb', ascending=False))

CV-LB 差が 0.05 を超えたら過学習の警戒信号。LB が上がっていても Gap が大きいなら選択しない。

2 最終2提出を決める基準(優先順位)

① LB スコアが高い → ② CV-LB 差が小さい → ③ モデルが多様(単一モデルとアンサンブルを組み合わせる)

# NG: 同系統モデル2つ(例: LightGBM + LightGBM(パラメータ違い))
# OK: 単一モデル(Optuna) + アンサンブル(Stacking)
# → 多様性があるとPrivate LBで片方が失敗してもリスク分散できる

3 Phase 3 へ進む前のチェックリスト

checklist = {
    '評価指標を使い分けられる(AUC/RMSE/Log Loss)': True,
    'StratifiedKFoldで CV を組める':               True,
    'LightGBM で fit/predict ができる':            True,
    'Optuna でハイパーパラメータ探索ができる':       True,
    '特徴量重要度(gain/SHAP)を読める':            True,
    'EDA(欠損・分布・相関)の基本フロー':          False,  # Phase 3
    '特徴量エンジニアリング(Target Encoding等)':  False,  # Phase 3
}
passed = sum(checklist.values())
print(f"Phase 2 習得チェック: {passed}/{len(checklist)}")

📐 数学・統計の補足(文系向け)

LB シェイクアップとは

コンペ終了後に Public LB(テストデータの一部で評価)から Private LB(全テストデータで評価)に切り替わると、順位が大きく入れ替わる現象。

状況Public LBPrivate LB判定
CV を信頼して改善 中位 上位 シェイクアップ(上昇)
LB だけを最適化 上位 下位 シェイクダウン(下落)
🎯
鉄則: Public LB よりも CV を信頼する。CV-LB 相関が高いモデルを選ぶ。

🏆 Kaggleでの実践的な使い方

初コンペ推奨ワークフロー(4週間)

タスク目標
Week 1 EDA + ベースライン提出 公開ノートブックを読む・CV 確認後に最初の提出
Week 2 特徴量エンジニアリング SHAP で重要特徴量を確認・1つずつ追加して CV を記録
Week 3 モデル改善・Optuna LightGBM チューニング・CV-LB 差を常に監視
Week 4 アンサンブル + 最終提出 最良2件を選択・ディスカッションで上位解を学ぶ

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
LB スコアだけを追いかける 目に見える指標を最適化したくなる CV-LB 相関を常に確認し、CV を信頼する
提出しないまま改善を続ける 「もっと良くなるはず」と思い込む ベースラインはすぐ提出。改善はその後
全特徴量を一度に追加 多いほど良いと考える 1つずつ追加してCV変化を記録する
アンサンブルに同じモデルを使う 精度が高いモデルを複数使いたい モデルの多様性が重要。異種アーキテクチャを組み合わせる
CV gap が大きいモデルを選択 CV スコアが最高だから選びたくなる CV-LB 差 > 0.05 は過学習の警戒信号。LB と照合必須

🚀 次のステップ

  • Phase 2 完了 — 今日で Phase 2(緑帯)の全20テーマを完走
  • Phase 3 開始(Day 069〜)— EDA・特徴量エンジニアリング・入門コンペへ
  • 次回予告: Day 069 — EDA 入門 / 探索的データ分析の基本フロー(Titanic で実践)
🎉
Phase 2 達成! 線形回帰からGBDT・Optuna・SHAP まで、Kaggle 戦略の基礎を習得しました。Phase 3 では実際のコンペで使える EDA と特徴量エンジニアリングを学びます。

📝 自己評価(解いた後に記入)

理解度 [ ] 完全理解   [ ] おおむね理解   [ ] 要復習
設問1の答え (ここに記入)
設問2の答え (ここに記入)
気づき・メモ (ここに記入)