使用 ARIMA_PLUS 单变量模型预测单个时序

本教程介绍了如何使用ARIMA_PLUS单变量时序模型根据给定列的历史值来预测该列的未来值。

本教程将预测单个时序。系统会针对输入数据中的每个时间点计算一次预测值。

本教程使用来自公开的 bigquery-public-data.google_analytics_sample.ga_sessions 示例表中的数据。此表格包含 Google Merchandise Store 的电子商务数据(已进行模糊处理)。

创建数据集

创建 BigQuery 数据集以存储机器学习模型。

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery 页面

  2. 探索器窗格中,点击您的项目名称。

  3. 点击 查看操作 > 创建数据集

  4. 创建数据集 页面上,执行以下操作:

    • 数据集 ID 部分,输入 bqml_tutorial

    • 位置类型部分,选择多区域,然后选择 US (multiple regions in United States)(美国[美国的多个区域])。

    • 保持其余默认设置不变,然后点击创建数据集

bq

如需创建新数据集,请使用带有 --location 标志的 bq mk 命令。 如需查看完整的潜在参数列表,请参阅 bq mk --dataset 命令参考文档。

  1. 创建一个名为 bqml_tutorial 的数据集,并将数据位置设置为 US,说明为 BigQuery ML tutorial dataset

    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 DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import google.cloud.bigquery

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

直观呈现输入数据

在创建模型之前,您可以选择直观呈现输入时序数据,以了解分布情况。您可以使用 Looker 数据洞察执行此操作。

请按照以下步骤直观呈现时序数据:

SQL

在以下 GoogleSQL 查询中,SELECT 语句会将输入表中的 date 列解析为 TIMESTAMP 类型,并将其重命名为 parsed_date,并使用 SUM(...) 子句和 GROUP BY date 子句创建每日 totals.visits 值。

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;
    1. 查询完成后,依次点击探索数据 > 使用 Looker Studio 探索。Looker Studio 将在新标签页中打开。在该新标签页中完成以下步骤。

    2. 在 Looker Studio 中,依次点击插入 > 时序图表

    3. 图表窗格中,选择设置标签页。

    4. 指标部分,添加 total_visits 字段,并移除默认的记录数指标。生成的图表如下所示:

      Result_visualization

      从图表中,您可以看到输入时序具有每周的季节性模式。

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

import bigframes.pandas as bpd

# Start by loading the historical data from BigQuerythat you want to analyze and forecast.
# This clause indicates that you are querying the ga_sessions_* tables in the google_analytics_sample dataset.
# Read and visualize the time series you want to forecast.
df = bpd.read_gbq("bigquery-public-data.google_analytics_sample.ga_sessions_*")
parsed_date = bpd.to_datetime(df.date, format="%Y%m%d", utc=True)
parsed_date.name = "parsed_date"
visits = df["totals"].struct.field("visits")
visits.name = "total_visits"
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# parsed_date
# 2016-08-01 00:00:00+00:00    1711
# 2016-08-02 00:00:00+00:00    2140
# 2016-08-03 00:00:00+00:00    2890
# 2016-08-04 00:00:00+00:00    3161
# 2016-08-05 00:00:00+00:00    2702
# Name: total_visits, dtype: Int64

total_visits.plot.line()

结果类似于以下内容: Result_visualization

创建时序模型

创建一个时序模型来预测由 totals.visits 列表示的网站总访问量,并使用 Google Analytics 360 数据对其进行训练。

SQL

在以下查询中,OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一个基于 ARIMA 的时序模型。CREATE MODEL 语句的 auto_arima 选项默认为 TRUE,因此 auto.ARIMA 算法会自动调整模型中的超参数。该算法会拟合数十个候选模型,并选择具有最低 Akaike 信息准则 (AIC) 的最佳模型。CREATE MODEL 语句的 data_frequency 选项默认为 AUTO_FREQUENCY,因此训练过程会自动推断输入时序的数据频率。CREATE MODEL 语句的 decompose_time_series 选项默认为 TRUE,以便在您在下一步中评估模型时返回有关时序数据的信息。

