使用 Prophet 进行预测

Prophet 是由 Meta 维护的预测模型。如需了解算法详情,请参阅 Prophet 论文;如需详细了解该库,请参阅文档

BigQuery ML ARIMA_PLUS 一样,Prophet 会尝试将每个时序分解为趋势、季节和节假日,并使用这些模型的预测聚合来生成预测。但是,一个重要的区别在于,BQML ARIMA+ 使用 ARIMA 对趋势组件进行建模,而 Prophet 尝试使用分段的逻辑或线性模型拟合曲线。

Google Cloud 提供用于训练 Prophet 模型的流水线,以及用于从 Prophet 模型获取批量预测结果的流水线。两个流水线都是 Google Cloud 流水线组件 (GCPC) 中的 Vertex AI Pipelines 实例。

Prophet 与 Vertex AI 的集成意味着您可以:

虽然 Prophet 是多变量模型,但 Vertex AI 仅支持它的单变量版本。

如需了解此工作流使用的服务账号,请参阅表格工作流的服务账号

Workflow API

此工作流使用以下 API:

  • Vertex AI
  • Dataflow
  • BigQuery
  • Cloud Storage

使用 Prophet 训练模型

Prophet 专为单个时间序列而设计。Vertex AI 按时间序列 ID 聚合数据,并为每个时间序列训练 Prophet 模型。模型训练流水线使用网格搜索和 Prophet 的内置反向测试逻辑执行超参数调节。

为了支持多个时间序列,流水线使用 Vertex AI 自定义训练作业Dataflow 并行训练多个 Prophet 模型。总的来说,训练的模型数量是时间序列数量和超参数调节试验的次数的乘积。

以下示例代码演示如何运行 Prophet 模型训练流水线:

job = aiplatform.PipelineJob(
    ...
    template_path=train_job_spec_path,
    parameter_values=train_parameter_values,
    ...
)
job.run(service_account=SERVICE_ACCOUNT)

您可以使用 job.run() 中的可选 service_account 参数,将 Vertex AI Pipelines 服务账号设置为您选择的账号。

流水线和参数值由以下函数定义。

(
    train_job_spec_path,
    train_parameter_values,
) = utils.get_prophet_train_pipeline_and_parameters(
    ...
)

以下是部分 get_prophet_train_pipeline_and_parameters 参数:

参数名称 类型 定义
project 字符串 您的项目 ID。
location 字符串 您的区域。
root_dir 字符串 用于存储输出的 Cloud Storage 位置。
target_column 字符串 您希望此模型预测的列(值)。
time_column 字符串 时间列。 必须指定一个时间列,并且每行都必须有一个值。时间列表示进行给定观察的时间。
time_series_identifier_column 字符串 时序标识符列。 必须指定一个时序标识符列,并且每行必须包含一个值。预测训练数据通常包含多个时序,标识符可让 Vertex AI 了解训练数据中给定观察结果属于哪个时序。给定时序中的所有行在时序标识符列中具有相同的值。一些常见的时序标识符可能是商品 ID、商店 ID 或区域。您可以在单个时序上训练预测模型,并且时序标识符列中的所有行都具有相同的值。但是,Vertex AI 更适合包含两个或更多时序的训练数据。为获得最佳结果,请对用于训练模型的每一列至少使用 10 个时序。
data_granularity_unit 字符串 用于训练数据粒度以及预测水平和上下文窗口的单元。可以是 minutehourdayweekmonthyear了解如何选择数据粒度
data_source_csv_filenames 字符串 存储在 Cloud Storage 中的 CSV 的 URI。
data_source_bigquery_table_path 字符串 BigQuery 表的 URI。
forecast_horizon 整数 预测范围确定模型预测每行预测数据的目标值的未来时间。预测范围以数据粒度为单位指定。了解详情
optimization_objective 字符串 模型的优化目标。了解详情
max_num_trials 整数 每个时序可以执行的调节试验次数上限。

Dataflow 参数

以下是用于 Dataflow 自定义的 get_prophet_train_pipeline_and_parameters 参数的一部分:

参数名称 类型 定义
trainer_dataflow_machine_type 字符串 用于训练的 Dataflow 机器类型。
trainer_dataflow_max_num_workers 整数 用于训练的 Dataflow 工作器数量上限。
evaluation_dataflow_machine_type 字符串 用于评估的 Dataflow 机器类型。
evaluation_dataflow_max_num_workers 整数 用于评估的 Dataflow 工作器数量上限。
dataflow_service_account 字符串 用于运行 Dataflow 作业的自定义服务账号。Dataflow 作业可以配置为使用专用 IP 和特定 VPC 子网。 此参数充当默认 Dataflow 工作器服务账号的替换值。

由于 Prophet 训练作业在 Dataflow 上运行,因此初始启动时间为 5 - 7 分钟。如需减少额外的运行时,您可以纵向扩容或横向扩容。例如,如需纵向扩容,您可以将机器类型从 n1-standard-1 更改为 e2-highcpu-8。如需横向扩容,您可以将工作器数量从 1 增加到 200

数据拆分参数

训练流水线提供以下用于拆分数据的选项:

