自定义分类指标函数报cannot unpack non-iterable float错误如何解决
报错成因
- 核心原因是Python函数的return执行逻辑:函数运行到第一个
return语句时就会直接终止运行,你当前代码写了4条连续的return语句,实际只会返回第一个acc这单个浮点数值。而你调用函数时尝试把返回值解包给4个变量,单个浮点数不属于可迭代对象,无法执行解包操作,因此抛出TypeError。 - 额外存在两处逻辑问题:
- 准确率
acc的计算逻辑写在for循环内部,每次遍历样本都会重复计算,虽然最终结果不会出错,但逻辑冗余不严谨 - 正类判定条件写的是
x>0.5,不符合你要求的≥0.5判定为正类的规则,等于0.5的预测概率会被误判为负类
- 准确率
修复方案
把4条单独的return语句合并为一条,按顺序返回四个指标的元组,同时修正上述两处逻辑问题即可,修复后的完整函数代码如下:
def calc_metrics(y,pred_probs): # 生成预测标签,≥0.5判定为正类 preds = [int(x >= 0.5) for x in pred_probs] # 计算准确率 correct = 0 for i in range(len(y)): if y[i] == preds[i]: correct += 1 acc = float(correct / len(y) * 100) # 计算混淆矩阵核心指标 tp = sum([(preds[i]==1) and (y[i]==1) for i in range(len(y))]) fp = sum([(preds[i]==1) and (y[i]==0) for i in range(len(y))]) fn = sum([(preds[i]==0) and (y[i]==1) for i in range(len(y))]) precision = float(tp/(tp+fp)) recall = float(tp/(tp+fn)) f1 = float(2*precision*recall/(precision+recall)) # 按要求顺序一次性返回四个指标的元组 return acc, recall, precision, f1
修改后再次运行测试代码即可正常输出四个指标结果。
内容的提问来源于stack exchange,提问作者diesmiling
相关产品推荐
相关产品推荐