请按照以下步骤创建模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    CREATE OR REPLACE MODEL `bqml_tutorial.ga_arima_model`
    OPTIONS
    (model_type = 'ARIMA_PLUS',
     time_series_timestamp_col = 'parsed_date',
     time_series_data_col = 'total_visits',
     auto_arima = TRUE,
     data_frequency = 'AUTO_FREQUENCY',
     decompose_time_series = TRUE
    ) AS
    SELECT
    PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
    SUM(totals.visits) AS total_visits
    FROM
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
    GROUP BY date;

    查询大约需要 4 秒才能完成,之后您就可以访问 ga_arima_model 模型了。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

from bigframes.ml import forecasting
import bigframes.pandas as bpd

# Create a time series model to forecast total site visits:
# The auto_arima option defaults to True, so the auto.ARIMA algorithm automatically
# tunes the hyperparameters in the model.
# The data_frequency option defaults to 'auto_frequency so the training
# process automatically infers the data frequency of the input time series.
# The decompose_time_series option defaults to True, so that information about
# the time series data is returned when you evaluate the model in the next step.
model = forecasting.ARIMAPlus()
model.auto_arima = True
model.data_frequency = "auto_frequency"
model.decompose_time_series = True

# Use the data loaded in the previous step to fit the model
training_data = total_visits.to_frame().reset_index(drop=False)

X = training_data[["parsed_date"]]
y = training_data[["total_visits"]]

model.fit(X, y)

评估候选模型

SQL

使用 ML.ARIMA_EVALUATE 函数评估时序模型。ML.ARIMA_EVALUATE 函数会显示自动超参数调整过程中评估的所有候选模型的评估指标。

请按照以下步骤评估模型:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
    *
    FROM
    ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`);

    结果应如下所示:

    ML.ARIMA_EVALUATE 输出。

BigQuery DataFrame

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

# Evaluate the time series models by using the summary() function. The summary()
# function shows you the evaluation metrics of all the candidate models evaluated
# during the process of automatic hyperparameter tuning.
summary = model.summary(
    show_all_candidate_models=True,
)
print(summary.peek())

# Expected output:
# row   non_seasonal_p	non_seasonal_d	non_seasonal_q	has_drift	log_likelihood	AIC	variance	seasonal_periods	has_holiday_effect	has_spikes_and_dips	has_step_changes	error_message
#  0	      0	              1	               3	      True	     -2464.255656	4938.511313	     42772.506055	        ['WEEKLY']	            False	        False	            True
#  1	      2	              1	               0	      False	     -2473.141651	4952.283303	     44942.416463	        ['WEEKLY']	            False	        False	            True
#  2	      1	              1	               0 	      False	     -2479.880885	4963.76177	     46642.953433	        ['WEEKLY']	            False	        False	            True
#  3	      0	              1	               1	      False	     -2470.632377	4945.264753	     44319.379307	        ['WEEKLY']	            False	        False	            True
#  4	      2	              1	               1	      True	     -2463.671247	4937.342493	     42633.299513	        ['WEEKLY']	            False	        False	            True

non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 输出列定义了训练流水线中的 ARIMA 模型。log_likelihoodAICvariance 输出列与 ARIMA 模型拟合过程相关。

auto.ARIMA 算法使用 KPSS 测试来确定 non_seasonal_d 的最佳值,在本例中为 1。当 non_seasonal_d1 时,auto.ARIMA 算法会并行训练 42 个不同的候选 ARIMA 模型。在此示例中,所有 42 个候选模型均有效,因此输出包含 42 行,每行对应一个候选 ARIMA 模型;如果某些模型无效,则会从输出中排除。这些候选模型将按照 AIC 升序返回。第一行中的模型具有最低的 AIC,它被视为最佳模型。最佳模型将保存为最终模型,并在您对模型调用 ML.FORECAST 等函数时使用

seasonal_periods 列包含有关时序数据中识别出的季节性模式的信息。它与 ARIMA 建模无关,因此在所有输出行中都具有相同的值。它会报告每周模式,该模式与您选择直观呈现输入数据时看到的结果一致。

仅当 decompose_time_series=TRUE 时,才会填充 has_holiday_effecthas_spikes_and_dipshas_step_changes 列。这些列还反映了输入时序数据的信息,与 ARIMA 建模无关。这些列在所有输出行中也具有相同的值。

error_message 列显示 auto.ARIMA 拟合过程中发生的任何错误。错误的一个可能原因是所选 non_seasonal_pnon_seasonal_dnon_seasonal_qhas_drift 列无法稳定时序。如需检索所有候选模型的错误消息,请在创建模型时将 show_all_candidate_models 选项设置为 TRUE

如需详细了解输出列,请参阅 ML.ARIMA_EVALUATE 函数

检查模型的系数

SQL

使用 ML.ARIMA_COEFFICIENTS 函数检查时序模型的系数。

请按照以下步骤检索模型的系数:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
    *
    FROM
    ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.ga_arima_model`);

