GradientBoostingRegressor回归转分类后ROC曲线生成相关问题咨询
GradientBoostingRegressor转二分类后ROC曲线相关问题解答
问题背景
我使用GradientBoostingRegressor从多个变量预测0到27的整数目标值,模型返回的y_pred_gb = reg.predict(input_test)同样是0到27的整数。随后手动设置阈值10,将y_pred_gb与真实值y_test转换为二值变量(大于10为正类1,否则为负类0),将任务转为分类问题。尝试用代码fpr, tpr, _ = roc_curve(y_test_binary, y_pred_gb)生成ROC曲线,存在以下疑问:
- 能否将
y_pred_gb作为roc_curve的第二个输入?根据文档,该参数应为「目标分数,可为正类概率估计、置信值或未阈值化的决策度量」,如何获取该目标分数? - 为何不同手动阈值下准确率大幅提升,但生成的ROC曲线却非常相似?
问题1解答
- 直接用
y_pred_gb作为roc_curve的第二个输入并不规范。roc_curve要求的输入是连续的、能反映模型对正类置信度的分数,而y_pred_gb是离散的回归预测值,虽能在一定程度上体现模型对目标值偏高的倾向,但本质不是正类概率或标准决策得分。 - 获取符合要求的目标分数,有两种可行方案:
- 若任务本质偏向分类,建议直接改用
GradientBoostingClassifier,调用它的predict_proba()方法,取返回结果的第二列就是正类(1)的概率估计,这是roc_curve最适配的输入类型。 - 若坚持使用回归模型,可将回归预测的连续输出(注意:
GradientBoostingRegressor默认predict输出是连续值,若你的结果是整数可能是额外处理导致的)当作置信度得分——毕竟预测值越高,对应正类(>10)的可能性越大,这种情况下可以直接用该连续值作为roc_curve的输入,但要明确这不是严格意义上的概率,仅作为排序性得分使用。
- 若任务本质偏向分类,建议直接改用
问题2解答
- 准确率是单一阈值下的分类性能指标,不同阈值会直接改变正负类的判定规则,因此准确率波动大是正常现象:比如阈值设得很低,会将更多样本判定为正类,若数据集正类占比高,准确率就会上升;阈值设高则相反。
- ROC曲线是遍历所有可能阈值后绘制的结果,它反映的是模型在全阈值范围内的整体区分能力,和你手动设置的单个阈值无关。ROC曲线的形状由模型输出得分的分布、真实标签的分布共同决定,只要模型的得分排序逻辑不变,ROC曲线的走势就不会有明显变化。你手动调整的只是曲线上的一个点,不会影响整条曲线的形态,因此不同手动阈值下ROC曲线看起来相似是完全合理的。
内容的提问来源于stack exchange,提问作者frankg1401
相关产品推荐
相关产品推荐

