見出し画像

Kaggle HMS体験記


はじめに

ギリアでインターン生をしている竹森と申します。
本Tech blogは、機械学習の経験が浅い学生が、機械学習の世界的なコンペティションであるKaggle *1 に臨んだ体験記です。
Kaggleに馴染みのない情報系の方はもちろん、文系の学生なども含めた多くの人々が機械学習に触れる機会になればと思います。

バックグラウンド

著者について

情報系の大学に通っている一般的な大学院生です。
生物系のラボに所属し、実験データをPythonを用いて解析しています。
機械学習に興味があり、半年ほどAIエンジニアとしてインターン生をしています。

Kaggleに参加したきっかけ

大学での研究テーマの関連から時系列のデータ解析に興味があり、参加しました。
今回は、実装力を身につけるため、なるべく他の人のNotebookを見ないようにしながら開発を行いました。

Kaggleについて

Kaggleは、世界規模のデータサイエンスコンペティションです。
様々な団体がコンペティションを主催し、それらを通じて機械学習の手法が共有されます。上位の成績を納めた人にメダルが付与され、最上位には賞金も与えられます。
コンペティションは、数ヶ月単位で開催されます。Kaggle内のNotebookに、機械学習モデルを作成する形式です。
以前にこのブログでもギリアのエンジニアがKaggleの記事 *2 を書いていますので、是非ご覧ください。

本コンペティションについて

今回参加したコンペティションは「HMS - Harmful Brain Activity Classification *3 」です。
以下、詳細についてお話しします。

目的

本コンペの目的は、重症患者から記録された脳波(electroencephalography; EEG)の信号をもとに、発作やその他の有害な脳活動を検出し分類することです。
現在、脳波の監視は専門の神経学者による手作業で行われており、この手間が大きな課題となっています。本コンペのような脳波の異常パターン分類が可能になることで、この問題を解決でき、医師や脳研究者の迅速な検出・治療が可能となると考えられます。

具体的な目的は、各脳波データが6種類の脳波の異常ラベルのどれであるか、それぞれの確率を予測することです。異常ラベルは、seizure_vote, lpd_vote, gpd_vote, lrda_vote, grda_vote, other_voteの6種類です。
この問題は、機械学習の問題の中でも特に「多クラス分類」という問題に分類されます。

データセットについて

データセットは以下の2種類です。

  • EGG (脳波データ)

    • 200Hzで取得された脳波

    • 20個の電極ラベルごとに保存されている (電極ラベル: Wikipedia *4 参考)

  • 脳波のスペクトログラム

    • スペクトログラム: 時系列に周波数特性を記録したもの

    • 2秒おきに与えられている

    • 脳の部位別に与えられている。部位は、LL(left lateral), RL(right lateral), LP(left parasagittal), RP(right parasagittal)の4つ

これらを判断材料とし、脳波がどの異常であるかを特定する機械学習モデルの作成をしました。

実施内容1: データの前処理

1. 異常ラベルの確率を算出

今回の異常ラベルの予測は、確率を基準に評価をしました。(詳細は「実施内容2: モデルの作成」)
データセットの異常ラベルは、”投票数”(ラベル名はvote)で与えられており、”確率”ではありませんでした。
そこで、全ての異常ラベルの投票数の合計で割ることで確率として再定義しました。

2. 特徴量の抽出

機械学習で分類を行うには、分類を行うための特徴量(判断材料)が必要です。
例えば、猫、犬、馬を機械学習で分類する場合、「体の大きさ」や「体の色」などが特徴量として挙げられます。

与えられたEEGはFig.1のようでした。
EEGより抽出した特徴量は以下の通りです。

  1. FFT(高速フーリエ変換, Fast Fourier Transform)のピーク: 0〜100 Hzを10 Hz領域別に区切り、それぞれで取得。最大Amp(強度)の40%以上のAmpのみを取得した。

  2. 標準偏差: 全時間領域に対して適用

  3. 平均値: 全時間領域に対して適用

  4. 最大値: 全時間領域に対して適用

  5. 最小値: 全時間領域に対して適用

  6. 脳波の電極ラベル: EEGの計測位置。20種類

FFTはEEGの「周波数特性」、標準偏差・平均値・最大値・最小値はEEGの「波形の特徴」を反映させるために使用した。

これらの特徴量はLightGBM(後述)で使用しました。

Fig.1 与えられた時系列脳波データ(EEG)

