news 2026/4/18 20:00:07

从‘猫、鱼、鸡’到你的数据集:用Excel和Python彻底搞懂多分类评估的三种平均算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从‘猫、鱼、鸡’到你的数据集:用Excel和Python彻底搞懂多分类评估的三种平均算法

从动物分类到实战应用:Excel与Python双视角解密多分类评估算法

当你的模型把猫识别成鱼、把鸡误判为猫时,如何客观评价这个分类器的表现?多分类问题中的评估指标远比简单的准确率复杂得多。本文将带你用Excel手动拆解每个计算环节,再用Python实现自动化流程,彻底掌握Macro-average、Micro-average和Weighted-average三种算法的本质差异。

1. 从混淆矩阵到评估指标:手工计算实战

我们先从一个简单的三分类案例开始——猫、鱼、鸡的图像分类任务。假设测试集包含25张图片,分类结果如下表所示:

真实\预测
411
622
306

1.1 计算每个类别的TP/FP/FN/TN

以"猫"类别为例:

  • TP(真正例):真实是猫且预测为猫的数量 = 4
  • FP(假正例):真实不是猫但预测为猫的数量 = 6(鱼→猫) + 3(鸡→猫) = 9
  • FN(假反例):真实是猫但预测不为猫的数量 = 1(猫→鱼) + 1(猫→鸡) = 2
  • TN(真反例):真实不是猫且预测不为猫的数量 = 其他所有正确预测 = 2+2+0+6 = 10

提示:计算TN时,可以快速验证:TN = 总样本数 - (TP+FP+FN) = 25 - (4+9+2) = 10

同理计算出鱼和鸡的指标:

# Python验证计算 import numpy as np confusion_matrix = np.array([ [4, 1, 1], # 猫 [6, 2, 2], # 鱼 [3, 0, 6] # 鸡 ]) def calculate_metrics(matrix, class_idx): tp = matrix[class_idx, class_idx] fp = matrix[:, class_idx].sum() - tp fn = matrix[class_idx, :].sum() - tp tn = matrix.sum() - (tp + fp + fn) return tp, fp, fn, tn metrics_cat = calculate_metrics(confusion_matrix, 0) metrics_fish = calculate_metrics(confusion_matrix, 1) metrics_chicken = calculate_metrics(confusion_matrix, 2)

1.2 三类评估算法的本质区别

Macro-average:平等对待每个类别

  • 计算每个类别的指标后取算术平均
  • 公式:$Precision_{macro} = \frac{Precision_{猫} + Precision_{鱼} + Precision_{鸡}}{3}$

Weighted-average:按样本量加权

  • 根据每个类别的真实样本数分配权重
  • 公式:$Recall_{weighted} = Recall_{猫} \times w_{猫} + Recall_{鱼} \times w_{鱼} + Recall_{鸡} \times w_{鸡}$

Micro-average:全局统计视角

  • 汇总所有类别的TP/FP/FN后计算
  • 特点:在多分类中accuracy=recall=precision

2. Excel实战:手动构建评估计算器

2.1 搭建动态混淆矩阵

  1. 创建原始数据表,记录每张图片的真实标签和预测标签

  2. 使用COUNTIFS函数构建混淆矩阵:

    =COUNTIFS($A$2:$A$26,D$1,$B$2:$B$26,$C2)

    (假设A列是真实标签,B列是预测标签)

  3. 设置TP/FP/FN/TN计算区域,使用SUM和INDEX函数动态引用

2.2 实现三类平均算法

Macro计算区

=AVERAGE(D32,D33,D34) # 对三个类别的precision取平均

Weighted计算区

=SUMPRODUCT(D32:D34, D28:D30)/SUM(D28:D30) # 加权平均

Micro计算区

=SUM(D20:D22)/(SUM(D20:D22)+SUM(E20:E22)) # 全局precision

注意:建议在Excel中使用条件格式突出显示关键指标差异,当调整样本分布时能直观看到算法敏感度变化

3. Python自动化实现

3.1 使用sklearn快速评估

from sklearn.metrics import classification_report y_true = ['猫']*6 + ['鱼']*10 + ['鸡']*9 # 真实标签 y_pred = ['猫']*4 + ['鱼']*1 + ['鸡']*1 + ['猫']*6 + ['鱼']*2 + ['鸡']*2 + ['猫']*3 + ['鸡']*6 # 预测标签 print(classification_report(y_true, y_pred, target_names=['猫', '鱼', '鸡']))

输出结果包含三类算法的关键指标对比:

precision recall f1-score support 猫 0.31 0.67 0.42 6 鱼 0.67 0.20 0.31 10 鸡 0.67 0.67 0.67 9 accuracy 0.48 25 macro avg 0.55 0.51 0.47 25 weighted avg 0.58 0.48 0.47 25

3.2 从零实现核心算法

