17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JOAI2026参加記ーKaggle登録からたった2か月で銅メダルを取った方法ー

17
Posted at

こんにちは。
新米機械学習エンジニアのriver0525です。

JOAI2026で銅メダル(上位40%)を獲得したので、記念記事を書いてみました。
「機械学習歴たった2か月」の私がメダルを勝ち取った方法についてお伝えしますので、ぜひ最後までお付き合いください!

なお、本記事では専門用語を逐次解説しているため、初学者に優しい構成となっています。
ですので、前提知識に自信がない方も安心してお読みください。

Kaggle登録以前のスペック

私がKaggleのアカウントを作成したのは2025/12/18です。

image.png

「どうせKaggle登録以前に機械学習やったことあるでしょ?」という声が聞こえてきそうなので、Kaggle登録以前の私のスペックを書いておきます。

  • 2025年9月から機械学習関係のバイト開始。ただし、学習結果のJSONをいじるだけで根本的な推論ロジックは一切触らなかった
  • Pythonの基礎的な構文は書ける。ただし、Pandasなどのライブラリ知識は皆無

上記の通り、「機械学習という存在自体は知っている」程度のふんわりとした状態でした。
つまり、全くの素人です。

以降の記事では、こんな全くの素人の状態からどうやって銅メダルをとったかについて紹介します。

コンペの概要

今回のコンペ内容は、表データの数値を訓練データをもとに予測するというものです。

コンペとはコンペティションの略で、kaggle上で開かれる大会のことです。
また、今回のコンペのように連続した数値予測を行うことを回帰と言います。

以下、JOAI2026のコンペページからの抜粋です。

今回のコンペティションデータ

本コンペでは、マウスの脳活動からその時刻における レバーの位置(状態) を推定するモデルを作成していただきます。予測は時系列の各時刻ごとに行います。

利用できる情報は、主に以下の3種類です。

  • 実験情報(例:マウスID、実験日、時間情報 など)
  • 脳活動情報(ワイドフィールドカルシウムイメージング由来の時系列信号。)
  • レバーの状態(ターゲット)

レバーの状態(ターゲット)は予測対象であるため trainデータのみに含まれ、testデータには含まれていません

また、初学者でも取り組みやすいよう、JOAI公式からデータ分析とモデル訓練用のチュートリアルNotebookが与えられていました。

銅メダルを取るためにやったこと

私は知識皆無の状態から銅メダルを取るために、以下の3つのことを行いました。

  1. 念入りな環境構築
  2. 徹底した基礎知識の習得
  3. 「丸投げしない」生成AIの活用

順に解説していきます。

1. 念入りな環境構築

前提知識もない私が経験者に対抗する方法として、真っ先に思い付いたのがPCスペック、有料生成AIなどの環境の力でゴリ押す方法です。

そのために、以下のものを用意しました。

  1. ゲーミングPC
  2. Kaggle用の実行環境が整えられたDockerコンテナ
  3. GitHub Copilot Pro

「なんだ、ただの金持ちアピールか。」と思った方、まだブラウザを閉じないでください。
私は環境構築をするにあたり、1円たりともお金を使っていません。
そのカラクリをこれから紹介します。

1-1. ゲーミングPCの用意

KaggleのNotebookはGPUの使用時間制限があるので、本格的な試行錯誤をするならGPU搭載のPCが必要でした。

そこで私は、学校のゲーミングPCを借りました。
高専など、情報分野が強い学校ならレンタル用PCを先生が所持している可能性があります。
「お金がないけど機械学習を始めたい!」という人は学校に問い合わせてみるといいかもしれません。

ちなみに、スペックは以下の通りです。

  • プロセッサ:12th Gen Intel(R) Core(TM) i7-12650H (2.30 GHz)
  • 実装 RAM:32.0 GB (31.7 GB 使用可能)
  • ストレージ:951 GB
  • GPU:Intel(R) UHD Graphics, NVIDIA GeForce RTX 4050 Laptop GPU

1-2. kaggle用dockerコンテナの用意

ライブラリのインストールの手間を省略するため、Kaggle用Dockerコンテナを使うことにしました。
また、CLIから提出ができるよう、Kaggle APIを導入しました。

初学者の方向けに、各用語について簡潔にまとめます。

  • Docker:仮想環境構築ツール。パソコンごとのライブラリやOSなどの違いを統一してくれる
  • CLI:コマンドラインインターフェースのこと。文字を打つだけでいろいろなパソコン操作ができる
  • Kaggle API:KaggleをCLIで操作できるようにするためのツール。提出以外にも便利機能多数あり

具体的な手順は、以下の記事を参考にさせていただきました。

1-3. GitHub Copilot Proの導入

学習歴2か月では、どうしても経験者には知識・実装速度の面で劣ります。
そこで私は、GitHub Copilot Proを導入することで少しでもその差を埋めようと考えました。

本来有料のGitHub Copilot Proですが、学生向けに「GitHub Education」という無料プランがあり、申請すればだれでも使えるようになります。

