BigQuery MLを使って教師なしの時系列異常検出をやっていきたいと思います。
参考は公式のブログから⇒https://cloud.google.com/blog/ja/products/data-analytics/bigquery-ml-unsupervised-anomaly-detection
今回は時系列なのでARIMA_PLUS モデルを使っていきたいと思います。
データの準備
チュートリアルではGoogleが用意したBigqueyのデータセットを使う形ですが、自身で作成したデータセットで行うと理解が深められると思います。
今回は同様の異常検知サービスである Amazon Lookout for Metricsのサンプルデータを拝借します。
https://github.com/harunobukameda/Amazon-Lookout-for-Metrics/blob/main/ecommerce.zip
ダウンロードできたらbacktestフォルダのinput.csvを使います。
eコマースの閲覧数と収益のデータとなっており、カラムはこんな感じ
- platform
- marketplace
- timestamp
- views
- revenue
Bigqueyのデータセットとして取り込み
モデルを作成
Bigqueryで新規クエリを作成
CREATE OR REPLACE MODEL ecommerce_demo.ecommerce_arima_plus_model
OPTIONS(
MODEL_TYPE='ARIMA_PLUS',
TIME_SERIES_TIMESTAMP_COL='timestamp',
TIME_SERIES_DATA_COL='views',
TIME_SERIES_ID_COL='marketplace',
HOLIDAY_REGION='US'
) AS
SELECT
marketplace,
timestamp,
views
FROM
`<プロジェクトID>.<データセット名>.<テーブル名>`
WHERE
DATE(timestamp) BETWEEN DATE('2021-01-01') AND DATE('2021-07-31');
パラメータの解説
- OPTIONS
- MODEL_TYPE: ARIMA_PLUSを指定
- TIME_SERIES_TIMESTAMP_COL: トレーニングデータのタイムを指定しているカラム
- TIME_SERIES_DATA_COL: 予測する値のカラムを指定する
- TIME_SERIES_ID_COL: ディメンションにあたるカラムを指定する
- WHERE句で1月~7月までのデータを使ってトレーニングするように指定(残りの9月までのデータは実際の異常検知に使う)
このクエリを実行すると1~2分でモデルが出来上がります。
トレーニング データ内の異常を検出する
先程作成したモデルに対してML.DETECT_ANOMALIESを使用します。
0.8は異常か判断するための閾値です。
SELECT
*
FROM
ML.DETECT_ANOMALIES(MODEL `ecommerce_demo.ecommerce_arima_plus_model`,
STRUCT(0.8 AS anomaly_prob_threshold))
新しいデータ内の異常を検出する
WITH
new_data AS (
SELECT
marketplace,
timestamp,
views
FROM
`<プロジェクトID>.<データセット名>.<テーブル名>`
WHERE
DATE(timestamp) BETWEEN DATE('2021-08-01') AND DATE('2021-09-30')
)
SELECT
*
FROM
ML.DETECT_ANOMALIES(MODEL `ecommerce_demo.ecommerce_arima_plus_model`,
STRUCT(0.8 AS anomaly_prob_threshold),
(SELECT * FROM new_data))
今回は8、9月のデータが微妙だった(0が多かった)ため、結果はいまいちでしたがBigquey MLで異常検知を行うイメージは掴めたかと思います。
まとめ
テーブルデータに対してSQLクエリによって操作することで、モデルの学習から異常検知まで実行することができるところがメリットだと感じました。
また、結果をデーブルとして確認できる点もよかったです。