ADTK (異常検知ツールキット) 0.6 : Examples : Transformer (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 06/22/2021 (0.6.2)
* 本ページは、ADTK の以下のページの Transformer セクションを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
スケジュールは弊社 公式 Web サイト でご確認頂けます。
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- ウェビナー運用には弊社製品「ClassCat® Webinar」を利用しています。
人工知能研究開発支援 | 人工知能研修サービス | テレワーク & オンライン授業を支援 |
PoC(概念実証)を失敗させないための支援 (本支援はセミナーに参加しアンケートに回答した方を対象としています。) |
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ ; Facebook |
ADTK (異常検知ツールキット) 0.6 : Examples : Transformer
概要
- RollingAggregate – スライディング・ウィンドウを時系列に沿って roll して選択された演算を使用して aggregate します。一般的な例は移動平均 (= moving average)、rolling 標準偏差, etc. を含みます。例えば、時系列に沿って妥当な値の rolling カウントを追跡します、これは欠落する値が頻繁に発生するとき alarm を上げるのに役立ちます。
- DoubleRollingAggregate – 時系列に沿って 2 つのスライディング・ウィンドウを並べて roll して、選択された演算を使用して aggregate し、そして 2 つのウィンドウ間の aggregated metrics の差異を追跡します。これは時系列の統計的動作の変化を追跡するのに役立つかもしれません。
- ClassicSeasonalDecomposition – 系列をトレンド・パート (オプション), seasonal パートと残差パートに分解します。残差パートは seasonal パータンからの異常偏差を識別する役に立つかもしれません。
- Retrospect – retrospective 値を持つデータフレームを返します、i.e. 時間 t における行は (t-k) における値を含みます、ここで k はユーザにより指定されます。この transformer はラグ効果 (= lagging effect) が考慮されるべきケースのために有用であるかもしれません。
- RegressionResidual – 多変量系列への回帰を遂行して回帰残差を返します。これは系列の間の通常の関係の異常な violation を識別するのに役立つかもしれません。
- PcaProjection – 多変量系列を最初の k 主成分を持つ表現に変換します。
- PcaReconstruction – 多変量系列をその最初の k 主成分により結ばれた (spanned) 超平面に射影します。
- PcaReconstructionError – 多変量系列をその最初の k 主成分により結ばれた (spanned) 超平面に射影して、データポイントと最初の k 主成分の低ランク部分空間の間の距離を示すエラーを返します。
- CustomizedTransformer – カスタマイズされた detector のように、ユーザは関数を CustomizedTransformer1D or CustomizedTransformerHD を伴うカスタマイズされた transformer に変換しても良いです、その結果それは Pipe オブジェクトにより利用できます。
RollingAggregate
RollingAggregate はスライディング・ウィンドウを時系列に沿って roll して選択された演算を使用して aggregate します。一般的な例は移動平均 (= moving average)、rolling 標準偏差, etc. を含みます。
次の例では、時系列に沿って妥当な値の rolling カウントを追跡します、これは欠落する値が頻繁に発生するとき alarm を上げるのに役立ちます。
s = pd.read_csv('./data/pressure.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
plot(s, ts_linewidth=1, ts_markersize=4);
from adtk.transformer import RollingAggregate
s_transformed = RollingAggregate(agg='count', window=5).transform(s)
plot(s_transformed.rename("Rolling count of valid values"), ts_linewidth=1, ts_markersize=4);
DoubleRollingAggregate
DoubleRollingAggregate は時系列に沿って 2 つのスライディング・ウィンドウを並べて roll して、選択された演算を使用して aggregate し、そして 2 つのウィンドウ間の aggregated metrics の差異を追跡します。これは時系列の統計的動作の変化を追跡するのに役立つかもしれません。
次の例では、系列値の統計的分布の変化を追跡します。
s = pd.read_csv('./data/seismic.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
from adtk.transformer import DoubleRollingAggregate
s_transformed = DoubleRollingAggregate(
agg="quantile",
agg_params={"q": [0.1, 0.5, 0.9]},
window=50,
diff="l2").transform(s).rename("Diff rolling quantiles (mm)")
plot(pd.concat([s, s_transformed], axis=1));
次の例では、値レベルのシフトを追跡します。
s = pd.read_csv('./data/cpu.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
from adtk.transformer import DoubleRollingAggregate
s_transformed = DoubleRollingAggregate(
agg="median",
window=5,
diff="diff").transform(s).rename("Diff rolling median (mm)")
plot(pd.concat([s, s_transformed], axis=1));
次の例では、ウィンドウ・パラメータを調整することにより価格の異常変化を追跡します。
s = pd.read_csv('./data/price_short.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
from adtk.transformer import DoubleRollingAggregate
s_transformed = DoubleRollingAggregate(
agg="mean",
window=(3,1), #The tuple specifies the left window to be 3, and right window to be 1
diff="l1").transform(s).rename("Diff rolling mean with different window size")
plot(pd.concat([s, s_transformed], axis=1), ts_linewidth=1, ts_markersize=3);
ClassicSeasonalDecomposition
ClassicSeasonalDecomposition は系列をトレンド・パート (オプション), seasonal パートと残差パートに分解します。残差パートは seasonal パータンからの異常偏差を識別する役に立つかもしれません。
次の例では、系列に沿って通常の交通パターンから偏差を計算します、これは通常ではない交通量を識別する役に立つかもしれません。
s = pd.read_csv('./data/seasonal.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
from adtk.transformer import ClassicSeasonalDecomposition
s_transformed = ClassicSeasonalDecomposition().fit_transform(s).rename("Seasonal decomposition residual")
plot(pd.concat([s, s_transformed], axis=1), ts_markersize=1);
トレンドの抽出なしの ClassicSeasonalDecomposition は長期トレンドにノイズに加えて seasonal パターンが混在してるようなケースを処理できないでしょう。そのようなケースでは、オプションの trend が有効にされるべきです。
次の例では、ClassicSeasonalDecomposition は trend オプションが有効にされずに合成系列から残差系列と長期トレンドを分解することに失敗しています。
s = pd.read_csv('./data/seasonal+trend.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
s_transformed = ClassicSeasonalDecomposition(freq=7).fit_transform(s).rename("Seasonal decomposition residual and trend")
plot(pd.concat([s, s_transformed], axis=1), ts_linewidth=1, ts_markersize=4);
モデルの trend オプションを有効にして上の同じ例に再適用します、そこでは残差はトレンドから分離されます。
s_transformed = ClassicSeasonalDecomposition(freq=7, trend=True).fit_transform(s).rename("Seasonal decomposition residual")
plot(pd.concat([s, s_transformed], axis=1), ts_linewidth=1, ts_markersize=4);
Retrospect
Retrospect は retrospective 値を持つデータフレームを返します、i.e. 時間 t における行は (t-k) における値を含みます、ここで k はユーザにより指定されます。この transformer はラグ効果 (= lagging effect) が考慮されるべきケースのために有用であるかもしれません。
次の例では、合成系列のために retrospective データフレームを作成します。
s = pd.read_csv('./data/sin.csv', index_col="Time", parse_dates=True, squeeze=True)
s = validate_series(s)
from adtk.transformer import Retrospect
df = Retrospect(n_steps=4, step_size=20, till=50).transform(s)
plot(pd.concat([s, df], axis=1), curve_group="all");
RegressionResidual
RegressionResidual は多変量系列への回帰を遂行して回帰残差を返します。これは系列の間の通常の関係の異常な violation を識別するのに役立つかもしれません。
次の例では、発電機スピードとパワーの間の通常の相関性から系列の偏差を追跡します。
df = pd.read_csv('./data/generator.csv', index_col="Time", parse_dates=True)
df = validate_series(df)
from adtk.transformer import RegressionResidual
s = RegressionResidual(regressor=LinearRegression(), target="Speed (kRPM)").fit_transform(df).rename("Regression residual (kRPM)")
plot(pd.concat([df, s], axis=1), ts_linewidth=1, ts_markersize=3, curve_group=[("Speed (kRPM)", "Power (kW)"), "Regression residual (kRPM)"]);
PcaProjection
PcaProjection は多変量系列を最初の k 主成分を持つ表現に変換します。
次の例では、前の例で使用された 2-次元系列をその最初の主係数を保持するだけにより 1-次元に変換します。
from adtk.transformer import PcaProjection
s = PcaProjection(k=1).fit_transform(df)
plot(pd.concat([df, s], axis=1), ts_linewidth=1, ts_markersize=3, curve_group=[("Speed (kRPM)", "Power (kW)"), "pc0"]);
PcaReconstruction
PcaReconstruction は多変量系列をその最初の k 主成分により結ばれた (spanned) 超平面に射影します。
次の例では、前の例で使用された 2-次元系列をその最初の主成分のライン上に射影します。
from adtk.transformer import PcaReconstruction
df_transformed = PcaReconstruction(k=1).fit_transform(df).rename(columns={"Speed (kRPM)": "Speed reconstruction (kRPM)", "Power (kW)": "Power reconstruction (kW)"})
plot(pd.concat([df, df_transformed], axis=1), ts_linewidth=1, ts_markersize=3, curve_group=[("Speed (kRPM)", "Power (kW)"), ("Speed reconstruction (kRPM)", "Power reconstruction (kW)")]);
PcaReconstructionError
PcaReconstructionError は多変量系列をその最初の k 主成分により結ばれた (spanned) 超平面に射影して、データポイントと最初の k 主成分の低ランク部分空間の間の距離を示すエラーを返します。
次の例では、前の例で使用された 2-次元系列をその最初の主成分のライン上に射影します。
from adtk.transformer import PcaReconstructionError
s = PcaReconstructionError(k=1).fit_transform(df).rename("PCA Reconstruction Error")
plot(pd.concat([df, s], axis=1), ts_linewidth=1, ts_markersize=3, curve_group=[("Speed (kRPM)", "Power (kW)"), "PCA Reconstruction Error"]);
CustomizedTransformer
カスタマイズされた detector のように、ユーザは関数を CustomizedTransformer1D or CustomizedTransformerHD を伴うカスタマイズされた transformer に変換しても良いです、その結果それは Pipe オブジェクトにより利用できます。
次の例では、発電速度 (in kRPM) で除算された発電電力 (in kW) の計算された系列を得ました。
df = pd.read_csv('./data/generator.csv', index_col="Time", parse_dates=True)
df = validate_series(df)
def myTransformationFunc(df):
return (df["Power (kW)"] / df["Speed (kRPM)"]).rename("Power/Speed (kW/kRPM)")
pd.concat([df, s], axis=1)
Speed (kRPM) Power (kW) PCA Reconstruction Error Time 2017-05-02 17:08:37 6.066579 10.308257 0.097240 2017-05-02 18:08:37 6.035764 9.186763 0.006847 2017-05-02 19:08:37 5.922730 10.128382 0.168298 2017-05-02 20:08:37 5.999581 10.290300 0.139034 2017-05-02 21:08:37 6.031067 8.910037 0.000547 ... ... ... ... 2017-05-19 04:08:37 6.040213 9.531571 0.024986 2017-05-19 05:08:37 5.948470 9.959600 0.119861 2017-05-19 06:08:37 5.932115 10.144819 0.163950 2017-05-19 07:08:37 5.986675 8.983310 0.006974 2017-05-19 08:08:37 5.991435 10.305261 0.147651 400 rows × 3 columns
from adtk.transformer import CustomizedTransformerHD
customized_transformer = CustomizedTransformerHD(transform_func=myTransformationFunc)
s = customized_transformer.transform(df)
plot(pd.concat([df, s], axis=1), ts_linewidth=1, curve_group=[("Speed (kRPM)", "Power (kW)"), "Power/Speed (kW/kRPM)"]);
以上