この特権を使い、私はコンペ期間中にGPT-5 miniを使い倒しました。

2. 徹底した基礎知識の習得

アカウント登録後に何をすればいいのか分からなかったので、とりあえずKaggleのLearnを終わらせることにしました。

ペースとしては、大体1日で1トピックを全て完了させるくらいです。
このあたりから学校が冬休みに入ったので、一日中カフェにこもってパソコンを叩いてました。

その甲斐もあり、全部英語で大変だったものの何とかディープラーニングの基礎までは埋め終わることができました。

image.png

その後は学んだことを定着させるため、Learnを進めるのをやめて簡単なコンペに参加しまくる方針へ切り替えました。

参加したコンペとしては以下の通りです。

  • Titanic:シンプルな2値分類のコンペ。おそらく初心者は誰もが通る道
  • House Prices:シンプルな回帰コンペ。初心者は誰もが通る道その2
  • MoA Prediction:マルチラベル分類問題。ディープラーニングを使って表データを扱う入門に最適

一つのコンペに対しては、「上位層の解法を写経し、何となく理解できる」というぐらいのレベルまでは詰めました。

また、書籍は下記の1冊のみ読みました。

この本は理論が中心で実際の実装方法については取り扱っていませんでしたが、MoA Predictionコンペを進めながら読むことでカバーしました。

なお、教材の選び方はJOAI公式が出している「人工知能オリンピック (IOAI/JOAI) の対策と勉強法」を参考にしました。

3. 「丸投げしない」生成AIの活用

生成AIにコーディングさせることをバイブコーディングと言います。

先述のとおり、私はバイブコーディングで経験者との差を埋めたわけですが、ただ丸投げしていたわけではありません。

以下の3点のことを意識しました。

  1. エラー修正の際、原因を説明させる
  2. 保守しやすい設計をさせる
  3. AIが頑固になりだしたらチャットを切り替える

3-1. エラー修正の際、原因を説明させる

コードがエラーを吐いたときの修正はすべて丸投げしましたが、原因説明だけは必ず行わせました。

理由は、生成AIに修正を丸投げすると以下のようなクソコードを書いてくるからです。

try:
    #エラーが起こっている処理
except Exception:
    pass

これは何をしているかというと、try構文という例外処理を行い、エラーをもみ消しています。
もしtry内に書かれているコードでエラーが起こった場合、except内の処理が代わりに行われます。
except内に書かれているpassとは「何もしない」という意味です。

この修正を行うと確かにエラーは消えますが、根本的な解決には至りません。
むしろ、エラーの原因が解決されていないのにコードが正常に動いてしまう分、余計にタチが悪いです。

原因説明をしっかりとさせ、修正部分を目視で確認することにより、このようなバグのもみ消しに気付くことができます。

3-2. 保守しやすい設計をさせる

生成AIにコードの共通化、リファクタリング、不要な処理の削除などを定期的に指示することで、保守しやすい設計を行わせました。

「たった10日間のコンテストなんだから保守性なんか不要じゃない?」という方もいると思いますが、短期コンペでも保守性のあるコードを書くことには以下のようなメリットがあります。

  • エラー修正の容易化:コードが整理されていると、エラー箇所の特定の際見るべき場所が減るので楽
  • 新機能を追加しやすい:新機能を追加する際、既存コードの一部を改変するだけで追加できる。また、バグらせても影響範囲が少ない
  • 可読性の向上:どうしてもAIがコードを直してくれないときには自分で読む必要がある。その際、可読性のあるコードにしておくことで手間が減る
  • 誤生成の防止:古い処理やコメントが残っていると、AIが間違った生成をしやすくなる

これに加え、私はGitHubによるバージョン管理を行いました。
バックアップがあるという安心感によって、アイデアが外れた場合のスコアの悪化やAIによるコーディングミスを恐れず大胆な立ち回りができました。

なお、設計に関しては以下の書籍がとても参考になりました。

通称ミノ駆動本です。
個人的には、エンジニアなら誰もが一度は読むべき書籍だと思っています。

3-3. AIが頑固になりだしたらチャットを切り替える

AIはときどき、誤った情報を自信満々に出力することがあります。
これを、専門用語でハルシネーションと言います。

大抵こういう時のAIはやたら頑固で、ミスを指摘しても我を貫き通してきます。

そういうときは、チャットを切り替えることでAIの記憶がリセットされ、正しい出力をしてくれるようになります。

ちなみに、この手法はバイブコーディングで活躍している同級生から聞きました。
私はかなり生成AI音痴だったので、身近に相談できる人がいたことは本当にありがたかったです。

コンペの解法

ここまでは事前準備や心理的な話をしてきましたが、ここからは実際の解法についてお話しします。

私の解法を一言で表すと、「HPOとスタッキングによるゴリ押し」です。

この解法を選んだ理由は、前提知識がなくともPCスペックでのゴリ押しがある程度通用するからです。
逆に、特徴量生成などを賢くやる方針は私の経験不足で厳しかったのであまり考えませんでした。

