PyMC3采样器遇最大树深度错误,求解决方案
解决PyMC3最大树深度错误的实操建议
一、修复模型核心结构问题
1. 修正感知误差的定义
当前代码中err是单个正态变量,但每个交易应拥有独立的感知误差,否则所有交易共享同一误差会导致后验分布相关性过高,采样难度陡增。修改为:
err = pm.Normal("err", mu=0, sigma=10, shape=num_items) # sigma与真实值匹配,shape对应交易数量
2. 替换不合理的观测似然
你的观测数据weight是离散分类值(-1, -0.5, 0, 0.5, 1),用正态似然适配离散数据会引发梯度问题,建议改用有序逻辑回归模型:
# 定义对应weight分界的阈值,可根据生成逻辑调整初始值 cutpoints = pm.Normal("cutpoints", mu=[-75, -50, -25, 25, 50, 75], sigma=10, shape=6) obs = pm.OrderedLogistic('obs', cutpoints=cutpoints, eta=comparison, observed=weight_vector)
二、收紧先验分布
当前W和BATNA的先验方差(sigma=50)过大,导致参数探索空间过宽,容易触发树深度限制。缩小先验范围:
W = pm.Normal("W", mu=0, sigma=10, shape=num_params) BATNA = pm.Normal("BATNA", mu=0, sigma=10)
三、调整采样器参数
如果上述模型修改后仍有问题,直接调整采样参数突破限制:
with model: trace = pm.sample(2000, tune=4000, cores=6, max_treedepth=15, target_accept=0.9)
max_treedepth=15:提升默认树深度(默认10)target_accept=0.9:提高目标接受率,减少采样时的拒绝次数
四、修正数据生成的低级bug
1. 特征赋值错误
当前代码中delivery和price都被赋值为quality的值,导致特征完全相关,模型无法识别独立权重:
for i in range(nr_deals): rnd_deal = generate_random_deal() qualities.append(rnd_deal[0]) deliveries.append(rnd_deal[1]) # 原代码为rnd_deal[0],修正为索引1 prices.append(rnd_deal[2]) # 原代码为rnd_deal[0],修正为索引2 B_values.append(noisy_B_value(*rnd_deal))
2. 权重计算逻辑错误
原代码中elif d1_val < 25:应为差值比较,否则逻辑完全偏离预期:
if d1_val - d2_val < -100: weight = 1 elif d1_val - d2_val < -25: weight = 0.5 elif d1_val - d2_val < 25: # 原代码为d1_val <25,修正为差值比较 weight = 0 elif d1_val - d2_val < 100: weight = -0.5 else: weight = -1
内容的提问来源于stack exchange,提问作者kakben
相关产品推荐
相关产品推荐

