Upgrade to Pro — share decks privately, control downloads, hide ads and more …

睡眠コンペ 1st place solution

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for kami kami
August 03, 2024

睡眠コンペ 1st place solution

【第2回 関東Kaggler会】の登壇資料です。
Child Mind Institute - Detect Sleep States(通称:睡眠コンペ)の優勝解法について

https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states

Avatar for kami

kami

August 03, 2024

More Decks by kami

Other Decks in Technology

Transcript

  1. © DeNA Co., Ltd. 1 睡眠コンペ 1st place solution (Child

    Mind Institute - Detect Sleep States) “shimacos vs. sakami vs. kami” を代表して kami 株式会社ディー・エヌ・エー
  2. © DeNA Co., Ltd. 2 村上(murakami) 直輝 @634kami © DeNA

    Co., Ltd. 自己紹介 引用:https://www.kaggle.com/kami634 Kaggle @kami634 • メガベンチャーのDS ◦ 昨年度入社の新卒2年目 ◦ 現在は業務中のKaggle工数50% • Kaggle Master 🥇2(4)🥈0(4)🥉0(3) ◦ 色々なタスクやります ▪ レコメンド ▪ 鳥の音声認識 ▪ 自然言語処理 ▪ 系列データ処理 …
  3. © DeNA Co., Ltd. 3 参加期間は1ヶ月ほど • コンペ開始: 2023/9/6 •

    初サブ: 2023/11/6 • コンペ終了: 2023/12/6 (通称)睡眠コンペ の話をします 引用:https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/overview
  4. © DeNA Co., Ltd. 4 目次 自己紹介 コンペ概要 1st level

    model 2nd level model & Post Processing 1 2 3 4
  5. © DeNA Co., Ltd. 7 データ概要 • 合計 986.46 MB

    の csv & parquet データ • 5秒ごとの加速度計のデータ ◦ 基本は角度と加速度を表す2つの特徴量 (anglez, enmo) と時間情報のみ 2 引用:https://www.kaggle.com/code/veronikasarikaya/it-s-a-wonderful-wonderful-sleep-eda
  6. © DeNA Co., Ltd. 8 データ概要: ラベル • 一晩ごとに1個ずつ入眠と覚醒イベントがアノテーションされている ◦

    ラベルが付けられていない夜も時々ある 3 引用:https://www.kaggle.com/code/veronikasarikaya/it-s-a-wonderful-wonderful-sleep-eda
  7. © DeNA Co., Ltd. 9 提出形式・評価方法 • 提出形式:検出した入眠と覚醒イベントを確信度のスコアとともに提出 • 評価方法:ground-truth

    からtolerance(1, 3, 5, 7.5, 10, 12.5, 15, 20, 25, 30分)以内の最も確信度 の高いイベントがマッチされ、average precision (AP) が計算される → toleranceごとに計算して平均を取ったAPを、クラスごとに計算して平均を取る 4 引用:https://www.kaggle.com/code/patrick0302/viz-of-sleeping-time-series
  8. © DeNA Co., Ltd. 10 1st place solution 概要 5

    1st level model 2nd level model post process … 評価指標を最適化するように 2nd level model の予測結果から 提出ファイルを作成 highest score point!!! highest score point!!! 複数のモデルで 5秒ごとに入眠・ 起床の確率を予測 1st level model の予測結果を使い 1分ご との確率を予測
  9. © DeNA Co., Ltd. 12 1st level model: 概要 •

    入力:5秒間隔のデータ • 出力:入眠・起床となるかの5秒ごとの予測値 • モデル概要 (5モデル) ◦ CNN + GRU + CNN ◦ CNN + GRU + Transformer + CNN ◦ LSTM + Unet1d + Unet ◦ LSTM + Unet1d + Unet ◦ 1dCNN + Unet1d + Transformer • シングルベストは一つ目の sakami’s モデル (詳細は 1st place solution のディスカッションを参照) ◦ CV: 0.8206, public LB: 0.768, private LB: 0.829 (9位相当). すごい... 1
  10. © DeNA Co., Ltd. 13 参考:CV戦略 • シリーズ(数日~数十日分の測定データのまとまり)が 277 あってこれを5分割

    ◦ 各fold内で出現するシリーズのイベント数がバラつくようにしたい → イベントの数を qcut で10個に分類しStratifiedKFold ◦ それでも 1 fold での実験結果のスコアはクロスバリデーションでの実験結果のスコアに比べ てブレが激しかったので、手元で実験を進める際は基本的に全fold学習して評価する必要が あった(普通に KFold でも良かったかも) • PublicはTrainデータに比べてデータ量が少ない & Testの性質に大きな違いはなさそう → Trust CV で進める 2
  11. © DeNA Co., Ltd. 14 1st level model: 特徴量 •

    numerical features ◦ 角度 (anglez) ◦ 加速度 (enmo) ◦ 上記やその前後差分の rolling 特徴 • categorical features ◦ 時間情報 (hour, minute, weekday) ◦ 周期的な区間に含まれるかのフラグ ← これは? 3
  12. © DeNA Co., Ltd. 15 1st level model: データの部分的な周期性 •

    数十日分の特徴量を可視化する → 周期的に現れるパターンが存在することが分かる ◦ 24時間ごとに全く同じ値が出現していたのでそのパターンを検出 ▪ 正解ラベルが存在しないので後処理に使う or 特徴量として使う ◦ Jun Koda さんによると、24時間周期の平均を少数4桁で丸めたもので欠損値をうめていると のこと ( https://x.com/junkoda/status/1732219466057126294) 4
  13. © DeNA Co., Ltd. 16 1st level model: ターゲットの作り方・学習方法 •

    正解となるイベントは1種類につき1日1つ しか生じない ◦ 17280ステップ(=1日)の1ステップ ◦ そのまま使ってもうまく学習できない • Ground-truth からの時間差に応じて減衰 するようなターゲットを作成 ◦ エポックごとに減衰を強くして学習する ことで、最終結果が急峻になる ◦ イベントを中心に正規分布のターゲット を作成したチームが多かった模様 5 …
  14. © DeNA Co., Ltd. 17 参考:5秒ごとの予測値からのイベント検出 • やりたいこと ◦ 5秒ごとの予測値から、提出形式にするために入眠

    or 覚醒イベントを検出 ▪ 5秒ごとの予測値をそのまま使うとイベントの検出し過ぎになる 6 • 方法 ◦ scipy.signal.find_peaks を利用して極大点を ピークとして検出するチームが多かった ▪ ピークの閾値(threshold)とピーク間隔の 最低値(distance)を設定可能 • 最終提出では使わなかった
  15. © DeNA Co., Ltd. 18 4. 2nd level model &

    Post Processing 1分ごとの予測をしてから最終提出を作成する
  16. © DeNA Co., Ltd. 19 2nd level model & Post

    Processing がなぜ必要か? • 理由1: 正解イベントは必ず hh:mm:00 のタイミング になっているうえ、なぜか偏りが存在する • 理由2: scipy.signal.find_peaks だと評価指標に対し て最適な出力にならない ◦ ground-truth からtolerance(1, 3, 5, 7.5, 10, 12.5, 15, 20, 25, 30分)以内の最も確信度の高いイベントがマッチ され、average precision (AP) が計算 1 引用 :https://www.kaggle.com/competitions/child-mind-institu te-detect-sleep-states/discussion/444374 ラベルの分数を15で割った余り の分布 これらを考慮した処理を考えたい
  17. © DeNA Co., Ltd. 20 2 2nd level model 概要

    • 入力:1st level model の予測値 + 元々の入力 • 出力:入眠・起床となるかの1分ごとの予測値 • モデル概要(5モデル) ◦ LightGBM ◦ CatBoost ◦ CNN + GRU ◦ CNN + Transformer ◦ CNN • 予測結果の加重平均を利用してPost Processingで最終提出を作成する
  18. © DeNA Co., Ltd. 21 2nd level model の効果 •

    正解イベントのアノテーションの偏りのようなものを考慮できるように 3
  19. © DeNA Co., Ltd. 22 Post Process 概要 • 2nd

    level model ◦ hh:mm:00 のタイミングで1分ごとに予測する 4 • Post Process ◦ hh:mm:15 or hh:mm:45 のタイミングで予測する • Result ◦ public: 0.768 (18th) → 0.790 (3rd) ◦ private: 0.829 (9th) → 0.852 (1st)
  20. © DeNA Co., Ltd. 23 Post Process で 15秒と45秒に注目する理由 •

    評価指標に最適化するため ◦ 正解イベントは必ず hh:mm:00 のタイミング ◦ 評価指標の計算に使われるtoleranceが 1, 3, 5, 7.5, 10, 12.5, 15, 20, 25, 30分 5 • 検出イベントが hh:mm:00 だと良くない ◦ tolerance 5,10,15,20,25,30 のときに端が抜ける • 検出イベントが hh:mm:30 でも良くない ◦ tolerance 7.5, 12.5 のときに端が抜ける ▪ 15秒と45秒を予測結果とするのが都合が良い ▪ (1~29秒 や 31~59秒の区間ならどこでも可) 00:20:00 00:19:00 00:18:00 00:17:00 00:16:00 00:23:` 15 00:15:45 00:21:00 00:22:00 00:23:00 tolerance 7.5 分 正解イベントがここでも閾値以内にマッチする (検出イベントが 00:23:30 とかになるとマッチしない ) 検出イベント
  21. © DeNA Co., Ltd. 24 Post Process のアルゴリズム概要 1. 全ての検出候補地点(15秒

    or 45秒の地点)のスコア算出 a. 実際にイベントとして検出するとどれだけ評価指標が上がり そうなのかを評価してスコアにする 2. 検出イベントの決定&スコアの再計算(500回繰り返す) a. 最もスコアが高かった地点を採用 b. 「採用した地点からtolerance以内のGround-truth 候補地点(0 秒の地点) 」の予測値を0にして、「tolerance以内の検出候 補地点(15秒 or 45秒の地点)」のスコアを割り引く 6 Score Recalculation … highest score point!!! highest score point!!! Score Recalculation
  22. © DeNA Co., Ltd. 25 Step1: 全ての検出候補地点のスコア算出 • 全ての検出候補地点についてスコア計算 7

    tolerance_N_score:  検出候補地点から tolerance N分以内の 2nd level model の予測値の合計 score = tolerance_1_score + tolerance_3_score + tolerance_5_score + … + tolerance_30_score tolerance_1_score tolerance_3_score
  23. © DeNA Co., Ltd. 26 Step2: 検出イベントの決定&スコアの再計算(500回繰り返す) 1. 最もスコアが高かった地点を採用 ◦

    検出したイベントとして提出用データフレームに追加 2. 「採用した地点からtolerance以内のGround-truth 候補地点(0 秒の地点) 」の予測値が0として、「tolerance以内の検出候 補地点(15秒 or 45秒の地点)」のスコアを割り引く 8 tolerance: 1分 tolerance: 1分 … highest score point!!! highest score point!!! 「採用した地点からtolerance以内の Ground-truth 候補地点(0秒の地点) 」 の予測値を0 「tolerance以内の検出候補 地点(15秒 or 45秒の地点)」 のスコアを割り引く 予測値が0になるかど うかは tolerance ごと に管理する必要あり
  24. © DeNA Co., Ltd. 27 その他 Post Process のテクニック •

    性能向上 ◦ (重要) 2nd level model の予測値を daily で normalize ▪ 基本的に起床と入眠は1日に1セットしか生じないのでうまくいった模様 • 高速化 ◦ Step2 のスコア再計算の際は差分更新を行うことで高速化 ▪ ナイーブに全体の再計算を処理すると時間がかかる ◦ JITコンパイルによる高速化 9
  25. © DeNA Co., Ltd. 28 おまけ話 • 後処理の経緯 ◦ チームメイトがこのアイデアを持ってきたのが終了

    1 週間前くらいだったのでそこから睡眠 時間を削って実装などを行っていた ◦ 後処理に関しては最初はあまりうまくいかず首を捻っていたが、1日ごとに予測値を正規化 することで性能が出るように ▪ アイデアとしては、1st level model に対して find peaks を使う際にすでに試していたの を流用しただけ ▪ ここまで劇的に改善するとは思ってなかった • コンペの学び:評価指標が特殊な場合はハックするとスコアが改善する場合がある ◦ ホストが解きたい本質的なタスクを改善しているわけではないかもしれないので注意 10