贝叶斯结构模型在全量营销效果评估的应用( 四 )


贝叶斯结构模型在全量营销效果评估的应用

文章插图
图4-2:展示模拟数据 。虚线表示干预发生的时间点 , 蓝线表示受到干预的观测数据;黄线与绿线表示没有受到干预的两组对照数据 。
# 调用模型:pre_period = [0, 69]#设置干预前的时间窗口post_period = [70, 99]#干预后的窗口ci = CausalImpact(data, pre_period, post_period)#调用CausalImpact# 对于causalImpact的使用我们核心需要填写三个参数:观测数据data、干预前的时间窗口、干预后的时间窗口 。# 输出结果:ci.plot()ci.summary()图4-3:展示CausalImpact输出的结果图 , 图1表示真实值与模型拟合值的曲线;图2表示每个时刻真实值与预测值的差异;图3表示真实值与预测值的累计差值 。表3-1:展示CausalImpact输出的结果表格 , 量化效应值effect的估计及其置信区间 , 反映效应值是否具有显著性 。107.71表示干预之后实际值的平均;96.25表示干预之后预测值的平均 , 3.28表示估计的标准差 , [89.77,102.64]表示反事实估计的置信区间 。11.46表示实际值与预测值的差距 , [5.07,17.94]表示差值的置信区间 , 由于差距的置信区间在0的右侧 , 表示干预有显著的提升作用 。
贝叶斯结构模型在全量营销效果评估的应用

文章插图
图4-3:展示CausalImpact输出的结果图 , 图1表示真实值与模型拟合值的曲线;图2表示每个时刻真实值与预测值的差异 , 橙色阴影部分表示置信区间;图3表示真实值与预测值的累计差值 。
贝叶斯结构模型在全量营销效果评估的应用

文章插图
表3-1:展示CausalImpact输出的结果表格 , 量化效应值effect的估计及其置信区间 , 反映效应值是否具有显著性 。107.71表示干预之后实际值的平均;96.25表示干预之后预测值的平均 , 3.28表示估计的标准差 , [89.77,102.64]表示反事实估计的置信区间 。11.46表示实际值与预测值的差距 , [5.07,17.94]表示差值的置信区间 , 由于差距的置信区间在0的右侧 , 表示干预有显著的提升作用 。
4.2 模型校验
对于模型拟合的结果 , 我们需要进行类似AB实验的“AA校验” 。一般可以通过图示的结果中的第二张图 , 观察干预之前真实值与预测值差值的置信区间是否包含0 , 如果包含0则说明通过检验 , 模型拟合效果不错 。上图中 , 置信区间均含0 , 说明模型可用 。
4.3 模型调整
  • 过程参数:我们可以使用Tensorflow中的Decomposition来查看时序模型中各个结构元素 , 包括周期性/季节性等等 。
seasonal_decompose(data)
贝叶斯结构模型在全量营销效果评估的应用

文章插图
图4-4展示了生成数据背后的状态元素 。第一张图反映原数据的走势;第二张图反映局部趋势因子;第三张图反映季节性因子 。可以看出数据存在季节性结构且呈单调上升趋势 。
  • 自定义参数:我们可以自定义参数的先验分布;迭代次数;周期性的时间窗口长度等等 。往往参数调整会对结果输出有影响 , 例如正确的选取先验分布会让结果更准确;迭代次数更多能保证MCMC收敛更稳定(但也可能导致模型运行时间较长)等等 。其中最重要的是对时间窗口长度的设置 , 需要正确地反映观测数据的周期性 。如果是年维度数据以星期为周期则设置neasnotallow=52;如果是天维度数据以小时为周期则设置neasnotallow=24等等 。
CausalImpact(...,model.args = list(niter = 20000, nseasons = 24))
贝叶斯结构模型在全量营销效果评估的应用

文章插图
图4-5展示CausalImpact包中各个参数含义及其默认值 。
  • 自定义时序模型:causalImpact的包中默认使用BSTS模型进行训练 , 我们也可以改为其他的时序模型 , 但前提是需要对数据进行标准化 。(如果使用默认的BSTS则不一定需要标准化)
from causalimpact.misc import standardizenormed_data, _ = standardize(data.astype(np.float32)) #标准化数据obs_data = https://www.isolves.com/it/cxkf/jiagou/2023-09-12/normed_data.iloc[:70, 0]# 使用tfp中的其他模型来训练时序数据linear_level = tfp.sts.LocalLinearTrend(observed_time_series=obs_data)linear_reg = tfp.sts.LinearRegression(design_matrix=normed_data.iloc[:, 1:].values.reshape(-1, normed_data.shape[1] -1))model = tfp.sts.Sum([linear_level, linear_reg], observed_time_series=obs_data)# 将自义定时序模型代入CausalImpact包中ci = CausalImpact(data, pre_period, post_period, model=model)


推荐阅读