3. EfficientNet用の画像の作成

与えられたスペクトログラムの数値から、カラーマップを作成しました。外れ値による影響を除外するため、5 〜95%のAmpの範囲の値のみを利用しました。
4つの脳の部位別に作成し、最終的に4枚を並べた画像を用いました。
スペクトログラムは、EfficientNet(後述)で使用しました。

Fig.2 与えられたスペクトログラム

実施内容2: モデルの作成

今回はLightGBM、EfficientNetの2種類のモデルを用いました。
複数の手法で得られたモデルをアンサンブル学習させることで、多様なデータに対して汎用性の高いモデルが作れるのではないかと考えました。

1. LightGBM

決定木手法の1つ。決定木手法は、与えられる特徴量(情報)から、どのグループかを予測する手法の1つで、視覚的にわかりやすいのが特徴です。

Fig.3は、男子と女子のどちらのグループかを分類する決定木モデルです。身長・握力・10m走のタイムという特徴量を使ってグループを予測しています。

LightGBMは、決定木手法の中でも、その名の通りLight(軽い)のが特徴です。このモデルは、勾配ブースティングという、予測が正しくできなかった部分を中心的に学習し、精度を高める仕組みがあります。
今回は、LightGBMを用いて異常ラベルごとの確率を求めました。

LightGBMの学習には、確率が最大の異常ラベルを目的変数として使用しました。最大の異常ラベルに設定した理由は、LightGBMの仕様によるもので、多クラス分類において、目的変数がスカラーでしか与えることができません。そのため、ラベルごとに対応する値(0, 1, 2, ...、カテゴリ変数と言います)を設定し、最大の異常ラベルに対応した値を目的変数としました。

Fig.3 決定木手法 [NTTコム オンライン. 決定木分析の事例を使ってメリットや活用場面を紹介 *5]

2. EfficientNet

画像認識モデルの1つです。
LightGBMではEEGから得られる特徴量を使用したのに対して、EfficientNetは画像から自動的に特徴量を抽出します。
本コンペで多く使用されているモデルで、深層学習の手法の中では少ないパラメータにも関わらず精度が高いことが特徴です。

画像認識モデルを使用することで、テーブルデータとして予測するLightGBMに対して、画像から得られる特徴量を用いた手法での予測を得ることを期待しました。
スペクトログラムとラベルごとの確率を使用してモデルを作成し、ラベルごとの確率を予測しました。

3. アンサンブル

機械学習の予測精度は、アンサンブル学習をすることで一般的に向上することが知られています。
アンサンブル学習とは、複数のモデルの予測結果を統合して最終的な予測結果を出力することです。
1人よりも複数人で話し合った方がより良い意見が得られる、という考えです。

今回は、LightGBM・EfficientNetのそれぞれの予測確率を平均し、最終的な予測確率の算出を行いました。

4. 評価指標

KLD(Kullback-Leibler Divergence)は、2つの確率分布の違いを評価する指標です。
具体的には、2つの確率分布P(x), Q(x)の違いを以下の式のように評価しています。

やっていないこと

以下の事項は、時間の都合上取り組むことができませんでした。

EfficientNet

今回、EiifientNetで使用したスペクトログラムは、計測位置別のデータを“四分割に並べたもの”です。
“縦一列”など他の並べ方をすることで精度が向上するのではと考えました。

アンサンブル

今回、アンサンブルでは、LightGBMとEfficientNetの予測結果の平均値を算出しました。
他の手法として、重み付け平均などもあり、予測したラベルや特徴量によって場合分けして適切な重みを定義することで、より柔軟で精度の高いアンサンブルとなると考えました。

感想

今回の取り組みを進めていく中で感じた点を列挙します。

手法に関して

前述した通り、私は元々機械学習が畑の人ではなく、今回のKaggleで用いた手法は全て初めて触れるものでした。

1. LightGBM

LightGBMは初めて使うものの、原理的な理解が容易なため、あまり苦労をせずに開発ができた印象でした。汎用的な決定木手法であるGCBTに比べてコストが低く、それでいて精度が良いです。よく使われる手法を学び・使えたので良い経験となりました。

2. EfficientNet

