You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scikit-learn中SVM.SVC.score无法获取混淆矩阵,如何计算WAR与UAR?

如何用SVM计算加权平均准确率(WAR)和未加权平均准确率(UAR)

嘿,这个问题其实很常见——svm.SVC.score()确实只会返回整体的分类准确率,但要计算WAR和UAR,我们只需要先拿到模型对测试集的预测结果,再基于真实标签和预测标签进行计算就行,步骤很清晰:


第一步:获取模型的预测结果

在你现有代码的基础上,添加一行代码获取测试集的预测标签,替代只调用score()的方式:

# 原有训练代码保持不变
svmObject.fit(trainXtr, trainY)

# 获取测试集的预测结果
y_pred = svmObject.predict(testXtr)

第二步:计算UAR和WAR的两种方法

方法1:用sklearn内置工具快速查看结果

sklearn.metrics.classification_report会直接给出包括UAR(macro avg)和WAR(weighted avg)在内的详细指标,非常方便:

from sklearn.metrics import classification_report

# 打印分类报告
print(classification_report(testY, y_pred))

输出里的macro avg对应的就是未加权平均准确率(UAR)(所有类别准确率的算术平均,不考虑类别样本量),weighted avg对应的就是加权平均准确率(WAR)(每个类别准确率乘以该类样本占总样本的比例后求和,给样本多的类别更高权重)。

方法2:手动计算,理解底层逻辑

如果你想更清楚每个步骤的计算过程,可以手动基于混淆矩阵来推导:

from sklearn.metrics import confusion_matrix
import numpy as np

# 生成混淆矩阵:行=真实类别,列=预测类别
cm = confusion_matrix(testY, y_pred)

# 计算每个类别的单独准确率:正确预测数(对角线)/ 该类总样本数(行求和)
class_accuracies = cm.diagonal() / cm.sum(axis=1)

# 计算UAR:所有类别准确率的平均值
uar = np.mean(class_accuracies)

# 计算WAR:每个类别准确率乘以该类的样本占比,再求和
class_sample_ratios = cm.sum(axis=1) / cm.sum()  # 每个类别的样本数占总样本的比例
war = np.sum(class_accuracies * class_sample_ratios)

# 输出结果
print(f"未加权平均准确率(UAR):{uar:.4f}")
print(f"加权平均准确率(WAR):{war:.4f}")

补充说明

  • 如果你的数据集存在类别不平衡的情况,WAR会更偏向样本量多的类别表现,而UAR会平等对待所有类别的表现,选择哪个指标取决于你的业务需求。
  • 你代码里设置了class_weight=None,如果需要让模型在训练时考虑类别不平衡,可以调整这个参数(比如class_weight='balanced'),但这不会影响WAR和UAR的计算逻辑。

内容的提问来源于stack exchange,提问作者Farid J. Maleki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:47:41