根据 Google Analytics 数据进行单时序预测


在本教程中,您将学习如何使用 google_analytics_sample.ga_sessions 示例表创建一个时间序列模型,以进行单个时间序列预测。

ga_sessions 表包含由 Google Analytics 360 收集并发送到 BigQuery 的会话数据切片的相关信息。

目标

在本教程中,您将使用以下内容:

费用

本教程使用 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. 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  6. 新项目会自动启用 BigQuery。如需在现有项目中激活 BigQuery,请前往

    Enable the BigQuery API.

    Enable the API

第一步:创建数据集

创建 BigQuery 数据集以存储您的机器学习模型:

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery 页面

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

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

    创建数据集。

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

    • 数据集 ID 部分,输入 bqml_tutorial

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

      公共数据集存储在 US 多区域中。为简单起见,请将数据集存储在同一位置。

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

      创建数据集页面。

第二步(可选):直观呈现您要预测的时间序列

在创建模型之前,最好先查看输入时序的情况。

SQL

您可以使用 Looker 数据洞察执行此操作。

在以下 GoogleSQL 查询中,FROM bigquery-public-data.google_analytics_sample.ga_sessions_* 子句指示您正在查询 google_analytics_sample 数据集中的 ga_sessions_* 表。这些表是分区表

SELECT 语句中,查询将输入表中的 date 列解析为 TIMESTAMP 类型,并将其重命名为 parsed_date。该查询使用 SUM(...) 子句和 GROUP BY date 子句每天累积 totals.visits

#standardSQL
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. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    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
  3. 点击运行

    查询大约需要 7 秒才能完成。此查询运行后,输出类似于以下屏幕截图。在屏幕截图中,您可以看到此时序有 366 个数据点。点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。在该新标签页中完成以下步骤。

    查询输出

    图表面板中,选择时序图表 (Time series chart):

    Time_series_chart

    数据面板中的图表面板下方,转到指标部分。添加 total_visits 字段,然后移除默认指标记录计数 (Record Count)。如下图所示。

    Time_series_data_fields

    完成这些步骤后,系统将显示以下图表。该图表显示输入时序具有每周的季节性模式。

    Result_visualization

BigQuery DataFrame

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

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

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)
visits = df["totals"].struct.field("visits")
total_visits = visits.groupby(parsed_date).sum()

# Expected output: total_visits.head()
# 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: visits, dtype: Int64

total_visits.plot.line()

结果类似于以下内容: Result_visualization

第三步:创建时序模型

接下来,使用 Google Analytics 360 数据创建一个时序模型。 以下 GoogleSQL 查询会创建一个用于预测 totals.visits 的模型。

CREATE MODEL 子句将创建并训练一个名为 bqml_tutorial.ga_arima_model 的模型。

#standardSQL
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

OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) 子句指示您正在创建一个基于 ARIMA 的时序模型。默认情况下,auto_arima=TRUE,因此 auto.ARIMA 算法会自动调整 ARIMA_PLUS 模型中的超参数。该算法适合数十个候选模型,选择具有最低 Akaike 信息标准 (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.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
  3. 点击运行

    查询大约需要 43 秒才能完成,之后您的模型 (ga_arima_model) 会显示在导航面板中。由于查询使用 CREATE MODEL 语句来创建模型,因此您看不到查询结果。

第四步:检查所有评估模型的评估指标

创建模型后,您可以使用 ML.ARIMA_EVALUATE 函数查看自动超参数调整过程中评估的所有候选模型的评估指标。

在以下 GoogleSQL 查询中,FROM 子句对模型 bqml_tutorial.ga_arima_model 使用 ML.ARIMA_EVALUATE 函数。默认情况下,此查询会返回所有候选模型的评估指标。

如需运行 ML.ARIMA_EVALUATE 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_EVALUATE(MODEL `bqml_tutorial.ga_arima_model`)
  3. 点击运行

  4. 查询只需不到一秒的时间即可完成。查询完成后,点击查询文本区域下方的结果标签页。结果应类似于以下屏幕截图:

    ML.ARIMA_EVALUATE 输出。

    结果包括以下列:

    • 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

    以下四列(non_seasonal_{p,d,q}has_drift)定义了训练流水线中的 ARIMA 模型。后面的三个指标(log_likelihoodAICvariance)与 ARIMA 模型拟合过程相关。

    auto.ARIMA 算法首先使用 KPSS 测试来确定 non_seasonal_d 的最佳值为 1。当 non_seasonal_d 为 1 时,auto.ARIMA 会并行训练 42 个不同的候选 ARIMA 模型。请注意,当 non_seasonal_d 不为 1 时,auto.ARIMA 会训练 21 个不同的候选模型。在此示例中,所有 42 个候选模型均有效。因此,输出将包含 42 行,其中每行都与一个候选 ARIMA 模型相关联。请注意,对于某些时序,某些候选模型是无效的,因为它们不可逆或不固定。这些无效的模型会从输出中排除,这将使输出少于 42 行。这些候选模型将按照 AIC 升序排序。第一行中的模型具有最低的 AIC,它被视为最佳模型。此最佳模型将保存为最终模型,并在您调用 ML.EXPLAIN_FORECASTML.FORECASTML.ARIMA_COEFFICIENTS 时使用,如以下步骤所示。

    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_COEFFICIENTS 函数会检索 ARIMA_PLUS 模型 bqml_tutorial.ga_arima_model 的模型系数。ML.ARIMA_COEFFICIENTS 接受该模型作为唯一输入。

运行 ML.ARIMA_COEFFICIENTS 查询:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.ARIMA_COEFFICIENTS(MODEL `bqml_tutorial.ga_arima_model`)
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.ARIMA_COEFFICIENTS 输出。

    结果包括以下列:

    • ar_coefficients
    • ma_coefficients
    • intercept_or_drift

    ar_coefficients 显示了 ARIMA 模型的自动回归 (AR) 部分的模型系数。同样,ma_coefficients 显示了移动平均 (MA) 部分的模型系数。它们都是数组,其长度分别等于 non_seasonal_pnon_seasonal_q。在 ML.ARIMA_EVALUATE 的输出中,最上面一行的最佳模型的 non_seasonal_p 为 2,non_seasonal_q 为 3。因此,ar_coefficients 是长度为 2 的数组,ma_coefficients 是长度为 3 的数组。intercept_or_drift 是 ARIMA 模型中的常量项。

第六步:使用模型预测时序

ML.FORECAST 函数使用模型 bqml_tutorial.ga_arima_model 预测未来的时序值以及预测区间。

在以下 GoogleSQL 查询中,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询会预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。ML.FORECAST 采用该模型以及几个可选的参数。

如需运行 ML.FORECAST 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 AS confidence_level))
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.FORECAST 输出。

    结果包括以下列:

    • forecast_timestamp
    • forecast_value
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_upper_bound
    • confidence_interval_lower_bound(即将弃用)
    • confidence_interval_upper_bound(即将弃用)

    输出行将按照 forecast_timestamp 的时间顺序排序。在时序预测中,由下限和上限捕获的预测区间与 forecast_value 一样重要。forecast_value 是预测区间的中点。预测区间取决于 standard_errorconfidence_level

第七步:说明和直观呈现预测结果

若要了解时序的预测方式,以及直观呈现预测的时序以及历史时序和所有独立组件,ML.EXPLAIN_FORECAST 函数会使用模型 bqml_tutorial.ga_arima_model 预测未来的时序值以及预测间隔,同时返回该时序的所有单独的组件。

ML.FORECAST 函数一样,STRUCT(30 AS horizon, 0.8 AS confidence_level) 子句指示查询预测 30 个未来的时间点,并生成置信度为 80% 的预测区间。ML.EXPLAIN_FORECAST 函数采用该模型以及几个可选的参数。

