You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Facebook Prophet构建多用户时间序列共用预测模型?

多用户时间序列的Prophet单一模型解决方案

问题背景

现有包含多用户(数万量级,存在新增/流失)的每日购买金额数据集,结构如下:

ds                      user_id v1  v2  y
2013-01-01 00:00:00     user00  6   100 8
2013-01-01 00:00:00     user01  5   0   8
2013-01-01 00:00:00     user02  4   1   12
2013-01-01 00:00:00     user03  3   200 2
...
2013-12-31 00:00:00     user99  1   0   1

需要用Facebook Prophet训练单一模型实现所有用户未来30天的购买金额预测,避免为每个用户单独建模,同时解答特征/目标的标准化问题。


核心解决方案:引入用户层面聚合特征作为全局回归因子

Prophet本身是单时间序列模型,但可以通过提取用户的个性化聚合特征,将多用户场景转化为带全局回归因子的单模型训练,让模型同时学习全局趋势和用户个性化模式。

步骤1:生成用户层面的聚合特征

针对每个用户,计算可表征其行为模式的统计特征,示例代码如下:

import pandas as pd

# 计算用户历史聚合特征
user_agg = df_train.groupby('user_id').agg(
    user_y_mean=('y', 'mean'),
    user_v1_mean=('v1', 'mean'),
    user_v2_mean=('v2', 'mean'),
    first_purchase=('ds', 'min')
).reset_index()

# 合并回原数据集,计算用户生命周期天数
df_train = df_train.merge(user_agg, on='user_id', how='left')
df_train['user_tenure'] = (df_train['ds'] - df_train['first_purchase']).dt.days

步骤2:训练带多回归因子的单一Prophet模型

将原始特征(v1、v2)和用户聚合特征全部作为回归因子加入模型:

from prophet import Prophet

# 初始化模型,Prophet要求输入列名为ds(时间)和y(目标)
model = Prophet()
# 添加原始特征
model.add_regressor('v1')
model.add_regressor('v2')
# 添加用户聚合特征
model.add_regressor('user_y_mean')
model.add_regressor('user_v1_mean')
model.add_regressor('user_v2_mean')
model.add_regressor('user_tenure')

# 用全量数据训练模型
model.fit(df_train)

步骤3:生成未来30天的预测数据

为每个用户生成未来30天的时间序列,并填充所需特征:

# 生成所有用户未来30天的时间序列
future_dates = []
for user in df_train['user_id'].unique():
    last_date = df_train[df_train['user_id'] == user]['ds'].max()
    future = pd.date_range(start=last_date + pd.Timedelta(days=1), periods=30)
    future_df = pd.DataFrame({'ds': future, 'user_id': user})
    future_dates.append(future_df)
future_df = pd.concat(future_dates)

# 合并用户聚合特征到未来数据集
future_df = future_df.merge(user_agg, on='user_id', how='left')
# 计算未来日期的用户生命周期天数
future_df['user_tenure'] = (future_df['ds'] - future_df['first_purchase']).dt.days

# 填充未来的v1、v2值:如果是用户固定属性则用历史均值,动态特征需提前预测
future_df['v1'] = future_df['user_v1_mean']
future_df['v2'] = future_df['user_v2_mean']

# 执行预测
forecast = model.predict(future_df)

附加问题:Prophet是否需要显式标准化?

  1. 目标变量y:无需显式标准化,Prophet的加法/乘法模型会自动适配y的数值尺度。
  2. 回归因子(如v1、v2、用户聚合特征):
    • Prophet默认对添加的回归因子开启标准化(standardize=True),会自动将回归因子缩放到均值为0、方差为1,消除尺度差异的影响。
    • 如果手动设置standardize=False,则需要自行对回归因子做标准化处理,尤其是当不同特征的数值尺度差异极大时(比如v1范围0-10,v2范围0-1000),标准化能提升模型训练效率和稳定性。

内容的提问来源于stack exchange,提问作者Fredrik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:20:10