📚 背景知識(読んでから問題へ)
🎯
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 デフォルト)
Gap: 0.027 — 小さい(良好)
Optuna チューニング後 ⭐ 推奨
Gap: 0.035 — 許容範囲。LB 最高 → 第1選択
新特徴量追加(Title, FamilySize, IsAlone)
Gap: 0.052 ⚠️ 乖離大 — CV は最高だが LB が下がった。CV 過学習の疑い。
スタッキング(LightGBM + LogReg + RF)⭐ 推奨
Gap: 0.045 — LB 2位・多様性あり。→ 第2選択
💡
選択基準: LB スコアが最高で、かつ CV-LB 差が小さいモデルを優先。
最終2提出: ① Optuna(LB最高 + Gap小) ② スタッキング(LB2位 + 多様性)
最終2提出: ① Optuna(LB最高 + Gap小) ② スタッキング(LB2位 + 多様性)
🗺️ スコア改善ループ(反復サイクル)
🧩 問題
⚠️
以下の状況は Titanic コンペ初参加を想定した実践的な戦略問題です。正解は1つではなく、理由の説明が重要です。
状況
| モデル | CV Accuracy | LB Score | CV-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 を超えたら危険信号。特徴量をトレイン/テストで分布比較することが重要。
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 と許容範囲内。汎化性能が信頼できる。
LB スコアが最高(0.786)かつ Gap が 0.035 と許容範囲内。汎化性能が信頼できる。
🥈
第2選択: スタッキング(CV=0.829, LB=0.784)
LB 2位(0.784)かつ複数モデルのアンサンブルで多様性あり。Private LB での安定性を期待。
※「新特徴量追加」は CV が最高だが LB が下がっており、Gap も 0.052 と大きい → 選択しない。
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 LB | Private 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の答え | (ここに記入) |
| 気づき・メモ | (ここに記入) |