分享

机器学习模型评价中的宏平均和微平均,用Python和R实现

 脑系科数据科学 2024-02-25 发布于瑞士

各位学友大家好,医院死气沉沉的很无奈。今天外院的老师问我关于宏平均和微平均,这里给大家总结一下:

在机器学习中,尤其是在处理分类问题时,交叉验证是一种常用的评估模型性能的方法。当我们处理多分类问题时,经常会使用到宏平均(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))

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多