XGBoost三分类性能指标手算结果与分类报告不符问题咨询
计算结果不一致的核心原因
你使用的混淆矩阵是按真实标签行归一化后的比例矩阵(每行数值求和约为1,仅保留2位小数存在截断误差),不是记录原始样本计数的混淆矩阵,直接拿比例值套用计数场景的指标公式,必然和分类报告输出结果存在偏差。
第一步:还原原始计数混淆矩阵
从分类报告可以拿到每个类别的真实样本量(support):类别0共116个样本,类别1共317个样本,类别2共855个样本,总样本量1288。结合归一化矩阵的比例、分类报告的指标值反推,原始计数混淆矩阵(行=真实标签,列=预测标签,顺序对应0/1/2类)如下:
[ [105, 6, 5], # 真实为0类的样本预测结果分布 [ 0, 291, 26], # 真实为1类的样本预测结果分布 [ 0, 55, 800] # 真实为2类的样本预测结果分布 ]
可以先做校验:
- 每行求和等于对应类的support:105+6+5=116,0+291+26=317,0+55+800=855,完全匹配
- 对角线元素为对应类的TP值:105/116≈0.9052(0类召回率)、291/317≈0.9180(1类召回率)、800/855≈0.9357(2类召回率),和分类报告完全一致
第二步:多分类指标正确手动计算规则
所有指标计算必须基于原始样本计数,不能用归一化比例值,计算规则如下:
单类别基础指标
对任意类别i,先从混淆矩阵取三个基础值:
- TP(真阳性):混淆矩阵第i行第i列的数值,即真实为i、预测也为i的样本数
- FN(假阴性):混淆矩阵第i行除对角线外所有值的和,即真实为i、预测为其他类的样本数
- FP(假阳性):混淆矩阵第i列除对角线外所有值的和,即真实为其他类、预测为i的样本数
对应指标公式:
- 精确率:
TP_i / (TP_i + FP_i),即所有被预测为i的样本中,真实属于i类的比例
校验:0类精确率=105/(105+0+0)=1.0000,1类精确率=291/(6+291+55)≈0.8267,2类精确率=800/(5+26+800)≈0.9627,和报告完全匹配 - 召回率:
TP_i / (TP_i + FN_i),即所有真实为i的样本中,被正确预测的比例 - F1值:
2 * 精确率_i * 召回率_i / (精确率_i + 召回率_i)
全局汇总指标
- 准确率:所有类别TP之和 / 总样本数,即混淆矩阵对角线元素总和除以矩阵所有元素总和
校验:(105+291+800)/1288=1196/1288≈0.9286,和报告完全匹配 - 宏平均(macro avg):分别对三个类别的精确率、召回率、F1值求算术平均,不考虑各类样本量差异
校验:宏平均精确率=(1.0000+0.8267+0.9627)/3≈0.9298,和报告完全匹配 - 加权平均(weighted avg):分别对三个类别的精确率、召回率、F1值,以各类的真实样本量(support)为权重求加权平均
校验:加权召回率=(1160.9052 + 3170.9180 + 855*0.9357)/1288≈0.9286,和报告数值一致(多分类场景下加权召回率与准确率数值相等)
常见计算误区
- 混淆矩阵类型误用:不要把归一化后的比例矩阵当成原始计数矩阵使用,这类矩阵仅用于展示预测分布比例,不能直接用于指标计算
- 行列定义搞反:绝大多数工具输出的混淆矩阵行对应真实标签、列对应预测标签,若搞反行列,FP、FN的计算会完全错位
- 平均规则混淆:宏平均是无权重算术平均,加权平均是按真实类样本量加权,二者计算逻辑不同结果也有差异
内容的提问来源于stack exchange,提问作者SAT
相关产品推荐
相关产品推荐

