原生XGB与XGBRegressor预测一致但指标不同的原因咨询
原因分析:xgb.train与XGBRegressor的poisson-nloglik指标差异
预测结果完全一致说明两个模型的参数和拟合逻辑完全对齐,指标差异的核心原因是两个接口对poisson-nloglik的计算方式不同:一个计算总损失,一个计算平均损失。
1. 指标计算的缩放差异
XGBoost原生接口(xgb.train)与scikit-learn接口(XGBRegressor)在计算poisson-nloglik时,默认归一化逻辑不同:
xgb.train的eval方法返回的是所有样本的对数似然损失总和XGBRegressor的evals_result返回的是单样本的平均对数似然损失
你可以通过以下代码验证:将scikit-learn接口的结果乘以训练集样本数,应与原生接口的结果近似相等(忽略浮点误差):
train_size = len(simdf_train) # 原生接口的总损失 native_loss = float(bst_A.eval(xgbMatrix_A).split(':')[-1]) # 平均损失乘以样本数,与总损失对齐 sklearn_scaled_loss = bst_B.evals_result()["validation_0"]["poisson-nloglik"][-1] * train_size print(native_loss) print(sklearn_scaled_loss)
2. 计算时机的细节补充
xgb.train的eval是训练完成后,基于最终模型对验证集(此处为训练集)重新计算的指标;而XGBRegressor的evals_result记录的是训练过程中每一轮迭代后的指标值,最终取第50轮的结果。不过因为模型最终收敛到同一状态,这个差异不会导致数值偏差,核心仍为缩放逻辑不同。
3. 参数一致性验证(可选)
虽然你的预测结果一致,可确认从config提取的参数是否完全保留原生模型设置(比如monotone_constraints),避免隐性参数遗漏:
print(model_param)
内容的提问来源于stack exchange,提问作者Lolivano
相关产品推荐
相关产品推荐

