LoginSignup
0
0

More than 1 year has passed since last update.

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のデータセットとして取り込み

Bigqueyでデータセットを作成します。
image.png

テーブルにinput.csvをインポートします
image.png

こんな感じで取り込めました
image.png

モデルを作成

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))

image.png

新しいデータ内の異常を検出する

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))

image.png

今回は8、9月のデータが微妙だった(0が多かった)ため、結果はいまいちでしたがBigquey MLで異常検知を行うイメージは掴めたかと思います。

まとめ

テーブルデータに対してSQLクエリによって操作することで、モデルの学習から異常検知まで実行することができるところがメリットだと感じました。
また、結果をデーブルとして確認できる点もよかったです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0