You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XGBoost模型F1分数与混淆矩阵结果不匹配问题咨询

问题核心原因

你观察到的F1分数与混淆矩阵效果反向相关的问题,和指标本身的逻辑无关,完全是验证流程和代码错误导致的:

  • 验证逻辑完全不对等:通过RandomizedSearchCV得到的0.46 F1分数,是10折交叉验证的泛化性能结果——每次迭代仅用9折数据训练,在剩余1折未参与训练的数据上计算得分,反映的是模型在未知数据上的真实表现;但你调参后得到的"两类行归一化准确率97%"的结果,是模型在全量训练集拟合后,直接在训练集本身做预测计算出来的,属于过拟合状态下的训练集自验证结果,相当于背完答案再考试,分数再高也不代表泛化能力,和交叉验证得到的泛化F1没有任何可比性。
  • 指标认知存在偏差:行归一化混淆矩阵的对角线值,是每个类别的召回率(真实为该类的样本中被预测正确的比例),而F1是精确率(预测为该类的样本中真实属于该类的比例)和召回率的调和平均值,不会和单类召回率呈线性正相关。你那组训练集上97%召回率的参数,用了1.5的高学习率搭配800棵树,完全把训练集样本特征死记硬背下来了,训练集上看精确率和召回率都高,但放到未知数据上会产生大量误判,精确率会暴跌,直接拉低F1。
  • 代码存在明显bug:你第二段绘制混淆矩阵的代码中,classes参数传入的是rf.classes_,如果当前环境中的随机森林对象rf和你训练的XGBoost模型标签顺序不一致,甚至会直接把两类预测结果搞反,输出完全错误的混淆矩阵。另外你写的RandomizedSearchCV参数网格里,每个参数仅设置了1个可选值,哪怕设置n_iter=100也不会执行任何参数搜索,全程只跑了一组固定参数的交叉验证,所谓"最优参数"本质是你手动填入的固定值,没有经过搜索筛选。
修正方案

针对这类典型的不平衡信用评分场景,按以下方式调整即可避免这类矛盾:

  • 所有模型效果评估必须在未参与训练的数据上开展:要么提前拆分固定训练/验证/测试集,要么用交叉验证的折外预测(out-of-fold)计算混淆矩阵、F1等所有指标,绝对禁止用训练集自验证的结果判断模型效果。
  • 不要直接用XGBoost默认的0.5分类阈值输出预测结果:先通过predict_proba()方法输出样本为正类(违约用户,标签1)的概率,结合业务成本(漏判违约用户的损失远高于误判正常用户的损失)选定最优分类阈值,再基于该阈值计算各类评估指标。
  • 不要把F1作为唯一优化目标,不平衡分类场景优先选择适配性更强的指标:
    • 优先用AUC-PR(精确率-召回率曲线下面积)做参数搜索的评分指标,相比ROC-AUC,它不会因为多数类样本占比过高给出虚高的评分,对少数类的预测表现更敏感。
    • 落地阶段优先用业务定制的成本加权分数:根据假阳性(误判正常用户为违约)、假阴性(漏判违约用户)的实际业务损失加权计算得分,比通用分类指标更贴合信用评分场景的真实需求。
  • 修正RandomizedSearchCV的参数网格,为每个超参数传入多个可选取值,才能真正发挥参数搜索的作用。

内容的提问来源于stack exchange,提问作者mvinegret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:24:21