🤖
CMI - Detect Behavior with Sensor Data 上位解法MEMO
※ 個人用メモです。が間違っていたらご指摘ください🙏
コンペの概要
- CMI - Detect Behavior with Sensor Data
- 期間: 2025/05/30 ~ 2025/09/03
- 主催: Child Mind Institute
- 目的: 手首装着型デバイス「Helios」で取得したセンサーデータを用い、BFRB(Body-Focused Repetitive Behaviors) の動作を日常動作から高精度に識別するモデルを開発する。
(割と)共通している手法
- 各被験者が特定のgestureを1orientationにつき1回しか行っていないことを利用する。
- 特定のorientationでは、特定のgestureが出現しないことを利用する。
- SUBJ_019262 と SUBJ_045235は正しくデバイスを装着していないためデータを変換、もしくは削除
- IMUとTHM/TOFの右手系と一致するように左手系を変換する
- augmentation
- mixup
- cutmix
- timeshift/stretch
- 回転
各解法の特徴的な手法
1st Place Solution
- Devin's part
- TODは2x2の正方形を9つとり、それぞれの平均を計算する
- TOF-onlyのデータもアンサンブルに使うことで精度UP
- Ogurtsov's part
- いくつかのsampleを削除(gestureのないsequenceなど)
- scalerは使用しない
- accからgravityを除いたデータを使用して、35の特徴量を作成
- LSTMベース、attentionベース、CNNベースのモデルを使用
- timeshift, timistretchのaugmentationを使用
- 各FOLDで3runのうち、最も結果の良かった結果を採用する
- 推論時のシーケンスを少し伸ばすことで、モデルごとの相関を下げアンサンブルの効果大きくなる
- zyz part
- RNN, CNN1Dの組み合わせ
2nd Place Solution
- 4つのmodelを作成
- IMU rotationの欠損有無 x THM/TOFの欠損有無
- quaternionは6D表現を使用 (to avoid discontinuities)
- model: Residual SE-CNN Block + Attention model
-
そこで各時刻で 3クラスのフェーズ確率(移動中・ターゲット位置・ジェスチャー実行中)を予測し、フェーズごとにアテンションを分けて、確率で重み付けする。
- これによって各フェーズに特化した特徴を抽出し、長いフェーズにattentionが集中するのを防ぐ。
- TODには2D-CNNを使用してavgpoolingで特徴量を抽出
-
mixupを工夫
- 各シーケンスを上記の 3 つのフェーズに分割し、同じフェーズ内でのみミックス
- 特に「moves to target」では、ターゲットへの到着が同期するようにフェーズの終了を合わせる
-
テストデータを使用してpseudo-labelを生成し、学習に使用
- LR(5e-5)で1stepだけfine-tuning
- orientation x gesture x initial behaviorsの組み合わせの102クラスを予測
-
後処理(ラベルの割り当て)
- 被験者ごとの全シーケンスに対し、ラベル重複禁止の制約を入れてjoint log-probabilityを最大化するラベル割当をまとめて最適化する
- 各シーケンスを独立にargmaxせず、ハンガリー法で全体最適なラベル割当を求めます。
3rd Place Solution
- ハンガリー法で全体最適なラベル割当を求めます(2nd placeと同様?)
- クォータニオンの不連続性に対応するために、平滑化したり、クオータに符号反転拡張や対象ブロックを追加
- poolingにも使用される BCE を備えたgesture/transition mask headを追加しました。
- 信号のほとんどは遷移後に発生するため、
- 適当な画像サイズにリサイズしてmaxvit, convnext-v2, EfficientNetB5などで予測
- augmentatioon
- world座標系の Z 軸を中心にクォータニオンをランダムな角度 (-60 度から 60 度) で回転させる。
(被験者が向いているさまざまな方向に対する堅牢性を高めるため) - 加速度計と四元数データの両方を、ローカル座標系の y 軸を中心に小さなランダム角度 (-7 度から 7 度) で回転させる。
(デバイスの装着方法のわずかな変化に対する堅牢性を高めます)
- world座標系の Z 軸を中心にクォータニオンをランダムな角度 (-60 度から 60 度) で回転させる。
4th place solution
- gesture, orientation, initial stateの 18 x 4 x 2のターゲットを設定し、それぞれが1回以上出現しないことを利用
- augmentation
- 同じtargetを持つレコードのtransisionとgesture部分をmixupする
5th place solution
(あまり理解できてない)
-
同一被験者の複数シーケンス情報をまとめて活用
- CNN / RNN / Transformer で時系列特徴を抽出し、さらに被験者次元の Transformerでシーケンス間関係を学習。
- test時は1シーケンス単位かつ順序ランダムでデータが来るため不安定になるので、シーケンス情報を逐次蓄積し、順序のばらつきに対応した。
6th place solution
- 後処理は行ってない
- ジェスチャーが行われている時間区間を U-Net で推定し、その情報を追加特徴としてモデルに与えた
- gesture segmentとnon-gesture segmentそれぞれでavgpoolingを実施
- デバイスを装着していないため被験者を検出モデルを使用し、データを変換
7th place solution
- 時系列データを画像に変換し、EfficientNet または ConvNeXt を使用して2D-CNNで分類
- augmentation
- time warping: 時間軸を非線形に伸び縮みさせる
- magnitude warping: 信号の大きさ(振幅)を時間とともに滑らかに変化させる
8th place solution
- 特になし(?)
9th place solution
- 正規化はせずに、BatchNormを使用
- 各modelについて、通常バージョンと逆バージョンの両方をトレーニング
- 正規モデル: 51 個のターゲットのうち 50 個が 0、1 個が 1 (標準分類)
- 逆モデル: 51 個のターゲットのうち 50 個が 1 個、1 個が 0 個 (逆分類)
10th place solution
- StratifiedGroupKFoldでseedは3つ分試す
- augmetaton
- time stratchによって不連続な点が出ないように色々と変換を工夫
(クオータにオンに不連続な点が生まれないようにしたり、開始・終了座標が変化しないようにaccを調整)
- time stratchによって不連続な点が出ないように色々と変換を工夫
- Mixupを他段階で行う
Mixup(Mixup(Mixup(x)))
11th place solution
- optimizer: AdamW、MuonWithAuxAdam
12th place solution
- 投稿なし
13th place solution
- 双方向のMamba blockを使用して、各センサー モダリティの長期的な時間的依存関係を学習
- IMU-onlyデータでは、SE-Transformer blockに基づくモデルを使用
- Hard Margin Lossを導入
- 区別が難しいサンプル (「まつげ」と「眉毛」など) の決定境界を押し上げるため
- Hard Mining
- トレーニングの第二段階では、分類困難なサンプルのサンプリングレートを上げた
- CVスコアを最大化するようにhill climbアンサンブルを実施
14th place solution
- Wavenetなども利用
15th place solution
-
1Dのアプローチに加えて、2パターンの2D-CNNを使用
- 生の波形を使用
- imuはplotしたものを画像として使用
MEMO
学び
- 違和感のあるデータがある場合は深掘りし、原因を特定することが重要
- データを除去するべきか、補正するべきか考える
- testデータも同様の傾向があるか推測する
- train dataの分布、test dataの分布を把握する
- 今回はtrain dataのラベルの分布がやたらキレイな点に着目するべきだった
- センサーデータは時系列ではなく、画像として解けないかも検討するのが良い
- EMAは基本的に使用した方がいいのかもしれない
Tipsまとめ
- 各FOLDで3runのうち、最も結果の良かった結果を採用する
- 推論時のシーケンスを少し伸ばすことで、モデルごとの相関を下げ、アンサンブルの効果が出やすくなるらしい
- ニューラルネットでquaternionを扱うときは6D表現を使うと良い(不連続性を避けられるため)
- testデータを使用して、pseudo-labelを生成しfine-tuningに使用する (LRを小さくして1stepだけ)
関連書籍
- Kaggleで勝つデータ分析の技術
- Kaggleに挑む深層学習プログラミングの極意 (KS情報科学専門書)
- 実践Data Scienceシリーズ PythonではじめるKaggleスタートブック (KS情報科学専門書)
以上
Discussion