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
相关产品推荐
相关产品推荐

