Python/Scikit-learnでk近傍法で時系列データの異常部位検出する方法について紹介します。
k近傍法で時系列データの異常検知
次のようなサンプル数Nの時系列データXが与えられているとします。
$$ X=(x_1, x_2, …, x_N) $$
ここで、k近傍法に適用するために、時系列データを適当な窓幅(WN)を指定し、窓内の点を並べて1つのベクトルにします。
最後にそのベクトルを集合にします。
にする必要があります。
$$ W=(W_1, W_2, …, W_N) $$
$$ W_1=(x_1, x_2,…, x_{WN})^T $$
$$ W_2=(x_2, x_3,…, x_{WN+1})^T $$
こうして作られたベクトルWをk近傍法で用います。
サンプルコード① Scikit-learnによる実装例
k近傍法とは、学習データをベクトル空間上にプロットし、未知データ(入力データ)と学習データの距離が近い順に任意のK個を取得し、多数決でデータが属するクラスを推定するです。
比較的シンプルなアルゴリズムですが、時系列データの異常検知にも活用できます。
今回は心電図データセット(http://www.cs.ucr.edu/~eamonn/discords/)を使っています。異常を含む区間で異常度が高くなりました。綺麗な周期データが予測される場合には有効ですが、周期データでも徐々に上昇していくような場合は良い結果が得られません。
関連ページ

【Scikit-learn超入門】使い方とサンプルコードを解説
Pythonライブラリ「Scikit-learn」で機械学習を行う方法を解説します。
コメント