📚 背景知識(読んでから問題へ)
🧭
Day 087 で Kaggle API による自動化を学びました。今日は Phase 3 の締めに向けて「どのコンペに参加するか」の意思決定を扱います。Grandmaster への最短ルートは、片っ端から全部やることではなく「勝てる・伸びるコンペを選ぶこと」から始まります。
Kaggle には常時 10〜30 個のコンペが同時開催されています。コンペ選びは就活の「企業選び」に似ています。自分のスキル・使える時間・目的に合わないコンペを選ぶと、3ヶ月かけて何も残らずに終わります。
💡
Expert への境界線: 「参加者中規模の Tabular コンペ」を見極めて選べるようになると、メダル獲得率が一気に上がります。強いモデルより先に「勝てる土俵選び」を身につけましょう。
🗂️ コンペの4カテゴリ(メダルの有無)
| カテゴリ | メダル | 特徴 | 初心者向き |
|---|---|---|---|
| Featured | ✅ あり | 企業スポンサー・賞金あり・激戦 | △(学び多い/上位は難) |
| Research | ✅ あり | 学術的・新規性が問われる | △ |
| Playground | ❌ なし ※ | 練習用・合成データ・毎月開催 | ◎(練習に最適) |
| Getting Started | ❌ なし | Titanic 等・常設・入門 | ◎(最初の一歩) |
※ Playground はメダル対象外だが、上位ノートブックの特徴量工学・アンサンブルの型を学ぶ最高の教材。
📊 参加チーム数とメダル難易度
Gold の「絶対順位」は参加者数で激変する。中規模コンペが狙い目。
Expert 志望者への「参加チーム数」推奨度
| 参加チーム数 | Bronze | Silver | Gold |
|---|---|---|---|
| 0〜99 | 上位40% | 上位20% | 上位10% |
| 100〜249 | 上位40% | 上位20% | 上位10% |
| 250〜999 | 上位100位 | 上位50位 | 上位20位 |
| 1000+ | 上位10% | 上位5% | 上位10位 + 0.2% |
🎯 問題
⚠️
あなたは Kaggle Expert を目指す学習者です。「どのコンペに参加すべきか」を、理論・コード両面から判断してください。
タスク1: コンペ選定チェックリストの作成
1
検討中のコンペを評価する10項目のチェックリストを作る
各項目に「なぜ見るべきか」を1行添える
各項目に「なぜ見るべきか」を1行添える
タスク2: Kaggle API でコンペを取得・スコアリング
1
開催中コンペ一覧を API で取得する
締切残り日数・参加チーム数・データサイズ・種別を見る
締切残り日数・参加チーム数・データサイズ・種別を見る
2
各コンペに 0〜100 点の「自分への適合スコア」を付けて上位を提示する
タスク3: 意思決定シナリオ
A
賞金 $50,000・参加 4,200 チーム・締切まで残り 5 日・画像データ 200GB
B
Playground Series・参加 800 チーム・締切まで 25 日・Tabular データ 50MB
C
Research コンペ・参加 90 チーム・締切まで 60 日・独自フォーマットの時系列
🗺️ コンペ選定「3軸」フレームワーク
3つすべて◎でなくてよいが、2つが×のコンペは避けるのが鉄則。
💡 ヒント
ヒント1
方向性
「勝てるか」だけでなく「学べるか」「時間内に終わるか」の3軸で考える。Expert を目指す段階ではメダル獲得率が高い Tabular の中規模コンペ(参加 500〜1500 チーム)が狙い目。画像・NLP は計算資源が必要なので優先度が下がる。
ヒント2
アプローチ
- 一覧取得:
kaggle competitions list --csv --sort-by latestDeadline - メタ情報:
deadline/teamCount/reward/category - 締切日数:
(deadline - today).days - スコアリング: 「残り14〜45日」「参加500〜1500」「Tabular」に高得点を与える重み付け関数
ヒント3
コード骨格
import subprocess, io import pandas as pd from datetime import datetime # コンペ一覧を CSV で取得 result = subprocess.run( ['kaggle', 'competitions', 'list', '--csv'], capture_output=True, text=True) df = pd.read_csv(io.StringIO(result.stdout)) def score(days_left, team, data_gb, is_tabular): s = 0 if 14 <= days_left <= 45: s += 30 if 500 <= team <= 1500: s += 30 if data_gb <= 10: s += 20 if is_tabular: s += 20 return s
✅ 模範解答
タスク1: コンペ選定チェックリスト(10項目)
| # | チェック項目 | なぜ見るべきか |
|---|---|---|
| 1 | メダル対象か | Playground・Getting Started はメダルにならない |
| 2 | 締切まで 14〜45 日あるか | 短すぎると間に合わず、長すぎると中だるみ |
| 3 | 参加チーム 500〜1500 か | メダルの絶対順位と競争のバランスが良い |
| 4 | Tabular か | Expert 段階では GBDT で戦える Tabular が有利 |
| 5 | データサイズは扱えるか | 100GB 級の画像は Colab 無料枠では厳しい |
| 6 | 評価指標を理解しているか | 最適化方法が分かる指標(AUC/RMSE 等)を選ぶ |
| 7 | 上位ノートブックがあるか | 学習リソースが豊富だと成長できる |
| 8 | リーク・品質問題がないか | Discussion で既知の落とし穴を確認 |
| 9 | 自分の時間と合うか | 平日夜だけなら軽量コンペを選ぶ |
| 10 | 目的に合うか(メダル/学習) | 学習目的なら激戦コンペでも参加価値あり |
タスク2: 選定スコアリングスクリプト
import subprocess, io import pandas as pd from datetime import datetime # 1. コンペ一覧を CSV で取得 result = subprocess.run( ['kaggle', 'competitions', 'list', '--csv', '--sort-by', 'latestDeadline', '--category', 'all'], capture_output=True, text=True) df = pd.read_csv(io.StringIO(result.stdout)) # 主なカラム: ref, deadline, category, reward, teamCount, userHasEntered # 2. スコアリング関数 def score_competition(row, today): s, reasons = 0, [] try: deadline = pd.to_datetime(row['deadline']).tz_localize(None) days_left = (deadline - today).days except Exception: days_left = 999 # 締切残り日数 if 14 <= days_left <= 45: s += 30; reasons.append(f"締切{days_left}日=理想(+30)") elif days_left < 7: reasons.append(f"締切{days_left}日=短すぎ(+0)") else: s += 10; reasons.append(f"締切{days_left}日(+10)") # 参加チーム数 team = row.get('teamCount', 0) if 500 <= team <= 1500: s += 30; reasons.append(f"{team}チーム=好バランス(+30)") elif team > 1500: s += 10; reasons.append(f"{team}チーム=激戦(+10)") # メダル対象か cat = str(row.get('category', '')).lower() if cat in ('featured', 'research'): s += 25; reasons.append(f"{cat}=メダル対象(+25)") elif cat == 'playground': s += 15; reasons.append("playground=練習向き(+15)") # 既参加は減点 if row.get('userHasEntered', False): s -= 20; reasons.append("既参加(-20)") return s, days_left, reasons # 3. 全コンペにスコア付与 today = datetime.now().replace(tzinfo=None) rows = [] for _, row in df.iterrows(): sc, days_left, reasons = score_competition(row, today) rows.append({'ref': row['ref'], 'score': sc, 'days_left': days_left, 'reasons': ' / '.join(reasons)}) ranked = pd.DataFrame(rows).sort_values('score', ascending=False) print(ranked.head(5))
タスク3: 意思決定シナリオの判断
| シナリオ | 判断 | 理由 |
|---|---|---|
| A $50k / 4200チーム / 残5日 / 画像200GB |
❌ 見送り | 締切5日は着手に短すぎ。画像200GBは無料資源で扱えない。4200チームで Gold は上位10位相当=非現実的 |
| B Playground / 800チーム / 25日 / Tabular 50MB |
✅ 参加 | 残り日数・データサイズ・種別すべて理想的。メダルは出ないが特徴量工学と GBDT の型を学ぶのに最適。上位NBも豊富 |
| C Research / 90チーム / 60日 / 独自時系列 |
△ 条件付き | 90チームなら Gold は上位10位=メダル現実的。独自フォーマット理解に時間がかかる。時系列の学習目的があるなら価値大 |
🎯
結論: この段階では シナリオB を最優先、時間があれば シナリオC も学習目的で並行。シナリオA は資源・時間の面で見送り。
🪜 Step-by-Step 解説
1コンペ選びは「3軸」で考える
勝てるか × 学べるか × 終わるか。3つすべてが◎である必要はないが、2つが×のコンペは避ける。特に「終わるか」を軽視した途中放棄が最も多い失敗。
2--csv でメタ情報を機械処理可能にする
$ kaggle competitions list --csv --sort-by latestDeadline
📄
なぜ
--csv か? → デフォルトの表形式は目視用。--csv なら pd.read_csv でそのまま DataFrame 化でき、スコアリングを自動化できる。3締切日数「14〜45日」が理想の理由
| 残り日数 | 問題 |
|---|---|
| 14日未満 | 環境構築・EDA・特徴量工学・チューニングを回す時間が足りない |
| 14〜45日 | 一通りの試行錯誤を回せる理想的な期間 |
| 45日超 | モチベ維持が難しく、中だるみで終盤に慌てる |
4参加チーム数とメダルの関係
| 参加チーム数 | 特徴 | Expert 志望者への推奨 |
|---|---|---|
| 〜100 | 過疎・メダルは易しいが学び少 | △ |
| 500〜1500 | 競争と学習のバランスが良い | ◎ |
| 3000+ | 激戦・上位は Master/GM だらけ | △(学び目的なら○) |
5「メダル vs 学習」の目的を明確にする
💡
メダルが目的 → 参加者中規模・Tabular・得意分野を選ぶ。学習が目的 → 激戦コンペでも上位NBを写経して技術を吸収する。両者は矛盾せず、Expert までは「メダル寄り」、Master 以降は「難コンペで技術を磨く」に軸を移すのが定石。
🧮「上位10%」を絶対順位に直す(文系向け)
📐
Gold の条件「上位10%」は参加者数によって難易度が激変します。参加者が増えるほど「割合」ではなく「絶対順位」で評価されるため、大規模コンペの Gold は桁違いに難しくなります。
# 参加者数ごとの Gold ライン 参加 100 チーム → 上位10% = 10位以内 参加 1000 チーム → 「上位10位 + 0.2%」に切替 → 10 + (1000 × 0.002) = 12位以内が Gold
参加者数 vs Gold に必要な絶対順位(少人数コンペほど有利)
※ 中規模コンペは「割合枠」が効くため相対的に Gold が取りやすい局面がある。これが「中規模を狙う」戦略の数学的根拠。
🏆 Kaggleでの実践的な使い方
コンペ選定の実務フロー
Expert を最短で取るための現実的な戦略
| 戦略 | 内容 |
|---|---|
| Playground で型を作る | 毎月の Playground Series で特徴量工学・アンサンブルを高速反復 |
| メダルは中規模 Featured | 参加 500〜1500 の Tabular Featured を狙う |
| 1つに集中 | 掛け持ちせず、1コンペを最後まで走り切る |
| Discussion を毎日読む | 上位の考え方・リーク情報・トレンドを吸収 |
⚠️ よくある誤解・ミス
| 誤解・ミス | なぜ起こるか | 正しい理解 |
|---|---|---|
| 賞金額でコンペを選ぶ | 「高額=良コンペ」と思う | 賞金が高いほど激戦。メダルは逆に取りにくい |
| 全コンペに登録して掛け持ち | 「多く出れば1つは当たる」 | 分散すると全て中途半端。1つに集中が鉄則 |
| 締切間際のコンペに飛び込む | 「今すぐ何か始めたい」焦り | 環境構築だけで締切が来る。14日以上残るものを選ぶ |
| Playground をメダル目的で頑張る | メダル対象と勘違い | Playground はメダル対象外。学習リソースとして使う |
| 画像/NLP を無料枠で始める | 得意分野を無視して流行を追う | 資源不足で途中挫折。Expert までは Tabular 優先 |
🚀 次のステップ
- 発展: 実際に
kaggle competitions list --csvを実行し、今開催中のコンペにスコアを付けて「自分が参加すべき1つ」を選んでみる - 次回予告: Phase 3 総復習「Kaggleコンペに参加し、Bronzeメダル圏内を目指す」(Day 089)— いよいよ Phase 4(青帯・GBDT)への橋渡し
📝 自己評価(解いた後に記入)
自分の回答・気づき・メモ: