こんにちは。NRIデジタル データサイエンスの柴です。
2022年11月~2023年1月の期間でNishikaで開催されていた「睡眠段階の判定 〜”睡眠の深さを判別しよう”〜」コンペ(以下、睡眠コンペ)に、同じくNRIデジタル データサイエンスの滝口さんと松崎さんと柴の計3名のチームで参加し、参加者636人中1位で優勝の結果を残すことができました。
この記事では、睡眠コンペの概要と自チームの用いた解法を紹介していきたいと思います。
コンペ概要
PSG
PSGとは、「ポリソムノグラフィー(Polysomnography)」の略称で、睡眠研究で一般的に使用される検査方法の一つであり、睡眠検査のゴールドスタンダードとされています。PSGは多くのセンサーを使用して、睡眠中の様々な生理学的変化を測定し、分析することができます。PSGの主なセンサーには、以下のようなものがあります。
- EEG(脳波):脳の活動を測定するために使用されます。
- EOG(眼電図):眼の動きを測定するために使用されます。
- EMG(筋電図):筋肉の活動を測定するために使用されます。
これらのセンサーによって収集されたデータは、PSG機器によって記録されて分析されます。分析により、30秒単位で各時刻における睡眠深度が分類され、患者の睡眠サイクルや、異常な睡眠の形態を特定することに利用されます。
睡眠深度
睡眠深度とは、睡眠の質を表す指標の一つで、眠りが浅いか深いかを表します。一般的に、睡眠深度は脳波の周波数や振幅の変化によって、次の5つに分類されます。
- Wake:覚醒状態。
- REM:レム睡眠。
- S1:浅いノンレム睡眠。
- S2:中間の深さのノンレム睡眠。
- S3/S4:深いノンレム睡眠。
睡眠深度は、個人差や睡眠障害の有無や環境の影響などによって変化することがあります。例えば、ストレスや疲れがたまっている場合、睡眠の質が低下して、浅い睡眠が続くことがあります。また、年齢とともに、睡眠の深さや質が低下することも知られています。
睡眠深度分類
PSGのセンサーデータから、各時刻における睡眠深度を分類するタスクを睡眠深度分類と呼びます。睡眠深度分類は、専門家が行う場合と機械学習によって行われる場合があります。両者を比較した際、以下のメリットから機械学習による睡眠深度分類が積極的に検討されています。
- コスト
- 専門家による睡眠深度分類は、高い専門性が求められ、教育コストや人的コストが高くつくのに対して、機械学習による睡眠深度分類では、安価な機械学習モデルを使用するため、コストを安く抑えられる。
- 時間
- 専門家による睡眠深度分類は、数時間のデータを処理するため、非常に時間がかかるが、機械学習による睡眠深度分類では、大量のデータを高速に処理できるため、時間を短縮できる。
機械学習による睡眠深度分類では、PSGのセンサーデータと睡眠深度の組み合わせを訓練データとして、両者の関連を学習します。この学習済みモデルを用いて、PSGのセンサーデータのみから睡眠深度の予測を行うことができます。今回のコンペでは、機械学習による睡眠深度分類を行い、睡眠深度の予測結果のAccuracyの精度を競います。
自チームの解法
以下で解法の流れを説明していきます。
基本的な前処理→特徴量生成→モデル予測の流れで構成されています。
前処理
データ取得
今回のコンペでは、医学研究データリポジトリであるPhysioNetで、オープンデータとして公開されているSleep-EDF Database expanded (sleep-cassette サブセット)を利用しています。55人108サンプルの訓練データ、23人45サンプルのテストデータを扱います。今回使用するモダリティの一覧は以下になります。
- EEG1:前頭部の脳波を測定する。サンプリング周波数は100 Hz。
- EEG2:後頭部の脳波を測定する。サンプリング周波数は100 Hz。
- EOG:眼の動きを測定する。サンプリング周波数は100 Hz。
- 呼吸:呼吸を測定する。サンプリング周波数は1 Hz。
- EMG:筋肉の活動を測定する。サンプリング周波数は1 Hz。
- 体温:体温を測定する。サンプリング周波数は1 Hz。
- イベントマーカー:特定イベントの発生を記録する。サンプリング周波数は1 Hz。
edfファイルという扱ったことのないファイル形式に苦労しましたが、以下のように各種生体信号を取得しました。
データ範囲絞り込み
同様に、学習に使用する睡眠深度も取得しましたが、データ期間の22時間のうちのほとんどが、睡眠時以外の情報であることを確認しました。
このまま学習を行うと、睡眠時以外の情報に偏ったデータ分布になってしまう上、学習にかかる時間も長くなってしまうため、以下のように、睡眠前後30分の範囲に絞り、モデルの学習に使用することにしました。
特徴量生成
エポック分割
今回のコンペでは、特徴量の取得の仕方および取得する特徴量について、Sleep-EDF Database expandedのSoTA論文*1の手法を参考にしました。以下のように、30秒、60秒、90秒のマルチ解像度のウインドウを用いて、過去・未来の情報を踏まえたマルチドメインな形で特徴抽出を行いました。論文では、30×5、60×2、90×1で特徴抽出を行っていましたが、自チームの解法では、さらに増やした30×11、60×8、90×7で特徴抽出を行いました。
特徴量一覧
特徴抽出で取得する特徴量一覧を以下に示します。ここでは、SoTA論文で使用していた特徴量をベースにしています。加えて、呼吸データから睡眠深度分類を行う論文*2を参考に、呼吸のピーク間隔特徴量を追加し、各周波数帯ごとの特徴量について、ピーク周波数とピークパワー特徴量を追加しています。
特徴量 | EEG | EOG | 呼吸 | EMG | 体温 | イベント |
---|---|---|---|---|---|---|
時間領域 | ||||||
基本特徴量(平均、標準偏差、四分位範囲、ゼロ交差数など) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Hjorth特徴量 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
フラクタル次元特徴量 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
エントロピー特徴量 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
ピーク間隔特徴量 | ✓ | |||||
周波数領域 | ||||||
基本特徴量(スペクトル重心、バリアンス、歪度、尖度) | ✓ | ✓ | ||||
ビンフーリエエントロピー | ✓ | ✓ | ||||
各周波数帯ごとの特徴量 | ✓ | ✓ |
時間領域特徴量
時間領域の特徴量の中で、基本特徴量の取得の例を以下に示します。生体信号の振幅から平均、標準偏差、四分位範囲、ゼロ交差数などを取得しています。他にも、EEGの解析によく用いられるHjorth特徴量、ヒグチフラクタル次元などのフラクタル次元特徴量、情報量を測るエントロピー特徴量、呼吸変動を捉えるピーク間隔特徴量を時間領域の特徴量として取得しています。
周波数領域特徴量
周波数領域の特徴量の中で、各周波数帯ごとの特徴量の取得の例を以下に示します。窓関数を用いて短時間フーリエ変換した後、各周波数帯ごとにスペクトルパワーやピーク周波数やピークパワーなどの特徴量を抽出しています。他にも、スペクトル重心、バリアンス、歪度、尖度などの基本特徴量、情報量を測るビンフーリエエントロピーを周波数領域の特徴量として取得しています。
標準化
睡眠には個人差があることや装置の装着の仕方も毎回異なることによって、サンプル間で値の分布に差が生まれます。実際に、ここまで上記で取得した特徴量について、以下のようにサンプル間で分布の重心に違いが見られました。
そのため、以下のようにサンプルごとに標準化処理を施した特徴量を追加しました。これにより、サンプル内での変動を捉えやすくなります。
モデル予測
モデル予測は、LightGBMで行いました。StratifiedKFoldを用いて、5値の睡眠深度のデータ割合を保ちながらデータをk個に分割し、交差検証を行いました。交差検証とリーダーボードの結果をまとめて両者の相関を確認しながら、提出結果の選定を行いました。最終的には、シェイクを避けるために、seed違いとFold違いのものをまとめたアンサンブルモデルを最終提出としました。結果として、Publicスコアが0.8516、Privateスコアが0.8560となりました。
他チーム動向と反省点
今回のコンペでは、ディスカッションに投稿された深層学習を用いたベースラインを利用している方が多かった印象を受けます。深層学習とGBDTのどちらが精度が良いのかというのは、この分野の興味深いテーマの一つとなっており、両者の手法の結果を知れたという点で大変勉強になりました。
また、3位に入賞された方は、同じSoTA論文を参考にしながら、年齢情報の扱いや120秒解像度のウインドウなど、別の工夫の仕方を試されていました。そちらも大変勉強になりました。今回のコンペでは、SoTA論文を正しく実装した上で、どれだけ細かい改善を実装できるかが重要だったと感じました。
最後に、今回のコンペでは、データ量の大きいデータを如何に上手にハンドリングできるかも重要だったと思います。自チームでは、特徴量を増やしていく過程で、モデル予測にかかる時間がどんどん増えていき、改善のサイクルを短い時間で回すことができなくなりました。検証用の軽いモデルを用意したり、特徴量の次元削減などを検討できれば、もっと多くのことを試せたのではないかと反省しています。
おわりに
まず初めに、今回のコンペに一緒に参加してくださった滝口さん、松崎さんに感謝申し上げます。初めてのコンペで不慣れな自分に対してたくさんのサポートをしてくださり、解法について様々な面でアドバイスやコードの改善をいただきました。ありがとうございました。
今回のコンペは、社内でチームを組んでの参加となり、新人の身としては普段は関われないようなレベルの高い方々と一緒にコンペに参加できる貴重な経験となりました。社内には、難しいコンペにも積極的に挑戦する方がたくさんおり、複数のコンペで上位入賞も果たしています。自分も今回の結果を踏まえて、今後もレベルの高いコンペに挑戦していきたいと思いました。