画像認識系の手法は直感的な理解が難しかったため、開発に苦労しました。これまで、時系列データはFFTのピークなど特徴量を用いたモデルのみを扱っていたので、プロット画像を学習するという大胆な手法には大変驚きました。
精度向上に向けたハイパーパラメータチューニングも、試行錯誤しました。入力画像の修正(カラーマップの種類の変更、プロット時の余白の削除など)や、モデルの変更(B0~B7、詳細はこちら *6)など、基礎的な部分のみの修正しかできませんでしたが、わからないなりに多くの仮説を立てて検証を行っていくのは面白かったです。
今後は、画像系に対しても原理的な理解ができるように努める所存です。

総じて、本プロジェクトを通して、時系列データの解析には多様な手法が存在することを手を動かしながら学ぶことができ、非常に良い経験でした。

GitおよびGitHubの活用

  • データの前処理、LightGBM、EfficientNetなど、フェーズごとに適切にブランチを分けて進行することができました。

  • カンバン(Projects)により、タスク別にフェーズ、進行状況、結果をまとめ、プロジェクトの進行をより円滑に行うことができました。

その他開発に関して

  • 本プロジェクトで使用したコードの実行は、全てscripts/main.pyで行い、引数によって実行内容を調節する仕組みです。内部の機能をもつスクリプトはscripts/functions内に入っています。この形式は、コードの利用者にとって簡潔であると言えるでしょう。

  • 本プロジェクトでは、メンターであるギリアのエンジニアの方にアドバイスをいただき、開発は基本的に竹森自身が行いました。時間が限られる中で多様な機能を実装できたことは、誇れる成果であり、エンジニアとして成長を感じるものでした。

Kaggleに関して

本プロジェクトが、私にとって初めてKaggleに触れる機会でした。以下、Kaggleに関する感想を述べていきます。

  • コードの公開

コンペでは多くのコード・モデルが公開されており、より良い精度のモデルを多くの人が使える環境が整っていると感じました。実際に、EfficientNetなどの手法はKaggleで初めて知りました。

  • 期間の長さ

KaggleのコンペはAtCoderなどと異なり数ヶ月といった長期的に行われることに驚きました。また、今回の手法検討を含めた社内R&Dは、長期的な開発が見込まれます。そのため、開発期間の観点から、社内R&DにおいてKaggleを利用するのは適していると思いました。

  • Kaggle Notebook

このコンペでの最終的なモデルの提出はNotebookで行います。提出前にファイル別のスクリプトをNotebookに書き直すのに少し時間を要したので、今後Kaggleを扱う場合はこの点を考慮したいです。

最後に

今回私は、KaggleのHMSコンペに参加し、脳波の異常分類を行う機械学習モデルを作成しました。今回のタスクは、時系列データの多クラス分類に当たります。
機械学習モデルには、LightGBM・EfficientNetといったKaggleのCodeでもよく見かける手法を用いました。

特徴量の抽出や入力画像の作成を含め、全課程のスクリプトを作成しました。
これらは未知の手法を学び、実装するというエンジニアとして重要なスキルを身につけていることを示しており、成長を実感できる良い機会となりました。
また、ギリアでは他のエンジニアも同コンペに参加し、銅メダルを獲得しています。

 本コンペは、時系列データを扱う良い経験となりました。これまでの研究活動で学んだ時系列データの評価手法を適用する好機であると同時に、機械学習を中心とした新たな手法を学ぶことができる良い機会でもありました。
今後の活動においてこれらの手法を適切に使えるよう、また、今後も新たな手法を身につけるよう努めていきたいです。


引用:
*1: Kaggle: Your Machine Learning and Data Science Community https://www.kaggle.com/
*2: Kaggle 2023 Predict Student Performance from Game Play (PSP) コンペ解法の傾向まとめ|Ghelia Tech Blog|ギリア株式会社 https://note.com/ghelia/n/n4158a78971a7
*3: HMS - Harmful Brain Activity Classification | Kaggle https://www.kaggle.com/competitions/hms-harmful-brain-activity-classification/
*4: 10–20 system (EEG) - Wikipedia https://en.wikipedia.org/wiki/10%E2%80%9320_system_%28EEG%29
*5: 決定木分析の事例を使ってメリットや活用場面を紹介 :データ解析・分析手法 - NTTコム リサーチ | NTTコム オンライン https://www.nttcoms.com/service/research/dataanalysis/decision-tree/
*6: EfficientNetの各モデルの係数について #機械学習 - Qiita https://qiita.com/T-STAR/items/846036d48a3e1059a989

いいなと思ったら応援しよう!