ar_coefficients 输出列显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients 输出列显示了 ARIMA 模型的移动平均值 (MA) 部分的模型系数。这两个列都包含数组值,其长度分别等于 non_seasonal_pnon_seasonal_q。在 ML.ARIMA_EVALUATE 函数的输出中,您看到最佳模型的 non_seasonal_p 值为 2non_seasonal_q 值为 3。因此,在 ML.ARIMA_COEFFICIENTS 输出中,ar_coefficients 值是一个 2 个元素的数组,而 ma_coefficients 值是一个 3 个元素的数组。intercept_or_drift 值是 ARIMA 模型中的常量项。

如需详细了解输出列,请参阅 ML.ARIMA_COEFFICIENTS 函数

BigQuery DataFrame

使用 coef_ 函数检查时序模型的系数。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

coef = model.coef_
print(coef.peek())

# Expected output:
#       ar_coefficients   ma_coefficients   intercept_or_drift
#   0	 [0.40944762]	   [-0.81168198]	      0.0

ar_coefficients 输出列显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients 输出列显示了 ARIMA 模型的移动平均值 (MA) 部分的模型系数。这两个列都包含数组值,其长度分别等于 non_seasonal_pnon_seasonal_q

使用模型预测数据

SQL

使用 ML.FORECAST 函数预测未来的时序值。

在以下 GoogleSQL 查询中,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。

请按照以下步骤使用模型预测数据:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
    *
    FROM
    ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
              STRUCT(30 AS horizon, 0.8 AS confidence_level));

    结果应如下所示:

    ML.FORECAST 输出。

BigQuery DataFrame

使用 predict 函数预测未来的时序值。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

prediction = model.predict(horizon=30, confidence_level=0.8)

print(prediction.peek())
# Expected output:
#           forecast_timestamp	   forecast_value	standard_error	confidence_level	prediction_interval_lower_bound	    prediction_interval_upper_bound	    confidence_interval_lower_bound	    confidence_interval_upper_bound
# 11	2017-08-13 00:00:00+00:00	1845.439732	      328.060405	      0.8	                 1424.772257	                      2266.107208	                     1424.772257	                     2266.107208
# 29	2017-08-31 00:00:00+00:00	2615.993932	      431.286628	      0.8	                 2062.960849	                      3169.027015	                     2062.960849	                     3169.027015
# 7	    2017-08-09 00:00:00+00:00	2639.285993	      300.301186	      0.8	                 2254.213792	                      3024.358193	                     2254.213792	                     3024.358193
# 25	2017-08-27 00:00:00+00:00	1853.735689	      410.596551	      0.8	                 1327.233216	                      2380.238162	                     1327.233216	                     2380.238162
# 1	    2017-08-03 00:00:00+00:00	2621.33159	      241.093355	      0.8	                 2312.180802	                      2930.482379	                     2312.180802	                     2930.482379

输出行按 forecast_timestamp 列值的时间顺序排序。在时序预测中,由 prediction_interval_lower_boundprediction_interval_upper_bound 列值表示的预测区间与 forecast_value 列值一样重要。forecast_value 值是预测区间的中点。预测区间取决于 standard_errorconfidence_level 列值。

如需详细了解输出列,请参阅 ML.FORECAST 函数

解释预测结果

SQL

