sklearn中针对不同分类场景模型评估指标函数概述

1,737 阅读6分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

在sklearn中,sklearn.metrics 模块下实现了一些损失、评分和实用函数来衡量分类性能。某些指标可能需要正类(positive class)、置信度值(confidence values)或二元决策值(binary decisions values)的概率估计。并且大多数函数都实现了允许每个样本通过 sample_weight 参数提供对总分的加权贡献。

下面我们就来简单介绍下sklearn针对不同分类场景实现的模型评估指标函数。

适用于二分类场景的评估指标

下面是一些仅限于二分类场景下的函数说明:

函数描述
precision_recall_curve(y_true, probas_pred, *)根据不同概率阈值计算精确率召回率对。
roc_curve(y_true, y_score, *[, pos_label, …])计算ROC曲线。
det_curve(y_true, y_score[, pos_label, …])计算不同概率阈值下的错误率。

适用于二分类和多分类场景的评估指标

下面是一些也可以用于多分类场景下的函数说明(同时可以应用于二分类的场景):

函数描述
balanced_accuracy_score(y_true, y_pred, *[, …])计算平衡准确率。
在二分类和多类分类场景中,平衡准确率用来处理不平衡数据集的问题。它被定义为在每个类上获得的召回率的平均值。
cohen_kappa_score(y1, y2, *[, labels, …])计算Kappa系数,衡量评估者间一致性的统计数据。
confusion_matrix(y_true, y_pred, *[, …])计算混淆矩阵以评估分类的准确性。
hinge_loss(y_true, pred_decision, *[, …])计算平均铰链损失(非正则化)。铰链损失函数可用于“最大间隔(max-margin)”分类,其最著名的应用是作为SVM的损失函数。
matthews_corrcoef(y_true, y_pred, *[, …])计算马修斯相关系数 (MCC)。
top_k_accuracy_score(y_true, y_score, *[, …])计算TOP_k的准确率,该指标计算正确标签在预测的前 k 个标签中的次数(按预测分数排名)。 请注意,此处未涵盖多标签情况。

适用于二分类、多分类和多标签场景的评估指标

下面是一些还可以应用于多标签场景下的函数说明(同时可以应用于二分类和多分类的场景):

函数描述
accuracy_score(y_true, y_pred, *[, …])计算准确率。
classification_report(y_true, y_pred, *[, …])构建显示主要分类指标的文本报告。
f1_score(y_true, y_pred, *[, labels, …])计算F1F1值。
fbeta_score(y_true, y_pred, *, beta[, …])计算Fβ F_{\beta}值。
hamming_loss(y_true, y_pred, *[, sample_weight])计算平均汉明损失。
jaccard_score(y_true, y_pred, *[, labels, …])计算Jaccard 相似系数。
log_loss(y_true, y_pred, *[, eps, …])计算对数损失,也称为逻辑损失或交叉熵损失。
multilabel_confusion_matrix(y_true, y_pred, *)计算每个类或样本的混淆矩阵。
precision_recall_fscore_support(y_true, …)计算每个类的精确率、召回率、F值和真实值中每个类别出现的次数。
precision_score(y_true, y_pred, *[, labels, …])计算精确率。
recall_score(y_true, y_pred, *[, labels, …])计算召回率。
roc_auc_score(y_true, y_score, *[, average, …])根据预测分数计算ROC 曲线下的面积 (AUC) 。
zero_one_loss(y_true, y_pred, *[, …])计算0-1损失,适用于分类问题。

适用于二分类和多标签分类场景的评估指标

还有一些应用于二分类和多标签分类场景的函数说明(但不能应用于多分类的场景):

函数描述
average_precision_score(y_true, y_score, *)根据预测分数计算平均精确率(AP),该值介于0到1之间,值越高越好。

从二分类到多分类和多标签分类的一些说明

一些指标本质上是为二分类任务定义的(例如f1_scoreroc_auc_score)。默认情况下,仅评估正标签,我们假设默认情况下正类被标记为 1(尽管这可以通过 pos_label 参数进行配置)。

在将二分类评估指标扩展到多分类或多标签分类问题时,数据被处理为二分类问题的集合,每个类别都是集合中的一个元素。(即,多分类或者多标签分类都是基于二分类的集合,针对每个标签,都是一个二分类模型。比如有红、黄、蓝三个分类,如果红为正标签,黄、蓝则为负标签,基于此训练一个模型。如果黄为正标签,红、蓝则为负标签,基于此训练一个模型。)

sklearn中有许多方法可以对类集合中的二分类指标进行平均,每种方法在某些情况下都可能有用。在可用的情况下,您应该使用average参数在{macromicroweightedsamplesNone}中进行选择。

  • macro:宏平均,先分别计算将各类视作Positive情况下的分数,然后再求个平均(每个类赋予相等的权重)。在不常见的类仍然很重要的问题中,宏平均可能是突出其表现的一种手段。另一方面,假设所有类别都同等重要的情况下,这通常是不正确的,因为宏平均会过分强调不常见类别的表现。
  • weighted:加权平均,从上面我们知道宏平均存在的一个问题是这种计算方式未考虑到各类别不平衡情况,因为最后除的是类别数意味着每个类别都被视作平等,而可能有的类别预测数量很大,有的类别预测数量很小。加权评估就是对此进行改进,每个类别计算出的分数的权重不再是1/类别数,而是在y_true中每个类别所占的比例。
  • micro:微平均,计算 Precision 与 Recall 时会将所有类直接放到一起来计算。以精确率为例,计算时,先以各类作为Positve时的预测正确TP的和再除以以各类作为Positve时的TP+FP的和。微平均通常被用于多标签分类场景,或者一个多数的类被忽略的多分类场景。
  • samples:样本平均,仅适用于多标签分类问题。它不计算每个类的指标,而是计算评估数据中每个样本的真实类和预测类的指标,并返回它们的平均值。
  • None:当average=None时, 将返回一个包含每个类的分数(精确率、召回率等)的数组。

除此之前,针对二分类模型,average参数还可以选择binary

average=binary情况下,要求输入中的y_truey_pred都是二值的(仅包含0和1),并涉及到评分函数的另一个参数pos_labelpos_label即指定视作positive_label的值,默认取1,即默认把1视作positiveaverage=binary就是仅计算指定pos_label的精确率、召回率等。

备注:

当多分类数据提供度量时,如目标值为二类,通常类标签作为一个数组,而对于多标签数据,则被指定为一个指示器矩阵,其中,如果样本 i 具有标签 j,则单元格 [i, j] 的值为1,否则值为0。

参考文档