CatBoostRegressor决策树的叶节点值取值尺度是什么?
问题原因
- CatBoost属于梯度提升树模型,单棵决策树的叶节点值不是最终预测结果,仅代表当前迭代对残差的修正量,最终预测值是初始偏置 + 所有树的叶节点值乘以学习率后的累加和,所以单棵树的叶节点尺度和原数据集目标值不匹配是正常现象。
- 和XGBoost的
base_score对应,CatBoost回归任务默认的初始偏置为训练集目标列的均值,你看到的负叶节点值是相对于这个初始均值的向下修正量,不是最终预测值。 - 你当前代码未显式设置学习率,CatBoost会自动匹配适配迭代次数的学习率,单棵树的输出会被学习率缩放后再累加,这也是叶节点值范围远小于目标值范围的核心原因。
验证方法
你可以通过以下操作确认逻辑:
- 查看训练集目标列均值,这个就是CatBoost的初始偏置值:
print(df['size'].mean())
- 输出所有树的叶节点值,手动累加每棵树对应叶节点值乘以学习率,再加上初始偏置,结果和
predict()输出完全一致:
# 获取所有树的叶节点值 leaf_values = m.get_leaf_values() # 获取自动设置的学习率 print(m.get_param('learning_rate'))
- 如果需要调试时让单棵树的输出对齐最终预测尺度,可以在训练时指定
learning_rate=1,但该配置仅用于调试,实际训练会导致过拟合。
内容的提问来源于stack exchange,提问作者A. S. K.
相关产品推荐
相关产品推荐

