時系列モデルの予測値を制限する

このチュートリアルでは、制限を使用して、時系列モデルから返される予測結果を絞り込む方法について説明します。同じデータに対して、制限を使用する時系列モデルと、制限を使用しない時系列モデルの 2 つを作成します。これにより、モデルから返された結果を比較して、制限の指定によってどのような違いがあるのかを理解できます。

このチュートリアルでは、new_york.citibike_trips データを使用してモデルをトレーニングします。このデータセットには、ニューヨーク市でのシティバイクの利用状況に関する情報が含まれています。

このチュートリアルに進む前に、1 つの時系列予測を行う方法について理解しておく必要があります。このトピックの概要については、Google アナリティクス データからの 1 つの時系列を予測するのチュートリアルをご覧ください。

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。
  • 接続リソースを作成するには、次の権限が必要です。

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

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

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

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

目標

このチュートリアルでは、以下を使用します。

  • CREATE MODEL ステートメント: 時系列モデルを作成します。
  • ML.FORECAST 関数: 1 日の合計訪問数を予測します。

費用

このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。

  • BigQuery
  • BigQuery ML

BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。

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

始める前に

  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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. BigQuery API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. BigQuery API を有効にします。

    API を有効にする

データセットを作成する

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

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

    [BigQuery] ページに移動

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

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

    データセットを作成する。

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

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

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US(multiple regions in United States)] を選択します。

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

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

      データセットの作成ページ。

予測する時系列を可視化する

モデルを作成する前に、入力時系列がどのように表示されるかを確認しておきましょう。

次のクエリでは、FROM bigquery-public-data.new_york.citibike_trips 句により new_york データセット内の citibike_trips テーブルのデータを取得します。

SELECT ステートメントで EXTRACT 関数を使用し、starttime 列から日付情報を抽出します。さらに、COUNT(*) 句を使用して、1 日あたりのシティバイクの合計利用回数を取得します。

#standardSQL
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
GROUP BY date

クエリを実行する手順は次のとおりです。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    GROUP BY date
    
  3. [実行] をクリックします。クエリ結果は次のようになります。

    クエリ出力。

  4. Google Cloud コンソールを使用して時系列データをグラフ化します。[クエリ結果] ペインで、[グラフ] タブをクリックします。[グラフの構成] ペインの [グラフの種類] で、[] を選択します。

    Result_visualization。

時系列モデルを作成する

ニューヨーク市のシティバイクの利用データを使用して時系列モデルを作成します。

次の GoogleSQL クエリは、シティバイクの 1 日あたりの合計利用回数を予測するモデルを作成します。CREATE MODEL ステートメントで bqml_tutorial.nyc_citibike_arima_model というモデルを作成してトレーニングします。

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.nyc_citibike_arima_model
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips'
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
GROUP BY date

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 句で ARIMA ベースの時系列モデルを作成しています。デフォルトは auto_arima=TRUE であるため、auto.ARIMA アルゴリズムによって ARIMA_PLUS モデルのハイパーパラメータが自動的にチューニングされます。アルゴリズムが多数の候補モデルを学習し、Akaike information criterion(AIC)が最も低い最適なモデルを選択します。また、data_frequency='AUTO_FREQUENCY' がデフォルトのため、トレーニング プロセスでは入力時系列のデータ頻度が自動的に推定されます。最後に、CREATE MODEL ステートメントではデフォルトで decompose_time_series=TRUE を使用するため、時系列の履歴部分と予測部分の両方がモデルに保存されます。この情報から、季節などの別々の時系列コンポーネントを取得して時系列を予測する方法について理解を深めることができます。

CREATE MODEL クエリを実行してモデルを作成し、トレーニングします。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips'
      ) AS
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
    WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date
    
  3. [実行] をクリックします。

    クエリが完了するまでに約 17 秒かかります。完了後、モデル(nyc_citibike_arima_model)が [エクスプローラ] ペインに表示されます。このクエリでは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

時系列を予測して結果を可視化する

時系列を予測する方法を説明するために、ML.FORECAST 関数を使用して、季節性やトレンドなどのすべての副時系列のコンポーネントを可視化します。

その手順は次のとおりです。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
      SELECT
      forecast_timestamp AS forecast_timestamp,
      history_value AS history_value,
      forecast_value AS forecast_value
      FROM ( (
         SELECT
            DATE(forecast_timestamp) AS forecast_timestamp,
            NULL AS history_value,
            forecast_value AS forecast_value
         FROM
            ML.FORECAST(MODEL bqml_tutorial.`nyc_citibike_arima_model`,
            STRUCT(365 AS horizon,
               0.9 AS confidence_level)) )
      UNION ALL (
         SELECT
            DATE(date_name) AS forecast_timestamp,
            num_trips AS history_value,
            NULL AS forecast_value
         FROM (
            SELECT
            EXTRACT(DATE
            FROM
               starttime) AS date_name,
            COUNT(*) AS num_trips
            FROM
            `bigquery-public-data`.new_york.citibike_trips
            WHERE
            starttime > '2014-07-11'
            AND starttime < '2015-02-11'
            GROUP BY
            date_name ) ))
      ORDER BY
      forecast_timestamp
    
  3. [実行] をクリックします。クエリ結果は次のようになります。

    BQUI_chart。

  4. Google Cloud コンソールを使用して時系列データをグラフ化します。[クエリ結果] ペインで、[グラフ] タブをクリックします。

    Result_visualization。

