0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code と組んで複数のKaggleコンペを回すための運用テンプレートを作った tags:

0
Posted at

TL;DR

  • 複数の Kaggle コンペを Claude Code(AnthropicのAIエージェントCLI)と共同で 同じ流儀で回すための運用テンプレートを作って公開しました。
  • キモは CLAUDE.md=AIエージェントへの常時有効な指示書。フォルダ構成・提出手順・鍵管理・知識の残し方を標準化し、AIが毎回それに従って作業します。
  • 実際に ジャンルの全く違う2コンペ(LLMセキュリティ系と Pokémon TCG 戦略系)に適用して横展開できることを確認。その過程で見つかった設計上の穴も直しました。
  • リポジトリ: https://github.com/togakyo/claude-code-kaggle-template

なぜ作ったか

Claude Code のようなAIエージェントとコンペを進めると、生産性は上がる一方で毎回こういう問題にぶつかります。

  • コンペごとに我流のフォルダ構成になり、数週間後の自分(とAI)が迷子になる
  • attack_v1.py … attack_v57.py のようにルート直下がバージョン別ファイルで散らかる
  • APIキーや kaggle.jsonうっかりコミットしそうになる
  • 「前回何が効いて何がダメだったか」がAIのセッションをまたいで消える
  • 提出手順(kernel push → submit)を毎回思い出す

これらを 1コンペ1フォルダの最小構成+AIへの指示書 に落とし込んで標準化したのがこのテンプレです。

設計の中心:CLAUDE.md は README ではなく「AIへの指示書」

Claude Code は 作業ディレクトリの親をさかのぼって CLAUDE.md を自動で読み込む 仕様があります。
これを利用して、リポジトリのルートに運用標準を置くと、どのコンペフォルダで作業していてもAIが常にそのルールに従います。

<リポジトリのルート>/
├── CLAUDE.md              ← 全コンペ共通の運用標準(AIが自動で読む)
├── _template/             ← コンペ雛形(コピー元)
├── _example_competition/  ← 中身を埋めた見本(Titanic 想定)
├── bin/new-comp.sh        ← 雛形からコンペ生成
├── bin/setup.sh           ← pre-commitフック有効化
├── githooks/pre-commit    ← 鍵・.env の誤コミットをブロック
└── NNN_競技名/             ← 各コンペ(下記の最小構成)

各コンペは必ずこの形にします。

NNN_競技名/
├── CLAUDE.md          ← このコンペ固有の事実(AIの現状把握の入口)
├── comp.env           ← slug/提出方式などの設定(Makefileが読む)
├── Makefile           ← 提出・データ取得・LBの標準コマンド
├── src/               ← 現行の解法コード
├── experiments/       ← 実験版(版管理はgit履歴+ここ)
├── notebooks/         ← 提出ノートブック
├── report_record/     ← 知識ベース(*.md が知識の実体)
├── reference/         ← 他参加者ノートの要約
├── data/              ← コンペデータ(gitで除外)
└── outputs/           ← 実行成果物(gitで除外)

