Slide 1

Slide 1 text

© DeNA Co., Ltd. 1 睡眠コンペ 1st place solution (Child Mind Institute - Detect Sleep States) “shimacos vs. sakami vs. kami” を代表して kami 株式会社ディー・エヌ・エー

Slide 2

Slide 2 text

© 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) ○ 色々なタスクやります ■ レコメンド ■ 鳥の音声認識 ■ 自然言語処理 ■ 系列データ処理 …

Slide 3

Slide 3 text

© 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

Slide 4

Slide 4 text

© DeNA Co., Ltd. 4 目次 自己紹介 コンペ概要 1st level model 2nd level model & Post Processing 1 2 3 4

Slide 5

Slide 5 text

© DeNA Co., Ltd. 5 2. コンペ概要 データ / タスク概要

Slide 6

Slide 6 text

© DeNA Co., Ltd. 6 1 タスク概要 ● 手首につけた加速度計のデータから入眠(onset)と覚醒(wakeup)のイベントを検出する 引用:https://www.kaggle.com/code/patrick0302/viz-of-sleeping-time-series

Slide 7

Slide 7 text

© 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

Slide 8

Slide 8 text

© DeNA Co., Ltd. 8 データ概要: ラベル ● 一晩ごとに1個ずつ入眠と覚醒イベントがアノテーションされている ○ ラベルが付けられていない夜も時々ある 3 引用:https://www.kaggle.com/code/veronikasarikaya/it-s-a-wonderful-wonderful-sleep-eda

Slide 9

Slide 9 text

© 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

Slide 10

Slide 10 text

© 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分ご との確率を予測

Slide 11

Slide 11 text

© DeNA Co., Ltd. 11 3. 1st level model シングルモデル

Slide 12

Slide 12 text

© 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

Slide 13

Slide 13 text

© DeNA Co., Ltd. 13 参考:CV戦略 ● シリーズ(数日~数十日分の測定データのまとまり)が 277 あってこれを5分割 ○ 各fold内で出現するシリーズのイベント数がバラつくようにしたい → イベントの数を qcut で10個に分類しStratifiedKFold ○ それでも 1 fold での実験結果のスコアはクロスバリデーションでの実験結果のスコアに比べ てブレが激しかったので、手元で実験を進める際は基本的に全fold学習して評価する必要が あった(普通に KFold でも良かったかも) ● PublicはTrainデータに比べてデータ量が少ない & Testの性質に大きな違いはなさそう → Trust CV で進める 2

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

© DeNA Co., Ltd. 16 1st level model: ターゲットの作り方・学習方法 ● 正解となるイベントは1種類につき1日1つ しか生じない ○ 17280ステップ(=1日)の1ステップ ○ そのまま使ってもうまく学習できない ● Ground-truth からの時間差に応じて減衰 するようなターゲットを作成 ○ エポックごとに減衰を強くして学習する ことで、最終結果が急峻になる ○ イベントを中心に正規分布のターゲット を作成したチームが多かった模様 5 …

Slide 17

Slide 17 text

© DeNA Co., Ltd. 17 参考:5秒ごとの予測値からのイベント検出 ● やりたいこと ○ 5秒ごとの予測値から、提出形式にするために入眠 or 覚醒イベントを検出 ■ 5秒ごとの予測値をそのまま使うとイベントの検出し過ぎになる 6 ● 方法 ○ scipy.signal.find_peaks を利用して極大点を ピークとして検出するチームが多かった ■ ピークの閾値(threshold)とピーク間隔の 最低値(distance)を設定可能 ● 最終提出では使わなかった

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

© 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で割った余り の分布 これらを考慮した処理を考えたい

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

© DeNA Co., Ltd. 21 2nd level model の効果 ● 正解イベントのアノテーションの偏りのようなものを考慮できるように 3

Slide 22

Slide 22 text

© 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)

Slide 23

Slide 23 text

© 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 とかになるとマッチしない ) 検出イベント

Slide 24

Slide 24 text

© 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

Slide 25

Slide 25 text

© 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

Slide 26

Slide 26 text

© 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 ごと に管理する必要あり

Slide 27

Slide 27 text

© DeNA Co., Ltd. 27 その他 Post Process のテクニック ● 性能向上 ○ (重要) 2nd level model の予測値を daily で normalize ■ 基本的に起床と入眠は1日に1セットしか生じないのでうまくいった模様 ● 高速化 ○ Step2 のスコア再計算の際は差分更新を行うことで高速化 ■ ナイーブに全体の再計算を処理すると時間がかかる ○ JITコンパイルによる高速化 9

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

© DeNA Co., Ltd. 29