多指标评分改了 pos_label,第二个分数却用了第一类概率
scikit-learn 1.9.1 的多指标响应缓存可能混用不同 pos_label。按同一拟合模型逐个调用 scorer,核对概率列和决策函数符号。
同一个 make_scorer() 单独放进 cross_validate,分数正常;在 scoring 字典前面加一个不同 pos_label 的指标,原分数却明显变了。若两个指标使用相同的 predict_proba 或 decision_function,应检查多指标评分的响应缓存。
scikit-learn 1.9.1 的相关实现按响应方法名缓存数据,但被缓存的结果已经按某个正类选过概率列,或调整过决策值符号。第二个 scorer 即使指定另一个 pos_label,仍可能拿到第一项的结果。这种偏差不会必然抛异常,还可能改变 GridSearchCV 的选优结果。
在同一个已拟合模型上逐项评分
先固定验证样本、模型和类别顺序,不要重新训练两次随机模型后直接比较。下面对二分类标签 0、1,分别创建两个 average precision 评分器,并各自直接调用:
from sklearn.metrics import average_precision_score, make_scorer
ap0 = make_scorer(
average_precision_score,
response_method="predict_proba",
pos_label=0,
)
ap1 = make_scorer(
average_precision_score,
response_method="predict_proba",
pos_label=1,
)
score0 = ap0(fitted_model, X_valid, y_valid)
score1 = ap1(fitted_model, X_valid, y_valid)
fitted_model、X_valid、y_valid 是同一份已经完成训练和划分的任务对象;模型必须提供相应响应接口。直接单独调用不会共享这个多指标缓存。类别不是 0、1 时,按实际类别值改正类,不能只改指标显示名称。
独立评分还应与 fitted_model.classes_ 对应的概率列核对;decision_function 在二分类中可能需要按正类翻转符号,不能用两个概率列的写法直接套到一维决策值上。
交叉验证要保留原来的划分
若暂时将两个 scorer 分开运行交叉验证,保存并复用同一组训练、验证索引,固定模型中相关随机状态。否则样本划分和拟合随机性会混入比较,无法判断差异是否来自缓存。逐项重训也会增加成本;需要效率时,可在现有交叉验证流程中保存每折已拟合模型,再按同折验证集分别评分。
只调整字典顺序可能让另一个指标变正常,却把错误转移给前一个;更换指标键名也不改变响应方法缓存的键。不要在发现异常后简单选取看起来更高的那组分数。
如果历史 GridSearchCV 用受影响指标进行 refit,需要按相同参数候选和数据划分重验选择结果,不能只改最终报告中的数字。保存旧候选结果、模型和依赖记录,使新旧差异可追溯。
这条问题针对共享响应方法且正类不同的多指标组合。普通单指标评估、不同方法组合或多分类指标是否进入同一路径,需要按实际配置判断。正式 1.9.1 仍有上述缓存设计;验证更新版本时,应比较单项、组合及交换顺序的分数,确认每项始终使用自己的正类响应。


