【時系列大好き】時系列クラスタリング
こんにちは!株式会社Rosso AI部です!
時系列データって面白いですよね!目に見えないのに必ず同じ方向に進んでいて、重ねていくと規則性が隠れていたり、んん~ディフィカルトゥ(翻訳:difficult)
ということで、実務でもよく出てくる時系列データへのアプローチを綴っていこうと思います。
📈0.モチベ
🖋本記事について
まず時系列データ(クレンジング済み)を目の前にしたときに「何か規則性がないかな~」と思うのが人の心かと思います。そんな心の欲求を満たしてくれる手法を今回は紹介したいと思います。
なお、本記事は実装ベースの手法としての紹介記事である為、理論の詳細を知りたい方は論文やソースコードを追っていただければと思います。
📈1.結果のイメージ
早速ですが、結果のイメージを先に共有しておこうと思います(fig.1)。規則性を見つけたいので、時系列の時間方向でクラスタリングしました。
📈2.アルゴリズム
🖋実装
sticky-HDP-HMM(sticky-HierarchicalDirichletProcess-HiddenMarkovModel)と呼ばれる、確率ベースのアルゴリズムを実装してみました。
実装にあたっては、オープンソースライブラリ”bnpy”(BSD-3ライセンス)を利用しました。一部出力を改編して実装しています。
🖋アルゴリズム概要
マルコフ過程をベースに時系列を扱い、クラスタ=隠れ状態として捉えることで、データに対して隠れマルコフモデルをフィッティングさせるというコンセプトです。
アルゴリズムの強みとしては、所謂ノンパラメトリックなことです。クラスタ近傍に関する閾値などのパラメータをデータから最適化していきます。クラスタが確率密度分布に基づいていると仮定して、パラメータをディリクレ過程に基づいて推定する仕組みです。
📈3.対象データ
時系列データについては、サンプルデータとして次のデータを引用させていただきました。リンク自体は予測アルゴリズムのGitHubになっていますが、今回はデータセットのみ引用しました。(Apache2.0ライセンス)
このデータには異常値と呼ばれる値が含まれています。人手でラベル付けされて、その時間帯を着色してプロットしたのが下図(fig.2)になります。
📈4.結論
規則性が定量的に確認できたと思います。異常個所についても、大きなクラスタとして分類され、隠れたモチベである”データからの異常範囲を定義” についても達成できたと言えるでしょう。
それぞれの結論に至る考察は以下の「5.考察」に記載しました。
📈5.考察
結果についての確認ポイントと考察を以下に記載しました。確認の為に再度クラスタリング結果を可視化した図(fig.3)を掲載しておきます。こちらは「1.」で掲載したものと同じ図となります。
🖋ポイント1:規則性
わかりやすい代表的な時間帯として、はじめの0secから550secを確認していきます。確認しやすいように拡大した図(fig.4)を掲載しました。
主に確認するポイントとしては、
クラスタの規則性
クラスタの周期性
が存在すると考えられます。この観点で確認すると、以下のような現象が確認できます。
1回目の境目(開始~3回目の紫のcluster8エンドまで)
> 規則性として紫のcluster8が存在
> 周期性として周期が若干長め
2回目の境目(おおよそ280sec以降から440secまで)
> 規則性として紫のcluster8が無くなる
> 周期が短くなる
3回目の境界(おおよそ440secあたり(6回目の赤のcluster6エンド))
> 赤のcluster6が無くなる
> 周期性は大きな変化なし
🖋ポイント2:異常個所
異常とされている箇所についても同様に見ていきます。下図(fig.5)はラベル付けされた(fig1の背景色が付いた)時間帯の拡大図になります。
※開始50secほどは、異常個所の開始を確認しやすくするために追加したものでラベル時間帯の範囲外データ。
1回目の境目(cluster7エンドまで)
> ピーク値周辺で明らかに傾向が異なる
> 大きく2つのクラスタで表現されている(cluster5とcluster7)
以降
> 波形形状としては正常とされていた波形と近い形状
> ただし、全体的にsignalが負方向にオフセットされたような値
📈6.まとめ
いかがでしょうか。本記事のモチベ「規則性の発見」「異常の定量化」を達成できているかと思います。世の中的にはこういった機械学習はニューラルネットワークが主流になりつつありますが、本記事のような時間方向のクラスタリングに関しては、まだまだ確率ベースのアルゴリズムも強いので紹介させていただきました。
解析など、”データから発見する”というタスクには強いですが、”未来を予測する”という予測タスクに関しては、確率ベースでは課題が残るのが正直なところかと思います。
クラスタ=ラベルとして扱ってニューラルネットワークの分類タスクに活用すれば、解析としてだけではなく予測にも活用できるのではないだろうかと筆者は妄想してます。
📉APPENDIX:もう少し踏み込んで
「規則性を見つけたい」や「”異常”をデータから見つけたい」については達成できたかと思います。ここではもう少し踏み込んで、各クラスタをどのような分布で捉えたかを見ていこうと思います。(fig.6)
クラスタ(k1~k9)を表現した予測分布の平均・分散(●)と、クラスタに分類された生データのクラスタごとの平均・分散(▲)をプロットして差異を確認してみました。
差異は小さく、平均はほぼ同じ。分散も一番大きいところでもk2のおおよそ0.02くらい(標準偏差0.141)なので、クラスタの精度も良いのではないかと思います。ほかには、k3k6k1のような固まっているクラスタを確認することもできます。
このように分布の差異を見ることで、それをどう解釈するか、クラスタ数Kを増やすか減らすか等々の深い検討ができるようになるかと思います。