日本人工知能オリンピック(JOAI)に参加しました!(第一回JOAI参加記)
はじめに
こんにちは!setoです!
この度、日本人工知能オリンピック(JOAI)に参加しました!
初心者ながら、いろいろと頑張ったので、「せっかくだし記事にしてみよう!」と思い立ち、
初めてのブログ執筆に挑戦しています。
JOAIに挑戦したときのリアルな体験や感じたこと、工夫した点などをまとめています。来年以降にJOAIを受ける方や、KaggleやAIに興味を持っている方にとって、少しでも参考になれば嬉しいです!
自己紹介
高校生です!
これまでは主に競技プログラミングに取り組んでいましたが、ある日データサイエンスに興味が湧き、「東京大学グローバル消費インテリジェンス寄付講座(GCI2024冬)」を受講。
その講座でKaggleの存在を知り、同時期に耳に入ったJOAIにも「なんか面白そう!」と惹かれて参加を決意。Kaggleもそこから始めました。
とはいえ、開催中のコンペにはまだ出たことがなく、ひたすら過去問を解いて勉強していた日々です。
日本人工知能オリンピック(JOAI)って何なのさ
簡単に言うと、国際人工知能オリンピック(IOAI)の日本代表を決める大会です!
日本人工知能オリンピック(JOAI)は、国際科学オリンピックの一つである「国際人工知能オリンピック (International Olympiad in Artificial Intelligence; IOAI)」の日本代表選手選考を兼ねています。
第1回大会では、2025 年 8 月に中国・北京で開催される第2回国際人工知能オリンピック (International Olympiad in Artificial Intelligence 2025; IOAI2025) の代表選手を選抜します。
出典:JOAI2025 受験案内
今年が第1回開催ということで、事前情報も少なく、選手たちは手探り状態で戦うこととなりました。
今回のデータ
今回のデータの概要を乗せておきます
概要
データ数
データ数は、以下のとおりです。
・train: 5760件
・test: 640件(Public, Private で 50% ずつ)
特徴量
入力として用いる特徴量は、センサに関する測定値が2種類、赤外線画像、そしてその画像を説明したテキストの4種類になります。そして、正解ラベルが用意されています。
・MQ8 - ガスセンサによる測定値。
・MQ5 - ガスセンサによる測定値。
・Caption - 画像を説明したテキスト。本コンペティションで提供している画像は一部を切り抜いているが、このテキストは切り抜き前の画像を基に生成した。
・image_path_uuid - images フォルダ内の対応する画像。
・Gas - 正解ラベル。
競技
競技スタート
2025年4月25日(金)19:00、第1回JOAIの開会式がオンラインで開催されました!
一緒に出場する後輩に「ドキドキしてきた〜」とDiscordで話しながら、私も開会式に参加。
運営やスポンサーの紹介が終わると…ついに運命の問題公開!
なんか得意そうな問題来てくれーーーーーと思い問題を見ます!
マルチモーダル情報からガスを分類しよう
(Kaggleコンペティションページから引用)
・・・えっ、マルチモーダル情報ってなに???
困惑しながらも問題文を読み進めます。
このコンペティションでは、表・画像・テキストのマルチモーダル情報から、ガスに関する分類タスクに取り組んでいただきます。各データは、ガスセンサによる2つの測定値と、同時に赤外線カメラで撮影された画像、および画像を説明したテキストから成ります。ガスは「Perfume」「Smoke」の2種類存在し、それぞれの有無を考慮した4つのラベルが存在します。(Perfume, Smoke, Mixed, NoGas)
(Kaggleコンペティションページから引用)
なるほど、マルチモーダルってのは、「複数の種類のデータを組み合わせる」ってことか〜!
……とはいえ、マルチモーダル情報を扱う問題なんて、解いたことがありません(泣)
どうしよう。どこから手をつければいいのかもわからない。
やばい。やばい。やばいです。
初提出
取りあえず、落ち着きましょう。
まずは何でもいいから提出して、スコアを出すことが先決です。
というわけで、まずは表形式のデータ(センサ値)だけを使って、LightGBMにぶち込んで提出!
結果、F1スコア:0.669
良かった!提出できた!最低ラインはクリアした!
…しかし、Leaderboardを見ると圧倒的最下位。
提出者がまだ10人程度とはいえ、このスコアでは到底戦えません。
2回目の提出
さて、圧倒的最下位の私ですが、まだ諦めてはいません
このコンペはAIの使用が許可されています
ChatGPT、Cursor などの生成 AI ツールの利用は可能
出典:JOAI2025 受験案内
というわけで、わからないところはChatGPT先生に質問しまくり、
一部コードも手伝ってもらいながら、2回目の提出へ!
ドキドキしながら提出を待ち……
結果は、F1スコア:0.981!!
なんと一気に1位へジャンプアップ!
これはもう…やばい、やばすぎる!!!
しかもこの大会は、国際大会IOAI2025の日本代表選抜も兼ねています。
つまり、今1位ということは……
日本代表になれる可能性がある!
嬉しすぎて、本当に飛び跳ねました。
その日は興奮しすぎて眠れなかったです(笑)
Day2
さて、二日目の土曜日になりました。
朝起きてLeaderboardを見てみると……なんと、2位に順位を落としていました。
学生である以上、月曜から金曜日は学校があり、なかなか時間が取れません。
つまり――この土日が勝負。気合を入れ直して、再び問題に取り組んでいきます。
次に目をつけたのは「画像が見づらい問題」。
どうにかして特徴を強調できないかと考え、画像にエフェクト(Augmentation)をかけてみることにしました。
たとえば、以下のような画像が与えられていました。
画像データの例
この画像はまだ色がはっきりしていますが、
他の画像はほとんど同じような色で構成されているものもあり、
「これ、見て分かる人いる?」と思うくらい、特徴がつかみにくいものが多かったのです。
ということで、試したAugmentationは以下の通り。
- GaussianNoise
- CLAHE
- RandomBrightnessContrast
- InvertImg
- ToGray
- Resize + CenterCrop
結果はというと……スコアはほとんど変わらず。
このときは、スコアを確認する方法として、
・手元でF1スコアを出す
・実際にKaggleに提出してみる
のどちらかしか手段がなかったんですが、提出して確かめる方に頼っていたら、
あっという間に提出回数制限(5回)に引っかかってしまいました。
ということで、大きな成果もなくDay2は終了。
GPUと提出制限に悩まされた1日でした。
Day3
朝起きると、なんとか2位キープ。
しかし、お昼を過ぎた頃には、5位に転落してしまいました[1]。
この日は、Optunaを使ってハイパーパラメータのチューニングに取り組みました。
が、結果は……スコアは上がらず、ただGPU時間が減っていくだけという虚しい時間に。
Day4
ついに、7位に転落[2]。
「え、なんでこんなに抜かれるの……?」と焦りつつ、ふと思い出しました。
そういえば、ここまで一度もEDA(探索的データ解析)をやってない!
この時点で、「機械学習やってる人が見たらツッコミたくなるだろうな…」と苦笑しながら、
ようやくEDAに着手しました。
今回の大会では、ありがたいことにチュートリアルとして
・EDA用のコード
・学習・推論用のコード
が最初から配布されています。私は素直に、EDAチュートリアルを使わせてもらいました。
まずは、予測対象である Gas カラムの分布を確認。
NoGas | Perfume | Mixture | Smoke |
---|---|---|---|
1,440 | 1,440 | 1,440 | 1,440 |
どうやら、データに偏りはなさそうなことが分かりました。
この調子でどんどんEDAを進めていきます
Day5・6
順位は……12位まで落下。
いや、下がりすぎじゃない?(焦)
しかし、前日のEDAで掴んだヒントが光りました。
これは、センサーの MQ8 と MQ5 の割合をプロットしたグラフです。
Mixture は MQ8 の割合が 40%前後
Smoke は 62〜63% にピーク
と、明確な違いが見えてきました。
「これは使える!」と直感した私は、この特徴量をモデルに組み込みました。
結果——
F1スコア:0.984 を記録し、順位も7位まで復活!
勢いに乗って、次は「どこで間違ってるのか?」をチェックできるように、
クラスごとの誤分類パターンを手元で可視化してみました。
この出力を見ると——
なんと NoGas と Perfume の判別で、やたらミスってる!
「そりゃそうだ、香水の中にガス成分っぽいのもあるし、無臭っぽいのもあるし……」と納得しつつ、
残された時間は、NoGas と Perfume の違いを見つける旅に全力投球。
「これだ!」という特徴を探して、ログをにらみ、グラフを描き、試行錯誤が始まりました。
Day7
いよいよ大会も終盤。順位は9位に。
今日も引き続き、あの因縁の「NoGas vs Perfume」の違いを見つけようと、試行錯誤を重ねます。
NoGas と Perfumeの違いを見つけるべく試行錯誤しました
でも……この辺りから、じわじわと焦りが出てきました。
LightGBM以外のモデルに手を出したり、アンサンブルに挑戦したり、
思いつく限りの特徴量を追加してみたり——
やれることはやったつもりなのに、スコアはまったく伸びず。
「そろそろ打つ手が尽きたか……?」
そんな気持ちがよぎり始めた、そのとき。
senserは表のデータ imageは画像データです
ここで、あるグラフに目が留まります。
「センサーデータ(表形式)が強すぎて、画像やテキストが全然効いてない……!」
この気づきから、戦略を大転換。
「画像やテキストの情報、もっと活かせないか?」という方向にシフトしました。
まず手始めに、画像データの存在感を上げるため、画像側にもK-Foldを適用[3]。
Foldごとにモデルを訓練し、その平均で予測することで、画像の特徴がもう少し強調されるはず……と思ったのです。
結果、手元のF1スコアは上昇!
「これはイケる!」と意気込んで提出したのですが——
……スコアは大幅ダウン。
おそらく、原因は過学習[4]。
「うわ……これはやっちまったかも……」と、頭を抱えました。
さらに追い打ちがかかります。
なんと、KaggleのGPU使用時間がついに0になってしまったのです。
仕方なくGoogle Colabに切り替えようとするも、
データの読み込みに手間取ったり、セッションが切れたり……まさに踏んだり蹴ったり。
苦戦の末、私が選んだのは——
「もうKaggleのCPUだけで戦うしかない」
より過酷な、最終日が幕を開けました。
Day8 最終日
さて、いよいよ最終日。
順位は13位まで落ちていました。
「最後まで食らいつかないと……!」という気持ちはあるものの、
もう打つ手が尽きかけていて、正直かなり追い詰められていました。
頭の中は、「NoGasとPerfumeの違いは何か?」でいっぱい。
そのとき、ふとテキストデータに注目します。
「そういえば、“Gas”って単語、どれくらい入ってるんだろう?」
試しに出現割合を見てみると──
NoGas | Perfume |
---|---|
7.5% | 17.9% |
おっ、2倍以上の差!
「これは使えるかも……!」と期待を込めて、新たな特徴量として実装。
CPUでの処理はなかなか終わらず、祈るような気持ちで待ちます。
そして出た手元スコアは──大幅ダウン。
それでも、提出回数にはまだ余裕があったため、
「もしかしたら……」と最後の望みにかけて提出。
……しかし、結果は惨敗。
ここで、私の挑戦は幕を閉じました。
コンテスト終了後、金賞を受賞したkanda9685さんの記事を読んでみると、
私とはまるで真逆のアプローチを取っていて、思わずがっくり。
結果!
コンペは終了。しかし、本当の勝負はここからです。
Kaggleには「Publicスコア」と「Privateスコア」があり、最終順位が確定するのは終了後。
祈るような気持ちで、順位表を更新します——
……結果は、21ランクダウンの53位。
選抜枠内では24位という成績になりました。
あまりの順位変動に、正直、驚きを隠せませんでした。
とはいえ、自分の力を出し切っての結果だったので、
「これが今の実力か」と、悔しさはありつつも 納得していました。
まとめ
ここまで読んでいただき、本当にありがとうございました。
正直、思い通りにいかないことばかりで、悩み、焦り、落ち込むことも多かったですが、
最後まで全力で取り組んだこの経験は、自分にとって大きな財産になりました。
そして何より、普段の生活では得られないような刺激や学び、仲間との出会いに恵まれたことが、何よりの収穫です。
最後に、こんな貴重な機会をくださった関係者の皆さまに、心より感謝申し上げます。
本当にありがとうございました!
-
この大会では、IOAIの選抜を目的とする選抜枠と、誰でも参加可能なオープン枠が設けられました。
この5位というのは、選抜枠内の順位です。また、これ以降の順位も選抜枠内での順位となります。 ↩︎ -
ここから順位のメモを残していなかったので、記憶に残っている範囲で書いていきます。 ↩︎
-
K-Foldは、データを「K個のグループ(Fold)」に分けて、1つをテスト用、残りを訓練用にしてモデルを何度も学習・評価する方法です。これにより、モデルの安定性や過学習のチェックがしやすくなります ↩︎
-
過学習とは、「訓練データにはうまく対応できるが、初めて見るデータには弱い」状態のこと。テスト成績は良いのに、本番でボロボロなタイプです ↩︎
Discussion