Fitbitの心拍数データで異常検知 〜自己回帰モデルによるアプローチ〜
概要
前回の記事に引き続き「入門 機械学習による異常検知―Rによる実践ガイド」を参考に、自分のFitbitの心拍数データを使って7章の時系列データの異常検知をやってみました。前回は特異スペクトル変換法を用いましたが、今回は自己回帰モデルを使用してやってみます。似たような記事は他にも色々あるので少し参考にさせていただきました*1。簡単ではありますが自分なりにまとめてみます。
使用データについて
今までの記事と同様に、Fitbitの睡眠時心拍数データを使用しています。
詳細は以下を参照してください。
自己回帰モデルとは
「現在の観測値が、過去の複数の観測値(例えばr個)の一次結合に従っている」と考えることを自己回帰モデルと言います。パラメータrのことを次数と言います。次数はAIC(赤池情報量基準)という、モデル選択基準を使用します。詳細は以下で述べます。
計算イメージ
- 下図のように、各時刻の観測値からデータ集合Dを作り、線形回帰と同様のアプローチで未知のパラメータを算出します。詳細な導出過程は書籍や上で紹介した記事を参考にしていただければと思います。
- 長さTの時系列データからは、t = r + 1からTまでの、合計T - r個の観測値に対する予測式を作ることができます。
- 多変量の場合もパラメータが行列、観測値がベクトルになりますが、基本的な考え方は同じです。
次数rの決定
- モデルの複雑さは次数rで決まります。クロスバリデーションなどの手法でrを決めることができないので(時系列データだから)、モデル選択基準としてAIC(赤池情報量基準)を用います。考え方や詳細は他の書籍*2に譲りますが以下のようになります。
AIC(r) = -2 × (モデルの最大対数尤度) + 2 × (モデルのパラメータ数)
- このAICが最小になるrを選びます。
異常度の定義
- 算出したモデルから得られた予測値が、実測値と乖離していた時に異常があったという考え方に基づいて、異常度を以下のように定義します。
- 下図のように、予測値に対して実測値が乖離している場合は、異常度が高くなります。
結果
変化度の計算結果を以下に示します。綺麗に異常部位が検出されました。
ただ、実測値と予測値を比較してわかるように、あまりにもフィットしているので(過学習なのかな?)、少し心配です…。どこかミスっているのかな?
AICにより選択された次数r = 7だったので、過去7時点のデータを使用して、現在の値を予測することができます。
このような単純なデータであれば簡単な計算だけで、リアルタイム性も担保しながら異常度求めることができるので、個人的には結構いいように思います(私見)。
さいごに
今回のエントリでは、Fitbitの心拍数データに対して、自己回帰モデルによるアプローチで変化点を検出しました。この手法はわかりやすくていいですね。次は状態空間モデルによる異常検知をやってみようと思います。
ただ、少しワンパターンな気がしてきたので、次回は個人的に興味がある「因果探索」や「スパース推定」のお話をブログに書こうと思います。
※ 何か間違いがございましたらご指摘ください。
mikutaifuku