はじめに
近年、大規模言語モデル(LLM)を活用した自律的なエージェントが急速に普及しており、特にソフトウェア開発の領域においてコード生成・修正・実行を自動化するツールとして広く活用されている。その代表例として、Anthropicが開発したClaude Codeが挙げられる。ClaudeCodeはターミナル上で動作するコーディングエージェントであり、ファイルの読み書きやコマンドの実行を含む複雑なタスクを自律的に処理する能力を持つ。
また、データサイエンスコンペティションは、データの探索・分析から特徴量エンジニアリング・モデル構築に至るまで、高度なコーディング能力と分析的思考の両方を要求する。これらの作業はエージェントが得意とする領域と大きく重なっており、自動化による効率化の余地が大きいと考えられる。
本ブログでは、機械学習コンペティションのプラットフォームであるKaggleの入門的課題「Titanic:Machine Learning from Disaster」を対象に、Claude Codeを用いた自動改善パイプラインを構築し、エージェントが反復的な試行を通じてどの程度の予測精度を達成できるかを検証する。
エージェント構築のアーキテクチャ
全体概要
本システムは、Python製のパイプラインスクリプト(PipelineAgent.py)が4つのClaudeCodeエージェントを順次呼び出す構成をとる。各エージェントはClaude Code CLIを非対話モード(claude -p)でサブプロセスとして実行し、エージェント間の情報共有はファイルシステム上のMarkdownドキュメントを介して行う。
パイプラインは1回の実験ごとに独立したディレクトリ(experiment_n)を作成し、複数回の反復実行によってスコアの自動改善を目指す設計となっている。
処理フロー
- ClaudeCode1:過去の実験結果(result.md)とコンペ仕様(reference.md)を参照し、EDA計画(plan_EDA.md)と分析コードを生成する
- ローカル実行:CC1が生成したEDAコードをローカル環境で実行し、出力結果を取得する
- ClaudeCode2:EDA計画と実行結果を受け取り、分析内容をEDA.mdとしてまとめる
- ClaudeCode3:コンペ仕様とEDA結果を参照し、モデル構築計画(plan_model.md)と学習コードを生成する
- ローカル実行:CC3が生成したモデルコードをローカルで実行し、CVスコアと提出ファイルを生成する
- ClaudeCode4:モデル計画と実行結果を受け取り、精度結果と考察をresult.mdとしてまとめる
この一連のフローを任意の回数繰り返すことで、CC1が過去の結果を参照しながら分析方針を改善し、スコアの向上を図る。
ディレクトリ構成
プロジェクトは competition(コンペ関連ファイル)と improvement(パイプライン・実験結果)の2つのディレクトリに分かれる。
Auto_Improvement/
├── competition/
│ ├── data/
│ │ ├── train.csv # 学習データ
│ │ └── test.csv # 推論データ
│ └── reference.md # コンペ仕様・評価方法の定義
│
└── improvement/
├── PipelineAgent.py # パイプライン実行スクリプト
└── agent_results/
└── experiment_n/ # 実験ごとに自動採番
├── middle_data/
│ └── middle_data.csv # EDAで生成した中間データ
└── Result/
├── plan_EDA.md # EDA計画(CC1が生成)
├── eda_analysis.py # EDA実行コード(CC1が生成)
├── EDA.md # EDA結果まとめ(CC2が生成)
├── plan_model.md # モデル計画(CC3が生成)
├── model_train.py # モデル学習コード(CC3が生成)
├── result.md # 実験結果まとめ(CC4が生成)
└── submission.csv # Kaggle提出ファイル
reference.md にはコンペ概要・データのカラム定義・評価指標(Accuracy)・学習時の評価方法(Stratified 5-Fold CV)を記載しており、各エージェントがエラーのないコードを生成するための仕様書として機能する。実験は experiment_1, experiment_2 … と自動採番され、過去の全 result.md が次の実験のCC1への入力となる。
詳細コード
詳細なコードは以下のGithubに載せることとする。なお、中間データを含めデータはGithubに載せていない。
https://github.com/keisuke-fbr/auto-improvement
実験内容
実験設定
本実験では、Kaggle「Titanic: Machine Learning from Disaster」を対象に、パイプラインのイテレーション回数が最終的な予測精度に与える影響を検証する。具体的には以下の2条件で実験を実施し、CVスコア(Stratified 5-Fold Accuracy)を比較する。
| 条件 | イテレーション数 | 概要 |
|---|---|---|
| 条件A | 1回 | 初回の分析・モデル構築結果をそのまま評価 |
| 条件B | 3回 | 過去の結果を参照しながら分析とモデルを反復改善 |
評価指標
- それぞれの実行後、生成されるsubmission.csvのPublibスコアで評価を行う。
実験の着眼点
条件Bでは、CC1が過去の result.md をすべて参照した上でEDA方針を決定するため、イテレーションを重ねるごとに特徴量エンジニアリングやモデル選択が改善されることが期待される。本実験ではその効果を定量的に確認する。
実験結果
条件A(1回イテレーション)の結果
最終評価結果
| 指標 | スコア |
|---|---|
| Kaggle Public Score (Accuracy) | 0.76794 |
| CV Accuracy(Stratified 5-Fold 平均) | 0.8350 ± 0.0171 |
前処理内容
欠損値補完
| カラム | 補完方法 |
|---|---|
| Age | Titleグループ別中央値(フォールバック:全体中央値) |
| Fare | trainの中央値(test 1件のみ欠損) |
| Embarked | 最頻値(”S”) |
特徴量エンジニアリング(計14次元)
| 特徴量 | 内容 |
|---|---|
| Title | Nameから敬称抽出(Mr / Mrs / Miss / Master / Rare) |
| FamilySize | SibSp + Parch + 1 |
| IsAlone | FamilySize == 1 なら 1、それ以外は 0 |
| HasCabin | Cabin非欠損なら 1、欠損なら 0 |
| LogFare | log1p(Fare) |
| AgeBin | 年齢を5区分にビニング |
カテゴリ変数(Sex・Title・AgeBin)はLabel Encoding、EmbarkはOne-Hot Encodingを適用。
使用モデル
RandomForestClassifier と GradientBoostingClassifier のアンサンブル(VotingClassifier・soft voting)。
| モデル | 主要パラメータ |
|---|---|
| RandomForestClassifier | n_estimators=500, max_depth=8 |
| GradientBoostingClassifier | n_estimators=200, learning_rate=0.05, max_depth=4 |
条件B(3回イテレーション)の結果
以下の前処理・モデル情報は、3回イテレーションの内最終実験である experiment_3 の結果に基づいている。
最終評価結果
| 指標 | スコア |
|---|---|
| Kaggle Public Score (Accuracy) | 0.77990 |
| CV Accuracy(Stratified 5-Fold 平均) | 0.8283 ± 0.0151 |
前処理内容
欠損値補完
| カラム | 補完方法 |
|---|---|
| Age | Title × Pclassグループ別中央値(trainで計算、testに適用) |
| Fare | trainの中央値 |
| Embarked | 最頻値(”S”) |
特徴量エンジニアリング(計17次元)
条件Aの14次元からさらに以下3特徴量を追加した。
| 特徴量 | 内容 |
|---|---|
| FarePerPerson | Fare / 同一チケットの人数 |
| NameLength | Nameの文字数 |
| AgeClass | Age × Pclass |
| TicketPrefix | チケット番号の英字プレフィックス |
| TicketGroupSize | 同一チケット番号の人数 |
| IsChild | Age < 12 のフラグ |
| TicketGroupSurvRate | チケットグループの生存率(middle_dataから取得) |
使用モデル
RandomForest単体での推論となった。
| モデル | 主要パラメータ |
|---|---|
| RandomForestClassifier | n_estimators=300, max_depth=8, min_samples_leaf=5 |
まとめ
本実験では、Claude Codeを用いた自動改善パイプラインによって、Kaggle Titanicコンペにおける予測精度の変化を検証した。
| 条件 | イテレーション数 | Kaggle Score |
|---|---|---|
| 条件A | 1回 | 0.76794 |
| 条件B | 3回 | 0.77990 |
イテレーションを反復することでスコアの向上は確認できたものの、上げ幅は0.012程度にとどまり、大きな改善は得られなかった。この要因として、エージェントが持つ情報がローカルのデータとドキュメントのみに限られており、Web上の上位解法や最新研究などの外部知識を活用できていない点が考えられる。今後は、Web検索機能をエージェントに持たせることや、さらなる実行回数の増加によって、スコアの大幅な改善が見込める可能性がある。

