Pythonとsklearnを使用してtime#seriesの間に異常検出を実行しようとしています(ただし、他のパッケージの提案は大歓迎です!)。
10個の時系列のセットがあります。各時系列は、タイヤのトルク値(合計10タイヤ)から収集されたデータで構成されており、セットには同じ数のデータポイントが含まれていない場合があります(セットサイズが異なります)。各時系列データは、ほとんど、tire_id、タイムスタンプ、およびsig_value(信号またはセンサーからの値)です。1つの時系列のサンプルデータは次のようになります。
tire_id timestamp sig_value
tire_1 23:06.1 12.75
tire_1 23:07.5 0
tire_1 23:09.0 -10.5
今、私はそれらの10を持っています、そしてそれらの2は奇妙に振る舞います。これは異常検出の問題であることを理解していますが、オンラインで読んだほとんどの記事は、同じ時系列内の異常ポイントを検出しています(ある時点で、そのタイヤのトルク値が正常でない場合)。
どの2つのタイヤが異常な動作をしているのかを検出するために、クラスタリング手法、基本的にはk-meansクラスタリングを使用してみました(監視されていないため)。
k-meansクラスタリングにフィードするデータを準備するために、各時系列(各タイヤについて)について計算しました。
- 最大の振幅(差)を持つ隣接する極大と極小の上位3セット
- トルク値の平均
- トルク値の標準偏差
また、クラスターの数を2のみに設定したので、クラスター1または2のいずれかです。
したがって、(クラスターを割り当てた後の)最終結果は次のようになります。
amplitude local maxima local minima sig_value_std \
tire_0 558.50 437.75 -120.75 77.538645
tire_0 532.75 433.75 -99.00 77.538645
tire_0 526.25 438.00 -88.25 77.538645
tire_1 552.50 -116.50 436.00 71.125912
tire_1 542.75 439.25 -103.50 71.125912
sig_value_average cluster
tire_0 12.816990 0
tire_0 12.816990 0
tire_0 12.816990 0
tire_1 11.588038 1
tire_1 11.588038 0
今、私はこの結果をどうするかについて質問があります...したがって、最大の振幅が3つのローカル最大/最小の上位3ペアを選択したため、各タイヤには3行のデータがあります。クラスターに割り当てられ、場合によっては1つのタイヤでも異なるクラスターに割り当てられます。また、クラスタサイズは通常2より大きいだけです。
私の質問は:
- 個々のデータポイントだけでなく、「時系列のセット」に関する異常検出を行う方法は?
- 私のアプローチは合理的/論理的ですか?もしそうなら、私は自分の結果をクリーンアップして欲しいものを手に入れることができますか?そうでない場合、改善するにはどうすればよいですか?