🐕
telemanom(NASAの時系列データセット)を使う
2022年時点において、時系列データの異常検知について調べてるとたびたび目にするtelemanomについて、データセットとして使う際に調べたメモ。
基本的にはREADMEをちゃんと読もう。
どんなデータか
NASAの宇宙機のテレメトリデータ
- Soil Moisture Active Passive satellite (SMAP)
- Curiosity Rover on Mars (MSL)
ファイルフォーマット
npy(numpyのバイナリファイル)
匿名化されている
値は(-1,1)の範囲に正規化され、匿名化(anonymize)されている。
82個(SMAP/55, MSL/27)のデータがあるが、どんなセンサーのデータかも匿名化されている。ただしファイル名の先頭の文字でどの系か(電源系ならPowerのP)は判断できる。
ライセンス
Apache 2.0 license
入手
データの諸元(異常値の位置とか)を知るためにはlabeled_anomalies.csv
を入手する。
curl -O https://github.com/khundman/telemanom/labeled_anomalies.csv
データ本体はzipを入手する。
curl -O https://s3-us-west-2.amazonaws.com/telemanom/data.zip && unzip data.zip && rm data.zip
中身を確認
labeled_anomalies.csv
df = pd.read_csv('labeled_anomalies.csv')
それぞれのデータの異常値の位置(anomaly_sequences)や異常値の性質(class)がわかる。
A-1の異常値の位置を確認
df[df['chan_id']=='A-1']['anomaly_sequences']
15 [[4690, 4774]]
data
dataディレクトリの下はtestとtrainで分けられている。
data/
├── 2018-05-19_15.00.10
├── test
│ ├── A-1.npy
│ ├── A-2.npy
│ ├── A-3.npy
│ ...
└── train
├── A-1.npy
├── A-2.npy
├── A-3.npy
...
A-1を確認
import numpy as np
a1 = np.load('data/test/A-1.npy')
print(a1.shape)
(8640, 25)
ただし8640ステップの25次元データというわけではなく
The actual telemetry values should be along the first dimension
とのことなので、センサーの値は以下のように抜き出す。
values = a1[:,0]
グラフにしてみる。
import matplotlib.pyplot as plt
start = 0
end = values.shape[0]
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
x = np.linspace(start, end, end - start)
ax.plot(x,a1[start:end, 0])
plt.show()
異常値の範囲([4690, 4774])を拡大してみる。
まとめ
異常値がラベリングされている時系列データセット助かる。
Discussion