多変量時系列予測モデルで異常検出を実行する

このチュートリアルでは、次のタスクを行う方法を説明します。

このチュートリアルでは、一般公開の epa_historical_air_quality データセットの以下のテーブルを使用します。このデータセットには、米国の複数の都市から毎日収集された PM 2.5、気温、風速の情報が含まれています。

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。

  • モデルを作成するには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 推論を実行するには、次の権限が必要です。

    • bigquery.models.getData
    • bigquery.jobs.create

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

費用

このドキュメントでは、課金対象である次の Google Cloudコンポーネントを使用します。

  • BigQuery: You incur costs for the data you process in BigQuery.

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新規の Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

詳細については、BigQuery の料金をご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery API.

    Enable the API

  8. データセットを作成する

    ML モデルを保存する BigQuery データセットを作成します。

    コンソール

    1. Google Cloud コンソールで、[BigQuery] ページに移動します。

      [BigQuery] ページに移動

    2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

    3. [アクションを表示] > [データセットを作成] をクリックします。

      [データセットを作成] のメニュー オプション。

    4. [データセットを作成] ページで、次の操作を行います。

      • [データセット ID] に「bqml_tutorial」と入力します。

      • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(米国の複数のリージョン)] を選択します。

      • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

    bq

    新しいデータセットを作成するには、--location フラグを指定した bq mk コマンドを使用します。使用可能なパラメータの一覧については、bq mk --dataset コマンドのリファレンスをご覧ください。

    1. データの場所が US に設定され、BigQuery ML tutorial dataset という説明の付いた、bqml_tutorial という名前のデータセットを作成します。

      bq --location=US mk -d \
       --description "BigQuery ML tutorial dataset." \
       bqml_tutorial

      このコマンドでは、--dataset フラグの代わりに -d ショートカットを使用しています。-d--dataset を省略した場合、このコマンドはデフォルトでデータセットを作成します。

    2. データセットが作成されたことを確認します。

      bq ls

    API

    定義済みのデータセット リソースを使用して datasets.insert メソッドを呼び出します。

    {
      "datasetReference": {
         "datasetId": "bqml_tutorial"
      }
    }

    BigQuery DataFrames

    このサンプルを試す前に、BigQuery DataFrames を使用した BigQuery クイックスタートの手順に沿って BigQuery DataFrames を設定してください。詳細については、BigQuery DataFrames のリファレンス ドキュメントをご覧ください。

    BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の ADC の設定をご覧ください。

    import google.cloud.bigquery
    
    bqclient = google.cloud.bigquery.Client()
    bqclient.create_dataset("bqml_tutorial", exists_ok=True)

    トレーニング データを準備する

    PM2.5、気温、風速のデータは別々のテーブルにあります。これらの一般公開テーブルのデータを結合して、トレーニング データの bqml_tutorial.seattle_air_quality_daily テーブルを作成します。bqml_tutorial.seattle_air_quality_daily には次の列があります。

    • date: 観測日
    • PM2.5: 各日の PM2.5 の平均値
    • wind_speed: 各日の平均風速
    • temperature: 各日の最高気温

    新しいテーブルには、2009 年 8 月 11 日から 2022 年 1 月 31 日までの日次データが含まれます。

    1. [BigQuery] ページに移動します。

      [BigQuery] に移動

    2. SQL エディタペインで、次の SQL ステートメントを実行します。

      CREATE TABLE `bqml_tutorial.seattle_air_quality_daily`
      AS
      WITH
        pm25_daily AS (
          SELECT
            avg(arithmetic_mean) AS pm25, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.pm25_nonfrm_daily_summary`
          WHERE
            city_name = 'Seattle'
            AND parameter_name = 'Acceptable PM2.5 AQI & Speciation Mass'
          GROUP BY date_local
        ),
        wind_speed_daily AS (
          SELECT
            avg(arithmetic_mean) AS wind_speed, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.wind_daily_summary`
          WHERE
            city_name = 'Seattle' AND parameter_name = 'Wind Speed - Resultant'
          GROUP BY date_local
        ),
        temperature_daily AS (
          SELECT
            avg(first_max_value) AS temperature, date_local AS date
          FROM
            `bigquery-public-data.epa_historical_air_quality.temperature_daily_summary`
          WHERE
            city_name = 'Seattle' AND parameter_name = 'Outdoor Temperature'
          GROUP BY date_local
        )
      SELECT
        pm25_daily.date AS date, pm25, wind_speed, temperature
      FROM pm25_daily
      JOIN wind_speed_daily USING (date)
      JOIN temperature_daily USING (date)

    モデルを作成する

    bqml_tutorial.seattle_air_quality_daily のデータをトレーニング データとして使用して、多変量時系列モデルを作成します。

    1. [BigQuery] ページに移動します。

      [BigQuery] に移動

    2. SQL エディタペインで、次の SQL ステートメントを実行します。

      CREATE OR REPLACE MODEL `bqml_tutorial.arimax_model`
        OPTIONS (
          model_type = 'ARIMA_PLUS_XREG',
          auto_arima=TRUE,
          time_series_data_col = 'temperature',
          time_series_timestamp_col = 'date'
          )
      AS
      SELECT
        *
      FROM
        `bqml_tutorial.seattle_air_quality_daily`
      WHERE
        date < "2023-02-01";

      クエリが完了するまでに数秒かかります。完了後、モデル arimax_model が [エクスプローラ] ペインの bqml_tutorial データセットに表示されます。

      クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

    履歴データで異常検出を実行する

    モデルのトレーニングに使用した過去のデータに対して異常検出を実行します。

    1. [BigQuery] ページに移動します。

      [BigQuery] に移動

    2. SQL エディタペインで、次の SQL ステートメントを実行します。

      SELECT
        *
      FROM
        ML.DETECT_ANOMALIES (
         MODEL `bqml_tutorial.arimax_model`,
         STRUCT(0.6 AS anomaly_prob_threshold)
        )
      ORDER BY
        date ASC;

      結果は次のようになります。

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      | date                    | temperature | is_anomaly | lower_bound        | upper_bound        | anomaly_probability |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-11 00:00:00 UTC | 70.1        | false      | 67.647370742988727 | 72.552629257011262 | 0                   |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-12 00:00:00 UTC | 73.4        | false      | 71.7035428351283   | 76.608801349150838 | 0.20478819992561115 |
      +--------------------------------------------------------------------------------------------------------------------+
      | 2009-08-13 00:00:00 UTC | 64.6        | true       | 67.740408724826068 | 72.6456672388486   | 0.945588334903206   |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+
      

    新しいデータで異常検出を実行する

    生成した新しいデータで異常検出を実行します。

    1. [BigQuery] ページに移動します。

      [BigQuery] に移動

    2. SQL エディタペインで、次の SQL ステートメントを実行します。

      SELECT
        *
      FROM
        ML.DETECT_ANOMALIES (
         MODEL `bqml_tutorial.arimax_model`,
         STRUCT(0.6 AS anomaly_prob_threshold),
         (
           SELECT
             *
           FROM
             UNNEST(
               [
                 STRUCT<date TIMESTAMP, pm25 FLOAT64, wind_speed FLOAT64, temperature FLOAT64>
                 ('2023-02-01 00:00:00 UTC', 8.8166665, 1.6525, 44.0),
                 ('2023-02-02 00:00:00 UTC', 11.8354165, 1.558333, 40.5),
                 ('2023-02-03 00:00:00 UTC', 10.1395835, 1.6895835, 46.5),
                 ('2023-02-04 00:00:00 UTC', 11.439583500000001, 2.0854165, 45.0),
                 ('2023-02-05 00:00:00 UTC', 9.7208335, 1.7083335, 46.0),
                 ('2023-02-06 00:00:00 UTC', 13.3020835, 2.23125, 43.5),
                 ('2023-02-07 00:00:00 UTC', 5.7229165, 2.377083, 47.5),
                 ('2023-02-08 00:00:00 UTC', 7.6291665, 2.24375, 44.5),
                 ('2023-02-09 00:00:00 UTC', 8.5208335, 2.2541665, 40.5),
                 ('2023-02-10 00:00:00 UTC', 9.9086955, 7.333335, 39.5)
               ]
             )
           )
         );

      結果は次のようになります。

      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+------------+------------+
      | date                    | temperature | is_anomaly | lower_bound        | upper_bound        | anomaly_probability | pm25       | wind_speed |
      +----------------------------------------------------------------------------------------------------------------------------------------------+
      | 2023-02-01 00:00:00 UTC | 44.0        | true       | 36.89918003713138  | 41.8044385511539   | 0.88975675709801583 | 8.8166665  | 1.6525     |
      +----------------------------------------------------------------------------------------------------------------------------------------------+
      | 2023-02-02 00:00:00 UTC | 40.5        | false      | 34.439946284051572 | 40.672021330796483 | 0.57358239699845348 | 11.8354165 | 1.558333   |
      +--------------------------------------------------------------------------------------------------------------------+-------------------------+
      | 2023-02-03 00:00:00 UTC | 46.5        | true       | 33.615139992931191 | 40.501364463964549 | 0.97902867696346974 | 10.1395835 | 1.6895835  |
      +-------------------------+-------------+------------+--------------------+--------------------+---------------------+-------------------------+
      

    クリーンアップ

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.