如何用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是否需要显式标准化?
- 目标变量y:无需显式标准化,Prophet的加法/乘法模型会自动适配y的数值尺度。
- 回归因子(如v1、v2、用户聚合特征):
- Prophet默认对添加的回归因子开启标准化(
standardize=True),会自动将回归因子缩放到均值为0、方差为1,消除尺度差异的影响。 - 如果手动设置
standardize=False,则需要自行对回归因子做标准化处理,尤其是当不同特征的数值尺度差异极大时(比如v1范围0-10,v2范围0-1000),标准化能提升模型训练效率和稳定性。
- Prophet默认对添加的回归因子开启标准化(
内容的提问来源于stack exchange,提问作者Fredrik
相关产品推荐
相关产品推荐

