二分类模型接受率计算异常:阈值变化结果不变问题排查
问题根源:混淆矩阵ravel后的元素顺序与变量赋值不匹配
你的代码计算结果固定不变,核心原因是错误地对应了混淆矩阵ravel后的元素顺序,导致实际计算的是真实标签为accept(0)的样本比例(这是固定值,和模型阈值无关),而非你需要的「预测为accept的样本比例」。
具体分析
sklearn的confusion_matrix默认按真实标签行、预测标签列生成矩阵,当你的标签是[0,1]时,矩阵结构为:
[[tn, fp], # 真实标签0的行:tn=真实0预测0,fp=真实0预测1 [fn, tp]] # 真实标签1的行:fn=真实1预测0,tp=真实1预测1
调用ravel()后,元素顺序为:[tn, fp, fn, tp]
但你的代码里写的是:
tn, fn, fp, tp = confusion_matrix(y_true, y_pred).ravel()
这相当于把fp赋值给了fn,把fn赋值给了fp。此时你计算的(tn + fn)实际上是tn + fp——也就是所有真实标签为0的样本总数,这个数是固定的,自然不管阈值怎么变结果都一样。
修正方案
方案1:修正变量赋值顺序
直接对应ravel()后的正确元素顺序:
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel() return (tn + fn) / (tn + fn + fp + tp)
这里tn + fn是预测为0(accept)的样本数,会随阈值变化:阈值越高,模型越易预测为1(reject),接受率越低,符合你的预期。
方案2:显式指定标签并直接索引矩阵(更稳妥)
避免因标签顺序默认规则导致的错误,直接通过矩阵索引获取对应值:
# 显式指定标签顺序,确保矩阵结构符合预期 cm = confusion_matrix(y_true, y_pred, labels=[0, 1]) tn = cm[0][0] # 真实0,预测0 fp = cm[0][1] # 真实0,预测1 fn = cm[1][0] # 真实1,预测0 tp = cm[1][1] # 真实1,预测1 return (tn + fn) / (tn + fp + fn + tp)
内容的提问来源于stack exchange,提问作者Appie Nouri 34
相关产品推荐
相关产品推荐

