多分类加权指标计算
[牛客链接](https://www.nowcoder.com/practice/dec560ebcd8c47c9a37f6df692c38d25)
思路
本题是机器学习中经典的多分类评估指标计算问题,需要根据预测标签和真实标签,计算加权精确率(Precision)、召回率(Recall)和 F1 分数。
核心步骤:
- 逐类统计混淆矩阵元素:对每个类别
,遍历所有样本,统计:
- :预测为
且真实也为
的样本数
- :预测为
但真实不为
的样本数
- :真实为
但预测不为
的样本数
- 计算每类指标:
- ,分母为 0 时结果为 0
- ,分母为 0 时结果为 0
- ,分母为 0 时结果为 0
- 加权聚合:将每类指标乘以对应权重
后求和,得到最终的加权精确率、召回率和 F1 分数。
以样例为例:
- 类别 0:
,precision=1.00,recall=0.75,f1≈0.86
- 类别 1:
,precision=0.50,recall=0.50,f1=0.50
- 类别 2:
,precision≈0.33,recall=0.50,f1=0.40
加权后:precision = ,以此类推。
整个过程就是按定义直接模拟计算即可,没有特殊的算法技巧,关键在于正确处理分母为 0 的边界情况。
代码
def main():
pred = list(map(int, input().split()))
true = list(map(int, input().split()))
weights = list(map(float, input().split()))
n_classes = len(weights)
wp = 0.0
wr = 0.0
wf = 0.0
for c in range(n_classes):
tp = sum(1 for p, t in zip(pred, true) if p == c and t == c)
fp = sum(1 for p, t in zip(pred, true) if p == c and t != c)
fn = sum(1 for p, t in zip(pred, true) if t == c and p != c)
prec = tp / (tp + fp) if (tp + fp) > 0 else 0.0
rec = tp / (tp + fn) if (tp + fn) > 0 else 0.0
f1 = 2 * prec * rec / (prec + rec) if (prec + rec) > 0 else 0.0
wp += weights[c] * prec
wr += weights[c] * rec
wf += weights[c] * f1
print(f"{wp:.2f} {wr:.2f} {wf:.2f}")
main()
复杂度分析
- 时间复杂度:
,其中
为类别数,
为样本数。对每个类别遍历一次所有样本。
- 空间复杂度:
,存储预测和真实标签数组。

京公网安备 11010502036488号