除了预测数据,您还可以使用 ML.EXPLAIN_FORECAST 函数获取可解释性指标。ML.EXPLAIN_FORECAST 函数会预测未来的时序值,还会返回该时序的所有单独的组件。

ML.FORECAST 函数类似,ML.EXPLAIN_FORECAST 函数中使用的 STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。

请按照以下步骤解释模型的结果:

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,粘贴以下查询,然后点击运行

    SELECT
    *
    FROM
    ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
     STRUCT(30 AS horizon, 0.8 AS confidence_level));

    结果应如下所示:

    前九个输出列包含预测数据和预测说明。 第 10 到 17 列输出预测数据和预测说明。 预测数据和预测说明的最后六个输出列。

    输出行按 time_series_timestamp 列值的时间顺序排序。

    如需详细了解输出列,请参阅 ML.EXPLAIN_FORECAST 函数

BigQuery DataFrame

除了预测数据,您还可以使用 predict_explain 函数获取可解释性指标。predict_explain 函数会预测未来的时序值,还会返回该时序的所有单独的组件。

predict 函数类似,predict_explain 函数中使用的 horizon=30, confidence_level=0.8 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。

在尝试此示例之前,请按照《BigQuery 快速入门:使用 BigQuery DataFrames》中的 BigQuery DataFrames 设置说明进行操作。如需了解详情,请参阅 BigQuery DataFrames 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为本地开发环境设置 ADC

ex_pred = model.predict_explain(horizon=30, confidence_level=0.8)

print(ex_pred.head(4))
# Expected output:
#       time_series_timestamp	  time_series_type	    time_series_data	time_series_adjusted_data	 standard_error	   confidence_level	   prediction_interval_lower_bound	   prediction_interval_upper_bound	  trend	   seasonal_period_yearly	  seasonal_period_quarterly	    seasonal_period_monthly	   seasonal_period_weekly	  seasonal_period_daily	    holiday_effect	   spikes_and_dips	   step_changes	   residual
# 0	  2016-08-01 00:00:00+00:00	      history	             1711.0	               505.716474	           206.939556	         <NA>	                    <NA>	                            <NA>	               0.0	           <NA>	                        <NA>	                     <NA>	                 169.611938	                  <NA>	                <NA>	            <NA>	       1205.283526	   336.104536
# 1	  2016-08-02 00:00:00+00:00	      history	             2140.0	               623.137701	           206.939556	         <NA>	                    <NA>	                            <NA>	            336.104428	       <NA>	                        <NA>	                     <NA>	                 287.033273	                  <NA>	                <NA>	            <NA>	       1205.283526	   311.578773
# 2	  2016-08-03 00:00:00+00:00	      history	             2890.0	               1008.655091	           206.939556	         <NA>	                    <NA>	                            <NA>	            563.514213	       <NA>	                        <NA>	                     <NA>	                 445.140878	                  <NA>	                <NA>	            <NA>	       1205.283526	   676.061383
# 3	  2016-08-04 00:00:00+00:00	      history	             3161.0	               1389.40959	           206.939556	         <NA>	                    <NA>	                            <NA>	            986.317236	       <NA>	                        <NA>	                     <NA>	                 403.092354	                  <NA>	                <NA>	            <NA>	       1205.283526	   566.306884
# 4	  2016-08-05 00:00:00+00:00	      history	             2702.0	               1394.395741	           206.939556	         <NA>	                    <NA>	                            <NA>	            1248.707386	       <NA>	                        <NA>	                     <NA>	                 145.688355	                  <NA>	                <NA>	            <NA>	       1205.283526	   102.320733
# 5	  2016-08-06 00:00:00+00:00	      history	             1663.0	               437.09243	           206.939556	         <NA>	                    <NA>	                            <NA>	            1188.59004	       <NA>	                        <NA>	                     <NA>	                 -751.49761	                  <NA>	                <NA>	            <NA>	       1205.283526	    20.624044

如果您想直观呈现结果,可以按照直观呈现输入数据部分中的说明使用 Looker Studio 来创建图表,并使用以下列作为指标:

  • time_series_data
  • prediction_interval_lower_bound
  • prediction_interval_upper_bound
  • trend
  • seasonal_period_weekly
  • step_changes