この解法を突き詰めた結果、プライベートLBの最終スコアはこのようになりました。

スクリーンショット 2026-02-15 191450.png

以下に、各ステップで具体的に何を行ったかをご紹介します。

交差検証

交差検証にはチュートリアルでも採用されていたGroupKFoldを使いました。
その名の通り、データを同じグループ同士はまとまるように分割する手法です。

この手法を用いることで、学習データと検証データとでsample_idの重複がなくなり、リークを防ぐことができます。

ちなみに、Fold数は5です。

特徴量エンジニアリング

特徴量エンジニアリングについては、以下の手法を用いました。

  • 全特徴量に対するローリング特徴量の生成
  • PCA
  • KMeansクラスタリング

計算量削減のために、一度生成した特徴量はファイルとして保存しておき、全モデルから読み込めるようにしました。

学習・推論

スタッキングという手法を用いて学習・推論を行いました。

スタッキングとは、複数のモデルの推論結果を新たな特徴量として、さらに上位のモデルを学習させる手法です。

上位モデルにはLightGBMを使い、特徴量として以下のモデルの推論結果を用いました。

  • LSTM
  • MLP
  • LightGBM
  • LightGBM(特徴量エンジニアリング済み)x 2
  • XGBoost(特徴量エンジニアリング済み)
  • CatBoost(特徴量エンジニアリング済み)
  • Ridge(特徴量エンジニアリング済み)
  • ElasticNet(特徴量エンジニアリング済み)
  • RandomForest(特徴量エンジニアリング済み)
  • Lasso(特徴量エンジニアリング済み)

モデルの合計は上位モデルも合わせて11個。
これを各Fold毎に学習・推論させているため、総モデル数は11×5=55個となります。

当然、モデルを改変するたびにこんな大量の計算をし直すわけにもいかないので、各モデルの推論結果を保存しておき、再学習が必要なモデルのみ計算を行うことで大幅な時短に成功しました。

また、以下の記事を参考にスタッキングの際の特徴量に元の特徴量も加えた結果、スコアが0.01ほど改善したので採用しました。

参考にした記事:【機械学習】スタッキングとは?正しい実装方法を解説します。

ちなみに、上記のモデルの中で単体のスコアが1.0を切ったのはLSTMのみです。
にもかかわらず、プライベートLBのスコアが0.881まで改善されていることから、スタッキングがどれだけ強力かお分かりいただけるかと思います。

HPO

HPO(ハイパーパラメータチューニング)についてはOptunaによるベイズ最適化を行いました。

ベイズ最適化とは、中身が分からない関数の最適解を効率的に探索するための手法です。
これにより、グリッドサーチ(全探索)より早く、ランダムサーチ(乱択)よりも確実なチューニングを実現しました。

その際、最適化対象を各モデルのスコアではなくスタッキング結果のスコアにすることで、「モデル単体の性能はいいのにスタッキングすると微妙になる」という現象を防ぐことができました。

感想

機械学習を完全に素人の状態から初めて2か月で入賞できたこともあり、個人的にはかなり嬉しい結果でした。

コンペの難易度については、JOAI公式がチュートリアル用のNotebookを用意してくださったおかげで入門者でもかなりとっつきやすかったです。(というかチュートリアルが無かったら私はLSTMの存在すら知らなかった)

また、JOAIに参加する中で初学者から上位勢まで幅広い層と交流できたことが良かったです。

余談:生成AIの使用について

これだけAIを活用しておいてなんですが、もともと私は生成AIアンチ派でした。

理由としては、AIにコード生成させるのでは実力がつかないことと、AIがときどき投げてくるクソコードがどうしても許せなかったからです。

ですが、直近のAHC(AtCoder Heuristic Contest)で生成AIに丸投げした灰色の友人に完敗してから、この手の大会でAIを出し惜しみしていたら確実に負けることに気づかされました。

機械学習にかかわらず、様々な大会でAIを用いたコーディングが主流になりつつありますが、

  • AIの使用をためらわないこと
  • その上で、ベースの知識をしっかりと身に着けること

この2点が大切になってくるのかなと思います。

まとめ

本記事では、Kaggle登録からたった2か月でJOAI銅メダルを獲得した方法をご紹介しました。

その中でも、特に初学者に有用だと思うアドバイスを3つ紹介します。

  1. 環境構築は手を抜かない:レンタルPC、生成AIの学生向けプランなど、使えるものはすべて使う。勝つために手段を選ばない貪欲な姿勢が重要
  2. 基礎知識を付けたうえでAIを使う:基礎知識がないとAIがコードをバグらせたことに気付けない
  3. 保守性の高いコードを書く:読みやすく、バグらせにくいコードは新たな機能を追加しやすい

ここまで読んで下さりありがとうございました!
皆さんが楽しい機械学習ライフを送れることを祈っております。

それではまた、次の記事でお会いしましょう!

17
13
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
17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?