ポイントは 知識の実体をAIのメモリに溜めず report_record/*.md に一元化する こと。
セッションが変わっても report_record/knowledge_base.md を読めば文脈が復元でき、AIが毎回ゼロから始めずに済みます。

鍵・トークン管理は3層ガード

コンペ運用で一番怖いのがキーの漏洩です。3層で防ぎます。

  1. .gitignore.env / kaggle.json / data/ / outputs/ / 他人の reference/*.ipynb を除外
  2. githooks/pre-commit … ステージした差分に鍵らしき文字列や .env があればコミットを止める
  3. make check-secrets … 手動チェック

Kaggle認証(~/.kaggle/kaggle.json)はHOMEに置きリポジトリには一切入れない。
APIキーは各コンペの .env(git除外)に置き、コミットするのは .env.example(プレースホルダ)だけ。

pre-commitフックは実際にこう動きます。

$ git commit -m "..."
✗ 鍵らしき文字列が差分に含まれます(コミット不可):
    2:+key = "sk-ant-api03-ABCDEF..."
→ 修正してから再コミットしてください。

フック有効化のコマンド打ち忘れ対策として、bin/setup.sh(clone後に一度実行) に加え、
bin/new-comp.sh 実行時の自動設定CLAUDE.md の「コミット前に必ず有効か確認する」ルール で3重に担保しています。

提出方式はコンペで違う → SUBMIT_KIND で吸収

comp.env に数行書くだけで提出コマンドが全コンペ共通になります。

COMP        = titanic
SUBMIT_KIND = csv-kernel      # csv-kernel | file | writeup
KERNEL      = you/titanic-submission
OUTFILE     = submission.csv
make data                 # データ取得(git除外先へ)
make push && make status  # kernelを実行しCOMPLETE待ち
make submit MSG="rf v3"   # SUBMIT_KIND に応じて提出方法を切替

SUBMIT_KIND が提出方式を吸収するのがミソで、make submit

  • csv-kernel … kernel をpushしてその出力CSVを提出
  • file … 手元の submission.tar.gz を直接提出(エージェント系)
  • writeup … Kaggle Writeup(Web UI提出。手順を表示)

を自動で振り分けます。この設計は次の「横展テスト」で必要になって生まれました。

横展開テスト:ジャンルの違う2コンペで検証

テンプレは「他のコンペでも本当に使えるか」を確かめないと意味がありません。
そこで LLMセキュリティ系コンペPokémon TCG AI Battle(Strategy) という、性質の全く違う2つに適用しました。
その過程で3つの穴が見つかり、修正できました。

  1. 提出方式が固定だった … 最初はCSV提出前提でしたが、Pokémon Strategyは Kaggle Writeup審査(数値LB無し)、姉妹のSimulationは tar.gzのエージェント束。→ SUBMIT_KIND で一般化。
  2. .gitignore がネストを取りこぼしたreference/**/*.ipynb はリポジトリ直下しか効かず、NNN_*/reference/ の他人ノートが追跡対象に。→ **/reference/**/*.ipynb に修正。
  3. フックが .env.example を誤検知 … プレースホルダの sk-ant-... を本物の鍵と誤判定。→ *.example をスキャン除外。

「1つ目のコンペでは気づけなかったバグが2つ目で全部出た」 のが、横展開テストの一番の収穫でした。

実際に Pokémon コンペを回してみる

テンプレの改善ワークフロー(reference確認 → 調査 → report_record にまとめ → 実装)に沿って、
配布されたカードデータ(EN_Card_Data.csv)で一次EDAをやってみます。

bin/new-comp.sh 001 pokemon-tcg-battle pokemon-tcg-ai-battle-challenge-strategy
cd 001_pokemon-tcg-battle
make data
python3 experiments/eda_card_data.py   # outputs/eda_summary.md を生成

eda_card_data.py はこのコンペ用に書いたスクリプトで、テンプレ本体には含まれません。)

数分で、戦略に効きそうな事実がこれだけ出ました(1,267枚 / 19拡張)。

  • 区分は ポケモン1,056 / トレーナーズ191 / エネルギー20、特殊ルールは Pokémon ex 121 / Mega ex 30 / ACE SPEC 29ex中心の環境
  • HPは中央値100・最大380(Mega ex)、新セットほど平均HPが高い → パワークリープ
  • 弱点は {R}(炎) が220枚で最多
  • ワザ効率の外れ値に 1エネで250〜280打点(Cinderace ex / Camerupt ex など)

ここから 「炎アグロ(1エネ大打点で炎弱点を突く)」 という第一仮説が立ちます。
この過程・数字・次アクションは report_record/phase1_card_data_eda.md に残り、次のセッションのAIがそこから続けられます。
テンプレの狙い(AIが文脈を失わずコンペを進める)が実際に機能したわけです。

まとめ

  • CLAUDE.mdAIへの指示書 として使い、フォルダ・提出・鍵・知識管理を標準化すると、Claude Code とのコンペ運用が安定します。
  • 横展開テストは必須。2つ目のコンペで初めて設計の穴が出ます。
  • 鍵管理は面倒でも 仕組みで(3層で) 守るのが結局ラク。

テンプレはこちらです。指摘・改善歓迎です → https://github.com/togakyo/claude-code-kaggle-template

この記事とテンプレ自体、Claude Code と共同で作成・検証しました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?