def micro_avg(confusion_matrix): tp = np.diag(confusion_matrix).sum() total = confusion_matrix.sum() return tp / total # accuracy = recall = precision def macro_avg(confusion_matrix): diag = np.diag(confusion_matrix) row_sums = confusion_matrix.sum(axis=1) col_sums = confusion_matrix.sum(axis=0) precisions = diag / col_sums recalls = diag / row_sums return { 'precision': precisions.mean(), 'recall': recalls.mean(), 'f1': (2 * (precisions * recalls) / (precisions + recalls)).mean() } def weighted_avg(confusion_matrix): diag = np.diag(confusion_matrix) row_sums = confusion_matrix.sum(axis=1) col_sums = confusion_matrix.sum(axis=0) class_weights = row_sums / row_sums.sum() precisions = diag / col_sums recalls = diag / row_sums return { 'precision': np.average(precisions, weights=class_weights), 'recall': np.average(recalls, weights=class_weights), 'f1': np.average(2*(precisions*recalls)/(precisions+recalls), weights=class_weights) }

4. 算法选择实战指南

4.1 样本均衡时的表现对比

当三类样本量接近时(如猫:8,鱼:9,鸡:8):

  • Macro和Weighted结果相似
  • Micro更关注整体分类正确率

4.2 样本不均衡时的关键差异

假设猫:50,鱼:10,鸡:5的极端情况:

算法类型PrecisionRecall特点
Macro-average0.610.50小类别权重被放大
Weighted-average0.750.72反映多数类表现
Micro-average0.720.72等同于整体准确率

4.3 业务场景选择建议

  • 医疗诊断(重视少数类):优先Macro,确保罕见病不被忽略
  • 推荐系统(关注主流偏好):选择Weighted,反映用户群体分布
  • 质量检测(整体合格率):使用Micro,把握全局表现

5. 进阶技巧与常见陷阱

5.1 多标签分类的特殊处理

当样本可能属于多个类别时,需要采用不同的策略:

from sklearn.metrics import multilabel_confusion_matrix # 每个类别单独计算二分类指标 mcm = multilabel_confusion_matrix(y_true_multilabel, y_pred_multilabel)

5.2 样本权重的高级应用

在sklearn中支持为每个样本指定权重:

sample_weight = np.array([2 if label == '鱼' else 1 for label in y_true]) print(classification_report(y_true, y_pred, sample_weight=sample_weight))

5.3 可视化分析工具

使用matplotlib绘制雷达图对比三类算法:

categories = ['Precision','Recall','F1'] macro_stats = [0.55, 0.51, 0.47] weighted_stats = [0.58, 0.48, 0.47] fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111, polar=True) ax.plot(angles, macro_stats, 'o-', label='Macro') ax.fill(angles, macro_stats, alpha=0.25) ax.plot(angles, weighted_stats, 'o-', label='Weighted') ax.fill(angles, weighted_stats, alpha=0.25)

在实际项目中,我发现当类别超过10个时,Micro-average往往会给出过于乐观的评估,而Macro-average则能更好反映模型在各个类别上的均衡表现。特别是在处理像"其他"这样的杂项类别时,Weighted-average的权重分配需要特别谨慎。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 19:59:54

「 Ansys 」仿真报错排查实战指南

1. 从报错信息快速定位问题根源 当你正在赶项目进度时,突然弹出一个鲜红的报错窗口,那种感觉就像开车时突然爆胎。作为从业十年的仿真工程师,我处理过上百种Ansys报错,总结出一个黄金法则:80%的问题都能通过正确解读报…

作者头像 李华
网站建设 2026/4/18 19:56:42

华硕笔记本色彩异常?3分钟用G-Helper恢复完美显示效果

华硕笔记本色彩异常?3分钟用G-Helper恢复完美显示效果 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Sc…

作者头像 李华
网站建设 2026/4/18 19:53:50

日经 225 实时行情 API 对接实战|Python 代码实现(WebSocket+HTTP)

在国际股指期货量化开发中,日经 225是高频交易品种。本文基于脉动数据行情平台接口,用 Python 实现日经 225 实时行情的两种接入方式:WebSocket 实时推送、HTTP 轮询拉取,并提供可直接运行的代码。一、支持品种与日经 225 实时数据…

作者头像 李华
网站建设 2026/4/18 19:39:26

PRPS 是 SAP PS 模块存储 WBS 元素主数据的核心表,主键为 MANDT+PSPNR,包含标识、层级、组织、成本、权限、时间与用户自定义等多类字段,适用于查询、报表与接口开发。

PRPS 是 SAP PS 模块存储 WBS 元素主数据的核心表,主键为 MANDTPSPNR,包含标识、层级、组织、成本、权限、时间与用户自定义等多类字段,适用于查询、报表与接口开发。核心字段解析(按功能分组)字段类型关键说明用途MAN…

作者头像 李华