【Kaggle】Harmful Brain Activity 解法

こんにちは。私は情報系の学部4年生(院進学予定)です。研究室では主に数理統計の理論について取り組んでいます。そんな私が、Kaggleで開催されていた脳波(EEG)データを扱う「HMSコンペ」で奇跡的に入賞しました。

そしてkaggle  Expartになりました。ヤッター

f:id:konchu2:20250308010746j:image

当時の取り組みを振り返りながら解法をまとめたいと思います。

はじめに

  • 背景・自己紹介

    • 学部:情報系(B4 → 院進学予定)
    • 研究室:数理統計(理論中心)
  • Kaggleでの基本的な戦略

    • フルスクラッチは難しいので、公開ノートブックやディスカッションを参考にする。
    • 少しだけ改変できそうな部分は、AIに助言をもらいながら試行錯誤。
    • いろいろとアンサンブルして Submit → あとは祈る。
    • こうした地道な方針でも、意外と良い結果が得られることがあるのでおススメです。

この記事は、私が試行錯誤したプロセスを整理する目的で書いています。

コンペ概要

タスク

  • EEGデータ(脳波)を用いて、「発作(Seizure)」や「異常な脳活動」を分類するモデルを作る。
  • EEGデータをスペクトログラム(音の周波数のようなものを可視化した画像)に変換し、その画像を分類する。

ラベルの種類(6クラス)

  1. Seizure(発作)
  2. LPD(片側性周期性放電)
  3. GPD(全般性周期性放電)
  4. LRDA(片側性リズミカルデルタ活動)
  5. GRDA(全般性リズミカルデルタ活動)
  6. Other(その他)

注目ポイント:専門家の投票数

  • データには「専門家の投票数」という信頼性の指標が付与されており、多いほどデータの質が高いと考えられる。
  • “Other”に票が集中しているデータは曖昧なケースの可能性が高い。
  • 投票数の扱い方を工夫することが、このコンペでの成績を左右すると感じました。

データの扱い方

高品質データと低品質データの分割

投票数」を基準にデータを2つに分けました。

  1. 高品質データ:投票数が10票以上
  2. 低品質データ:投票数が1~9票

高品質データのみで先にモデルをトレーニングし、その後、低品質データをどう活用するかを工夫しました。この単純な戦略でも、モデルのパフォーマンスが大きく向上しました。

自己学習(擬似ラベリング)の活用

「低品質データ」をそのまま捨てるのではなく、モデルに疑似ラベルを予測させ、その結果を再度モデルに学習させる**自己学習(擬似ラベリング)**を試しました。大まかな流れは以下のとおりです。

  1. 初期トレーニン
    • 高品質データのみでモデルを学習。
  2. 擬似ラベル付与
    • 学習済みモデルで低品質データに対して予測ラベルを付与。
  3. 擬似ラベルの改良
    • 低品質データの擬似ラベルと元のラベル情報を組み合わせて、新しいデータセットを作成。
    • 高品質データの50%にも同様の処理を行い、データ全体のバランスを整える。
  4. 再トレーニン
    • 改良したデータセットを使ってモデルを再学習。
  5. ファインチューニング
    • 最後に高品質データで微調整して仕上げる。

「本当に精度が上がるのか?」と半信半疑でしたが、結果はなかなか良好でした。まるでモデルを“育成”する感覚で、愛着が湧きました。

スペクトログラムの拡張

EEGデータはそのままだと扱いづらいため、スペクトログラムに変換するのが一般的です。しかし、提供された10分間のスペクトログラムだけでは物足りなかったため、複数の時間スケールでスペクトログラムを作り直しました。

  1. 10分間(全体像を把握)
  2. 50秒間(やや細部を確認)
  3. 10秒間(さらに細部を精密に確認)

これら3種類を組み合わせて512×512ピクセルの1枚の画像にまとめることで、「大まかな流れ」と「細かい特徴」の両方を捉えられるようにしました。結果、モデルの性能が大きく向上しました。

モデル選択と組み合わせ

EfficientNetB0

  • 特徴:軽量で高速、かつ精度もそこそこ高い。
  • メリット:データが多くなくても、比較的良い性能を発揮。

ResNet

  • 特徴:より深い構造で複雑なパターンを捉えられる。
  • メリット:EfficientNetB0だけでは拾えない詳細な特徴を補完。

なぜ両方を使ったのか?

  • EfficientNetB0 → 全体の大まかな特徴を素早く捉える。
  • ResNet → より深いレベルでのパターン抽出が可能。

この2つをアンサンブルすることで、速さと正確さの両方を両立しました。

振り返りと今後の展望

  1. データの質を見極める重要性

    • 専門家の投票数を基準にデータを分割しただけで、予想以上にモデルの性能が上がった。
    • 「ラベルの信頼度」が高いデータを優先的に学習させるのは、精度向上のカギになると実感。
  2. 擬似ラベリング(自己学習)の可能性

    • 低品質データも捨てずに活用することで、モデルを“自分で賢くさせる”アプローチが効果的だった。
    • データをただ使うのではなく、“育てる”という発想が楽しい。
  3. モデルの使い分け

    • EfficientNetB0とResNetの組み合わせにより、速度と複雑なパターン抽出の両立ができた。
    • 今後は時系列の情報をより活かせるモデルなどを試してみたい。

まとめ

以上が私が脳波(EEG)データを扱うHMSコンペで取り組んだ内容です。データの信頼度を見極めつつ、捨てずに活かす工夫をすることで、初めてのKaggleメダルを獲得することができました。機械学習にはまだまだ不慣れで、プログラミングも得意とはいえませんが、公開ノートブックやAIの助けを借りながらでも結果を出すチャンスは十分あると感じています。