各位学友大家好,医院死气沉沉的很无奈。今天外院的老师问我关于宏平均和微平均,这里给大家总结一下:
在机器学习中,尤其是在处理分类问题时,交叉验证是一种常用的评估模型性能的方法。当我们处理多分类问题时,经常会使用到宏平均(Macro-average)和微平均(Micro-average)来综合评估模型对各个类别的分类性能。这两种方法考虑多分类性能的方式不同,适用于不同的场景。
微平均(Micro-average)
微平均方法首先会汇总所有类别的真正例(TP)、假正例(FP)和假负例(FN),然后基于这些总数来计算性能指标(如精确度、召回率等)。
计算方法:先计算总的TP、FP和FN,然后用这些总数计算性能指标。例如,微平均精确度计算为所有类别的TP总和除以TP和FP的总和。
原理上的特点:微平均给出了所有类别整体的性能评估,它对每个样本平等对待,因此对于样本量大的类别有较高的影响。
宏平均(Macro-average)
宏平均方法会先对每个类别单独计算性能指标,然后计算这些指标的算术平均值。
计算方法:对每个类别独立计算性能指标,然后取这些指标的简单平均。例如,宏平均精确度是将每个类别的精确度分别计算出来后求平均值。
原理上的特点:宏平均对所有类别一视同仁,每个类别的性能指标对最终结果的贡献相同,因此它对于样本量不平衡的情况特别有用,可以避免大类别主导结果的情况。
对比与选择
宏平均更适用于:当你关心每个类别被平等对待时,即每个类别的重要性相同,不希望结果被大类别主导。
微平均更适用于:当你关心每个样本被平等对待时,适用于样本量不均匀的类别,更加关注总体的性能。
简单来说,如果你的数据集类别之间样本量差异很大,而你又希望评估模型在小类上的性能,那么宏平均是个不错的选择;如果你想要一个整体的性能指标,不太关心类别不平衡,那么微平均会是更好的选择。
from sklearn.metrics import precision_score, recall_score, f1_score
# 假设数据:每个类别的TP, FP, FN, TN
data = {
'class1': {'TP': 70, 'FP': 30, 'FN': 20, 'TN': 80},
'class2': {'TP': 50, 'FP': 10, 'FN': 30, 'TN': 110},
'class3': {'TP': 80, 'FP': 20, 'FN': 10, 'TN': 90},
}
# 计算微平均
micro_TP = sum([v['TP'] for v in data.values()])
micro_FP = sum([v['FP'] for v in data.values()])
micro_FN = sum([v['FN'] for v in data.values()])
micro_precision = micro_TP / (micro_TP + micro_FP)
micro_recall = micro_TP / (micro_TP + micro_FN)
micro_f1 = 2 * (micro_precision * micro_recall) / (micro_precision + micro_recall)
# 计算宏平均
macro_precision = sum([v['TP'] / (v['TP'] + v['FP']) for v in data.values()]) / len(data)
macro_recall = sum([v['TP'] / (v['TP'] + v['FN']) for v in data.values()]) / len(data)
macro_f1 = 2 * (macro_precision * macro_recall) / (macro_precision + macro_recall)
print(f"Micro-averaged precision: {micro_precision}")
print(f"Micro-averaged recall: {micro_recall}")
print(f"Micro-averaged F1: {micro_f1}")
print(f"Macro-averaged precision: {macro_precision}")
print(f"Macro-averaged recall: {macro_recall}")
print(f"Macro-averaged F1: {macro_f1}")
下面再用R实现一下
# 假设数据
data <- data.frame(
class = c('class1', 'class2', 'class3'),
TP = c(70, 50, 80),
FP = c(30, 10, 20),
FN = c(20, 30, 10),
TN = c(80, 110, 90)
)
# 计算微平均
micro_TP <- sum(data$TP)
micro_FP <- sum(data$FP)
micro_FN <- sum(data$FN)
micro_precision <- micro_TP / (micro_TP + micro_FP)
micro_recall <- micro_TP / (micro_TP + micro_FN)
micro_f1 <- 2 * (micro_precision * micro_recall) / (micro_precision + micro_recall)
# 计算宏平均
macro_precision <- mean(data$TP / (data$TP + data$FP))
macro_recall <- mean(data$TP / (data$TP + data$FN))
macro_f1 <- 2 * (macro_precision * macro_recall) / (macro_precision + macro_recall)
print(paste("Micro-averaged precision:", micro_precision))
print(paste("Micro-averaged recall:", micro_recall))
print(paste("Micro-averaged F1:", micro_f1))
print(paste("Macro-averaged precision:", macro_precision))
print(paste("Macro-averaged recall:", macro_recall))
print(paste("Macro-averaged F1:", macro_f1))
联系客服