如需运行 ML.EXPLAIN_FORECAST 查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     *
    FROM
     ML.EXPLAIN_FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                         STRUCT(30 AS horizon, 0.8 AS confidence_level))
  3. 点击运行

    查询只需不到一秒的时间即可完成。结果应如下所示:

    ML.EXPLAIN_FORECAST 输出 1。 ML.EXPLAIN_FORECAST 输出 2。

    结果包括以下列:

    • time_series_timestamp
    • time_series_type
    • time_series_data
    • time_series_adjusted_data
    • standard_error
    • confidence_level
    • prediction_interval_lower_bound
    • prediction_interval_lower_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

    输出行将按照 time_series_timestamp 的时间顺序排序。不同的组件以不同输出列的形式列出。如需了解详情,请参阅 ML.EXPLAIN_FORECAST 的定义。

  4. 查询完成后,点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。

    Union_all_query 输出

  5. 图表面板中,选择时序图表 (Time series chart):

    Time_series_chart

  6. 数据面板中,执行以下操作:

    1. 日期范围维度部分中,选择 time_series_timestamp (Date)
    2. 维度部分中,选择 time_series_timestamp (Date)
    3. 指标部分中,移除默认指标 Record Count,并添加以下内容:
      • time_series_data
      • prediction_interval_lower_bound
      • prediction_interval_upper_bound
      • trend
      • seasonal_period_weekly
      • step_changes

    Data_panel

  7. 样式面板中,向下滚动到缺失数据选项,然后使用换行符,而不是换行到零

    Style_section

    此时将显示以下绘图:

    Result_visualization

第八步(可选):在不启用 decompose_time_series 的情况下直观呈现预测结果

如果在 ARIMA_PLUS 训练中将 decompose_time_series 设置为 false,则可以使用 UNION ALL 子句和 ML.FORECAST 函数将历史时序和预测的时序连接起来。

在以下查询中,UNION ALL 子句之前的 SQL 会生成历史记录时序。UNION ALL 子句之后的 SQL 会使用 ML.FORECAST 函数生成预测的时序以及预测间隔。该查询对 history_valueforecasted_value 使用不同的字段,以不同颜色绘制它们。

如需运行查询,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,点击编写新查询按钮。

  2. 查询编辑器文本区域中输入以下 GoogleSQL 查询。

    #standardSQL
    SELECT
     history_timestamp AS timestamp,
     history_value,
     NULL AS forecast_value,
     NULL AS prediction_interval_lower_bound,
     NULL AS prediction_interval_upper_bound
    FROM
     (
       SELECT
         PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
         SUM(totals.visits) AS history_value
       FROM
         `bigquery-public-data.google_analytics_sample.ga_sessions_*`
       GROUP BY date
       ORDER BY date ASC
     )
    UNION ALL
    SELECT
     forecast_timestamp AS timestamp,
     NULL AS history_value,
     forecast_value,
     prediction_interval_lower_bound,
     prediction_interval_upper_bound
    FROM
     ML.FORECAST(MODEL `bqml_tutorial.ga_arima_model`,
                 STRUCT(30 AS horizon, 0.8 AS confidence_level))
  3. 点击运行

  4. 查询完成后,点击探索数据按钮,然后点击 Explore with Looker Studio(使用 Looker 数据洞察探索)。Looker 数据洞察将在新标签页中打开。在该新标签页中完成以下步骤。

    Union_all_query 输出

  5. 图表面板中,选择时序图表 (Time series chart):

    Time_series_chart

  6. 数据面板中的图表面板下方,转到指标部分。添加以下指标:history_valueforecast_valueprediction_interval_lower_boundprediction_interval_upper_bound。然后,移除默认指标 Record Count

    Data_section

  7. 样式 (Style) 面板中,向下滚动到缺失数据选项,然后使用换行符 (Line Breaks),而不是换行到零 (Line to Zero)。

    Style_section

    完成这些步骤后,左侧面板中将显示以下图表。输入历史记录时序为蓝色,而预测的序列为绿色。预测区间是下限序列和上限序列之间的区域。

    Result_visualization

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  • 删除您在教程中创建的项目。
  • 或者,保留项目但删除数据集。

删除数据集

删除项目也将删除项目中的所有数据集和所有表。如果您希望重复使用该项目,则可以删除在本教程中创建的数据集:

  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.

后续步骤