自定义GradientBoostingClassifier实现无效,性能接近随机模型求助
自定义梯度提升分类器效果拉胯的常见排查点
初始预测值算错了
二分类梯度提升的初始预测必须是样本的对数几率:log(正类样本数/负类样本数),不能随便设成0或者均值。初始值错了,后面所有树的修正方向全歪,自然学不到东西。伪残差计算逻辑不对
分类任务里的残差不是“真实标签-预测值”,而是对数损失的负梯度:y_true - sigmoid(当前对数几率预测值)。要是直接用真实标签减概率,或者减对数几率,树根本学不到有效的修正信号。没加学习率或者用错了
每棵树的预测结果必须乘以学习率(步长)再累加到总预测里。忘了乘的话,迭代再多也没用,甚至会让预测值爆炸,模型完全不收敛。决策树参数和原生GBM不匹配
sklearn原生GradientBoostingClassifier默认用max_depth=3的浅树,要是你的自定义实现用了默认的max_depth=None(无限制深度),树会直接过拟合,后续迭代没法提升整体性能;另外没设random_state的话,每次树的训练随机性太大,模型也会不稳定。预测阶段的概率转换错了
最终要把累计的对数几率用sigmoid转成概率再评估。要是直接输出对数几率,或者转换函数写错,计算出的roc_auc、pr_auc就会像随机模型一样,实际是预测值的格式不对。标签编码不匹配
确保标签是0/1格式,要是用了1/-1这类编码,伪残差的计算逻辑得跟着改,不然梯度计算全错。
内容的提问来源于stack exchange,提问作者Анатолий Михайлин
相关产品推荐
相关产品推荐