数据拆分 说明 参数
默认拆分 Vertex AI 随机选择 80% 的数据行分配给训练集、10% 分配给验证集、10% 分配给测试集。Vertex AI 使用时间列来确定数据行的时间顺序。
比例拆分 Vertex AI 使用您提供的值将数据划分为训练集、验证集和测试集。Vertex AI 使用时间列来确定数据行的时间顺序。
  • training_fraction
  • validation_fraction
  • test_fraction
时间戳拆分 Vertex AI 使用 training_fractionvalidation_fractiontest_fraction 值将数据划分为训练集、验证集和测试集。Vertex AI 使用 timestamp_split_key 列确定数据行的时间顺序。
  • training_fraction
  • validation_fraction
  • test_fraction
  • timestamp_split_key
手动(预定义)拆分 Vertex AI 使用 predefined_split_key 列中的 TRAIN、VALIDATE 或 TEST 值来拆分数据。
  • predefined_split_key

您在 get_prophet_train_pipeline_and_parameters 中定义数据拆分参数,如下所示:

参数名称 类型 定义
predefined_split_key 字符串 包含 TRAIN、VALIDATE 或 TEST 值的列名称。如果您使用的是手动(预定义)拆分,请设置此值。
training_fraction 浮点数 要分配给训练集的数据的百分比。如果您使用的是比例拆分或时间戳拆分,请设置此值。
validation_fraction 浮点数 要分配给验证集的数据的百分比。如果您使用的是比例拆分或时间戳拆分,请设置此值。
test_fraction 浮点数 要分配给测试集的数据的百分比。如果您使用的是比例拆分或时间戳拆分,请设置此值。
timestamp_split_key 字符串 包含数据拆分时间戳的列的名称。如果您使用的是时间戳拆分,请设置此值。

窗口参数

Vertex AI 使用滚动窗口策略根据输入数据生成预测窗口。如果您未设置窗口参数,Vertex AI 会使用 Count 策略,默认值为 100,000,000。训练流水线提供以下滚动窗口策略:

滚动窗口策略 说明 参数
计数 Vertex AI 生成的窗口数量不得超过用户提供的最大值。如果输入数据集中的行数小于最大窗口数,则每一行用于生成一个窗口。否则,Vertex AI 会执行随机采样来选择行。最大窗口数的默认值为 100,000,000。最大窗口数不能超过 100,000,000 window_max_count
步长 Vertex AI 使用每 X 输入行中的一行来生成一个窗口,最多可生成 1 亿个窗口。此选项对季节性或定期预测非常有用。例如,如果想要将预测限制为一周中的某一天,可以将步幅设置为 7。此值介于 11000 之间。 window_stride_length
您可以在输入数据中添加一列,其中的值为 TrueFalse。Vertex AI 会为该列值为 True 的每个输入行生成一个窗口。只要 True 行的总数少于 100,000,000,就可以按任何顺序设置 TrueFalse 值。首选布尔值,但也接受字符串值。字符串值不区分大小写。 window_column

您可以在 get_prophet_train_pipeline_and_parameters 中定义窗口参数,如下所示:

参数名称 类型 定义
window_column 字符串 具有 TrueFalse 值的列的名称。
window_stride_length 整数 步长的长度值。
window_max_count 整数 最大窗口数。

使用 Prophet 进行预测

Vertex AI 适用于 Prophet 的模型训练流水线为数据中的每个时间序列创建一个 Prophet 模型。预测流水线按时间序列 ID 汇总输入数据,并为每个时间序列单独计算预测。然后,流水线会分解预测结果,以匹配 Vertex AI Forecasting 格式。

以下示例代码演示了如何运行 Prophet 预测流水线:

job = aiplatform.PipelineJob(
    ...
    template_path=prediction_job_spec_path,
    parameter_values=prediction_parameter_values,
    ...
)
job.run(...)

流水线和参数值由以下函数定义。

(
    prediction_job_spec_path,
    prediction_parameter_values,
) = utils.get_prophet_prediction_pipeline_and_parameters(
    ...
)

以下是部分 get_prophet_prediction_pipeline_and_parameters 参数:

参数名称 类型 定义
project 字符串 您的项目 ID。
location 字符串 您的区域。
model_name 字符串 模型资源的名称。字符串格式,如下所示:projects/{project}/locations/{location}/models/{model}
time_column 字符串 时间列。 必须指定一个时间列,并且每行都必须有一个值。时间列表示进行给定观察的时间。
time_series_identifier_column 字符串 时序标识符列。 必须指定一个时序标识符列,并且每行必须包含一个值。预测训练数据通常包含多个时序,标识符可让 Vertex AI 了解训练数据中给定观察结果属于哪个时序。给定时序中的所有行在时序标识符列中具有相同的值。一些常见的时序标识符可能是商品 ID、商店 ID 或区域。您可以在单个时序上训练预测模型,并且时序标识符列中的所有行都具有相同的值。但是,Vertex AI 更适合包含两个或更多时序的训练数据。为获得最佳结果,请对用于训练模型的每一列至少使用 10 个时序。
target_column 字符串 您希望此模型预测的列(值)。
data_source_csv_filenames 字符串 存储在 Cloud Storage 中的 CSV 的 URI。
data_source_bigquery_table_path 字符串 BigQuery 表的 URI。
bigquery_destination_uri 字符串 所需目标数据集的 URI。如果未设置此值,则会在项目中的新数据集下创建资源。
machine_type 字符串 用于批量预测的机器类型。
max_num_workers 整数 用于批量预测的工作器数量上限。