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 的集成意味着您可以:
- 使用 Vertex AI 数据拆分和数据选取策略。
- 从存储在 Cloud Storage 中的 BigQuery 表或 CSV 读取数据。Vertex AI 预期每行的格式与 Vertex AI Forecasting 相同。
虽然 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 |
字符串 | 用于训练数据粒度以及预测水平和上下文窗口的单元。可以是 minute 、hour 、day 、week 、month 或 year 。了解如何选择数据粒度。 |
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 使用时间列来确定数据行的时间顺序。 |
|
时间戳拆分 | Vertex AI 使用 training_fraction 、validation_fraction 和 test_fraction 值将数据划分为训练集、验证集和测试集。Vertex AI 使用 timestamp_split_key 列确定数据行的时间顺序。 |
|
手动(预定义)拆分 | Vertex AI 使用 predefined_split_key 列中的 TRAIN、VALIDATE 或 TEST 值来拆分数据。 |
|
您在 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 。此值介于 1 到 1000 之间。 |
window_stride_length |
列 |
您可以在输入数据中添加一列,其中的值为 True 或 False 。Vertex AI 会为该列值为 True 的每个输入行生成一个窗口。只要 True 行的总数少于 100,000,000 ,就可以按任何顺序设置 True 和 False 值。首选布尔值,但也接受字符串值。字符串值不区分大小写。 |
window_column |
您可以在 get_prophet_train_pipeline_and_parameters
中定义窗口参数,如下所示:
参数名称 | 类型 | 定义 |
---|---|---|
window_column |
字符串 | 具有 True 和 False 值的列的名称。 |
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 |
整数 | 用于批量预测的工作器数量上限。 |