グラフが示すシティバイクの 1 日あたりの合計利用回数の予測値は負の値であり、役に立ちません。制限のあるモデルを使用すると、予測データが改善されます。

制限のある時系列モデルを作成する

ニューヨーク市のシティバイクの利用データを使用して、制限のある時系列モデルを作成します。

次の GoogleSQL クエリは、シティバイクの 1 日あたりの合計利用回数を予測するモデルを作成します。CREATE MODEL ステートメントで bqml_tutorial.nyc_citibike_arima_model_with_limits というモデルを作成してトレーニングします。このモデルと先ほど作成したモデルの唯一の違いは、forecast_limit_lower_bound=0 オプションが追加されていることです。このオプションを使用すると、モデルは 0 より大きい値のみを予測するようになります。

#standardSQL
CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_with_limits`
OPTIONS
  (model_type = 'ARIMA_PLUS',
   time_series_timestamp_col = 'date',
   time_series_data_col = 'num_trips',
   forecast_limit_lower_bound = 0
  ) AS
SELECT
   EXTRACT(DATE from starttime) AS date,
   COUNT(*) AS num_trips
FROM
  `bigquery-public-data`.new_york.citibike_trips
WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
GROUP BY date

CREATE MODEL クエリを実行してモデルを作成し、トレーニングします。

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_with_limits`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
       time_series_timestamp_col = 'date',
       time_series_data_col = 'num_trips',
       forecast_limit_lower_bound = 0
      ) AS
    SELECT
       EXTRACT(DATE from starttime) AS date,
       COUNT(*) AS num_trips
    FROM
      `bigquery-public-data`.new_york.citibike_trips
     WHERE starttime > '2014-07-11' AND starttime < '2015-02-11'
    GROUP BY date
    
  3. [実行] をクリックします。

    クエリが完了するまでに約 17 秒かかります。完了後、モデル(nyc_citibike_arima_model_with_limits)が [エクスプローラ] ペインに表示されます。このクエリでは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果はありません。

制限のあるモデルを使用して時系列を予測する

  1. Google Cloud コンソールで、[クエリを新規作成] ボタンをクリックします。

  2. クエリエディタに次の GoogleSQL クエリを入力します。

    #standardSQL
      SELECT
      forecast_timestamp AS forecast_timestamp,
      history_value AS history_value,
      forecast_value AS forecast_value
      FROM ( (
         SELECT
            DATE(forecast_timestamp) AS forecast_timestamp,
            NULL AS history_value,
            forecast_value AS forecast_value
         FROM
            ML.FORECAST(MODEL `bqml_tutorial.nyc_citibike_arima_model_with_limits`,
            STRUCT(365 AS horizon,
               0.9 AS confidence_level)) )
      UNION ALL (
         SELECT
            DATE(date_name) AS forecast_timestamp,
            num_trips AS history_value,
            NULL AS forecast_value
         FROM (
            SELECT
            EXTRACT(DATE
            FROM
               starttime) AS date_name,
            COUNT(*) AS num_trips
            FROM
            `bigquery-public-data`.new_york.citibike_trips
            WHERE
            starttime > '2014-07-11'
            AND starttime < '2015-02-11'
            GROUP BY
            date_name ) ))
      ORDER BY
      forecast_timestamp
    
  3. [実行] をクリックします。

    BQUI_chart。

  4. Google Cloud コンソールを使用して時系列データをグラフ化します。[クエリ結果] ペインで、[グラフ] タブをクリックします。

    Result_visualization。

ARIMA PLUS モデルによって、シティバイクの 1 日あたりの合計利用回数が減少していることが検出されています。今後の予測値はこの傾向に従い、遠い未来の予測値は比較的小さくなります。グラフが示すシティバイクの 1 日あたりの合計利用回数の予測値は正の数であり、役に立ちます。制限のあるモデルにより、シティバイクの 1 日あたりの合計利用回数が減少していることが検出されていますが、それでも意味のある予測値が得られます。

このチュートリアルで示すように forecast_limit_lower_bound オプションと forecast_limit_upper_bound オプションを使用すると、同様のシナリオ(株価や将来の売上額を予測する場合など)で意味のある予測値を取得できます。

データセットの削除

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. ナビゲーションで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。

  4. [データセットの削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして確定します。

プロジェクトの削除

プロジェクトを削除するには:

  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.

次のステップ