联邦学习(FL)模拟出现Undefined Metric警告,精度等指标结果偏低
解决联邦学习模拟中的Precision/F-score未定义警告及结果偏低问题
问题根源
当模型对某个类别没有输出任何预测样本时,计算Precision(精确率)和F-score会遇到分母为0的情况,此时默认逻辑会将这类指标强制设为0.0,直接拉低了整体的Precision、F-score结果;而Recall偏低通常是因为该类别样本占比极低,模型学习不足,再加上指标的默认处理方式进一步放大了结果偏差。
针对性解决方案
核心是通过zero_division参数调整分母为0时的指标计算逻辑,根据使用场景选择以下方式:
1. 使用sklearn内置指标函数时
如果是用sklearn的classification_report、precision_score等工具计算指标,直接在调用时指定zero_division参数:
zero_division=1:分母为0时将指标设为1.0(适合该类别确实无预测样本,但模型本应正确识别的场景)zero_division=0:保持默认设为0.0的行为zero_division='warn':仅输出警告,不修改指标结果
示例代码:
from sklearn.metrics import classification_report # y_true为真实标签,y_pred为模型预测结果 print(classification_report(y_true, y_pred, zero_division=1))
2. 自定义联邦学习指标计算逻辑时
如果是在联邦学习框架(如FedAvg、FedProx)中自行编写指标计算代码,需在Precision和F-score的计算逻辑中添加判断:
def calculate_class_precision(y_true, y_pred, target_class): true_pos = sum((y_true == target_class) & (y_pred == target_class)) pred_pos = sum(y_pred == target_class) # 根据业务需求返回1.0或0.0 return 1.0 if pred_pos == 0 else true_pos / pred_pos
额外优化建议
- 先排查数据分布:确认哪些类别无预测样本,是否是因为该类别在客户端本地数据中占比极低,导致联邦训练时模型对其学习不足。
- 调整联邦训练策略:比如采用按客户端数据量加权的联邦平均,或是对小众类别做过采样,从根源上提升模型对小众类别的识别能力,减少无预测样本的情况。
内容的提问来源于stack exchange,提问作者Vivian
相关产品推荐
相关产品推荐

