模型选择与评价(三)

本章介绍在分类和回归问题中,如何量化预测质量。介绍一些指标以及scikit-learn中的实现。

Scikit中有三种不同的方式来评估模型的预测能力:

估计器得分函数(Estimator score moethod):估计器有一个方法,提供缺省的评价标准,这些方法不在本章的讨论之列,可以查阅各个估计器的文档来了解。

评分参数(Scoring parameter):使用交叉验证(比如Cross_val_score和model_selection.GridSearchCV)作为模型评价工具时,通过指定参数来指定内部打分策略。这个会在本章第一节中介绍。

指标函数(Metric functions):模块实现了为特定目的来评估预测误差的函数。本章的第二节、第三节、第四节分别介绍分类、多标签、回归的指标函数。

最后,第六节会介绍虚拟估计器(Dummy estimators),它对获得随机预测指标的基准值很有用。

1 参数:定义模型评价规则

模型选择与评价的工具,比如和, 使用一个参数控制使用什么指标来做估计器的评价。

1.1 常见场景: 预定义值

在大多数场景中,可以通过参数来指定一个打分对象;下面列表中列出了所有的值。

所有这些打分对象按照惯例都是分数越高代表效果越好。因此,有些测量模型与数据间距离的打分对象,比如,就一定有其负值的形式。

使用案例:

列出所有的打分对象:

1.2 通过 metric 函数定义自己的打分策略

模块,公开了一组简单的函数,给这些函数提供真实值和预测值,可以用来量化预测误差:

以结尾的函数,返回值越大,说明效果越好;

以或者结尾的函数,返回值越小越好;

当使用定制自己的打分策略时,需要通过参数来声明这个策略的得分与模型效果的关系(缺省是,代表这个分数越大,模型效果越好)

很多指标(metrics)不能通过来指定,因为有些评分函数需要一些参数,比如。这种情况下,就需要生成一个合适的打分对象。最简单的方式,可以通过函数来生成一个可调用对象,这个函数可以将指标(metrics)转化成可调用对象,提供给模型做评价。

一个典型的方式就是通过包装一个已经存在的指标函数(metric function),并给其参数赋值。就比如函数的参数:

另一种方式是通过函数,使用Python函数完全自定义这个打分对象(scorer object),需要以下几个步骤:

要使用的Python函数(下例中的);

这个函数是一个还是,即是还是;

对于分类(classification)使用的指标:还需要指明是否需要连续的判定确定性(continuous decision certainties);

所有额外的参数,比如函数函数的和参数。

下面就是一个定制打分函数的例子,使用了参数:

1.3 实现自己的打分对象

你也可以从头开始生成更加灵活的模型打分器,而不需用使用方法。只需要满足如下两条准则:

它可以通过参数来调用,是要评估的模型,与分别是测试集的特征和标签;对于非监督学习,可以没有。

它返回一个浮点数,这个浮点数根据来量化在上作出预测的质量。同样的,一般情况下,数字越大代表效果更好,如果返回的是,那么需要取负数。

1.4 使用多个指标评价

Scikit-learn 也允许在,和中使用多个评价指标。

有两种为参数指定多个打分指标的方法:

作为包含字符串指标的迭代器::

作为一个字典,为打分器名称,为打分函数::

注意:既可以是打分函数,也可以是预定义的指标字符串(参见本章1.1节)。

目前,只有那些返回一个分数的打分函数可以通过字典的方式来传参。返回多个值得打分函数不允许直接这样使用,需要一个包装器,来返回单一指标:

2 分类指标

模块中,实现了一些,和函数来度量分类性能。某些指标可能需要正类的概率估计、置信值、二进制决策值。大多数实现允许通过(样本权重)参数为每个样本指定(加权贡献)从而得到(总体得分)。

其中一些指标只能用于二分类:

一些可以用于多分类:

一些可以用于多标签问题(ultilabel case):

一些可以用于二分类和多标签问题(但不能用于多分类):

在下面的小节中,将会详细介绍以上列举出的函数。

2.1 二分类 到 多分类 再到 多标签

一些指标本质上是为二分类问题而定义的(比如,,。在这些场景中,默认只会评估正标签(positive label),正标签一般标记为(当然,可以通过参数进行设置)。

将二分类指标(binary metric)扩展为多类()或多标签()问题时,数据将被视为二分类问题的集合(即每个类本身为一类,其它所有类作为一个大类)。这样,有多少个类,就会有多少个二分类问题。而每个二分类问题都可以单独计算指标。需要基于这些指标来做一个“平均”(Average),“平均”的方式有多种,可以通过参数来指定:

(宏) 简单的计算所有二分类指标的均值,每一类的权重相同。有些类,虽然频率低(即这一类的样本比例低)但却比较重要,那么这是一种突出低频类的方法;反之,所有类都同样重要的假设通常是不成立的,所以这种方式会过分强调低频类的低性能表现。

(加权)根据每一类的样本比例对指标得分进行加权,再取平均。

(微)这种方式将不区分类别和样本,而是以每个 对作为计算总体指标的粒度。

(样本)仅适应于多标签问题。它不安类别来计算,而是根据每个样本的真实和预测类别来计算指标,最后返回加权平均。

不做“平均处理”而是每个类都返回一个

多分类数据提供给指标函数的数据是类标签的一维数组,而多标签数据需要提供指示矩阵,比如的值为表示样本有标签,如果值为则代表没有。

2.2 正确率得分

注意:本文中的正确率指“accuray”;准确率指“precision”。这两个概念比较容易混淆。

函数可以计算精正确率,当其参数为时返回的是正确预测的个数,当为时(这是缺省值),返回的是正确预测的百分比。

在多标签分类问题中,这个函数会返回子集(即每个样本对应的多个标签)正确率。只有预测标签集与真正的样本标签集完全一致,才认为是正确的,否则就是错误。

赋值为False,则返回正确预测的个数:

2.3 卡帕系数(Cohen’s kappa)

函数函数可以计算卡帕系数。这个度量值是用来对不同的人工标注做一致性检验的,当然也可以对分类器预测值与真实值作比较。

卡帕系数取值介于 -1~1。高于0.8认为几乎完全一致;低于0被认为没有一致性。

卡帕系数可以用来度量二分类或多分类问题,但不能用来度量多标签问题(除非只针对某一个标签):

2.4 混淆矩阵

函数通过混淆矩阵的方式来评估分类正确率

下图是一个三分类问题的混淆矩阵可视化图:

对于二分类问题,混淆矩阵计算结果对应以下四个指标:

借此说明下正确率(accuracy)和准确率(precision)

如下:

2.5 分类报告

函数可以生成一个文本的报告,来展示主要的分类指标。

用来指定类别的标签名,这里假设是一个“水果分类”问题: 0 表示“苹果”;1 表示 “梨”;2 表示“橘子”:

2.6 汉明损失(Hamming loss)

函数计算两个集合中每个对应元素的汉明距离(hamming distance)并取均值。

在多标签场景中(这里以二标签为例):

Note:在多分类问题中(包括二分类),汉明损失与零一损失(Zero one loss)相同。但是在多标签问题中,两者有所区别,零一损失要求一个样本的标签集合完全匹配,但是汉明损失计算的粒度是细化到每个标签。因此,可以认为零一损失是汉明损失的一个特例,汉明损失的区间是[0,1],而零一损失取值集合是

2.7 Jaccard 相似系数得分

函数计算每对标签集(一个是样本真实标签集,一个是预测标签集)的Jaccard相似系数,再累加取均值。

在二分类和多分类问题中,Jaccard相似系数等同于正确率。

以上是统计比例,下面是统计数量:

多标签场景(以二标签为例):

2.8 准确率,召回率和F度量(Precision, recall and F-measures)

直观上,准确率是分类器预测为正类的样本中,真正的正类所占比例;召回率是分类器预测为正类样本中,真正的正类占样本中所有正类(包括被预测为正类以及未被预测为正类的)的比例。

注意:函数只能用于二分类场景。函数只能用于二分类和多标签指示场景。

以下是几个可以用来分析准确率、召回率以及F度量的函数:

注意:函数只适用于二分类场景。只适用于二分类或多标签场景。

2.8.1 二分类

在二分类问题中,术语和指的是分类器的预测结果,而术语和是指预测的结果与观测值是否一致。有了这些定义之后我们可以指定下表:

在这个前提下,我们就可以定义准确率(precision)、召回率(recall)和F度量(F-measure):

2.8.2 多分类和多标签

在多分类和多标签问题中,准确率、召回率和F度量可以独立地应用于每个标签。有几种将各个标签的结果结合在一起的方法,上面提到的(只用于多标签问题)、、、、和这些函数都可以通过参数来指定结合的策略。

注意:的方式在包含所有标签的多分类问题中,会产生相同的精度、召回率和F,但是的方式产生的F值,不会在准确率和召回率之间。

举一个例子,有如下定义:

那么可以有以下指标:

多分类问题中,可以排除一些标签:

同样的,数据中没有的标签,在方式时,也会被计算进去:

2.9 Hinge loss

函数计算模型与数据hinge loss的平均值。hinge loss是一种只考虑预测误差的单向指标。hinge loss 通常用于“最大间隔”分类器上,比如典型的SVM。

如果标签使用和编码, y是正确值, w是决策函数的预测值,那么 hinge loss的定义如下:

下面是一个例子,使用SVM做二分类问题,并且用hinge_loss做评价参数:

下面是一个SVM做多分类问题,并使用hinge_loss做评价的例子:

2.10 Log损失

Log loss,又被称为logistic regression loss(logistic 回归损失)或 cross-entropy loss(交叉熵损失),是在概率估计上定义的。通常用在(多项式)logistic回归和神经网络上,也用在EM(expectation-maximization即期望最大化)的一些变体中,并且可以用来评估分类器的概率输出(probability outputs)而不是其离散预测(discrete predictions)。

函数通过给定的真实标签列表和概率矩阵计算log loss:

中的第一个元素表示第一个样本90%的概率,其标签为0。Log损失是非负的。

2.11 马修斯相关系数 (Matthews correlation coefficient)

函数计算二分类问题的马修斯相关系数(MCC)。WikiPedia中描述如下:

当多于两个标签时,MCC的取值区间就不再是[-1,+1]。最小值会位于-1到0之间,取决于样本真实标签的数量和分布。最大值依然是+1。

下面是使用马修斯相关系数的例子:

2.12 受试者工作特征(Receiver operating characteristic )ROC

函数计算ROC曲线(receiver operating characteristic curve)。Wikipedia的描述如下:

这个函数需要真实的二分值(binary value)和目标分数,目标分数可以是正类的概率估计、置信度或者二分决策值(binary decisions)。

下面是如何使用这个函数的例子:

下图是ROC曲线示例图:

函数计算ROC曲线下的面积,记作AUC或AUROC。通过计算曲线下的面积,ROC曲线的信息就可以归结为一个数值:

在多分类问题中,函数通过在所有标签上取平均来扩展。

与子集正确率(subset accuracy)、汉明损失(Hamming loss)或F1相比,ROC不需要优化每个标签的阈值。在多分类问题中,只要预测输出是二值化(binarized)的,就可以使用函数。

2.13 零一损失(Zero one loss)

函数计算所有样本的零一损失的和或平均值。默认情况下,函数会在样本上做标准化。如果要得到零一损失的和,则需要设置参数为。

在多标签场景中,零一损失会严格匹配标签集,只有完全匹配才会打分为1,否则为0。函数默认会返回不完美匹配的百分比。如果将参数设置为,那么会返回不完美匹配的个数。

如下:在具有二分标签指示符(binary label indicators)的多标签场景中,第一个标签集[0, 1]不完全匹配:

2.14 Brier分数损失

函数计算二分类问题的的Brier分数。引用Wikipedia:

这个函数会计算真实值与预测概率的均方差。二分类实际最终的结果应该是1或0(真或假),但是概率预测值则是[0, 1]之间取值。

Brier分数的取值区间也是[0,1],分数越小代表预测的精确度越好。可以认为它是“校准”概率预测的一种度量。

3 多标签排名指标

在多标签问题中,每个样本可以关联任意数量的真实标签。目标是给真实标签更高的评分和更好的排序。

3.1 涵盖误差

函数计算在所有标签都被正确预测情况下的平均数。如果想知道不漏掉任何一个真实标签的情况下,需要预测多少top评分标签,这个指标会很有用。这个指标的最佳值是真实标签数量的平均值。

下面是一个例子:

3.2 标签排名平均精度(Label ranking average precision)

函数函数实现了标签排名平均精度(LRAP)。这个指标与有一定联系,不同点在于用标签排名(label ranking)代替了准确率和召回率。

如果能给样本所关联的标签更好的排序那么这个指标就会越好。这个指标严格大于0,最佳值是1。如果每个样本都只有一个标签,那么LRAP与排名倒数均值(mean reciprocal rank)等价。

下面是一个用例:

3.3 排序损失(Ranking loss)

函数,计算样本中不正确排序标签对的数量均值。

4 回归指标

模块实现了一些用来度量回归质量的损失(loss)、得分(score)和 公用函数。并且其中一些得到了加强,可以应用于多输出的场景,如:,,和。

这些函数有一个的参数,可以用来指定对于每个目标的得分(score)或者损失(loss)做平均的方式。缺省情况下赋值为,表示对输出均匀加权平均;如果赋值为一个与目标输出相同维度的数组,那么会被认为是为每个输出指定权重,会根据这个权重来做加权平均;如果赋值为,那么将不会取平均,而是每个输出对应一个返回,会返回一个与输出相同维度的数组。

在和这两个函数上,参数还有另一种取值。效果是每个输出的权重是其对应目标变量的方差。这个设置可以量化全局捕获的未缩放方差。如果目标变量的维度不一致,那么这个设置的效果是让维度高的目标权重更高。

函数的默认值就是。

4.1 可释方差得分(explained variance score)

函数计算可释方差回归得分。

最佳值是1.0,值越小,说明质量越差。

下面是的用例:

4.2 平均绝对值误差(mean absolute error)

函数,计算平均绝对值误差。

下面是的一个用例:

4.3 均方误差

函数计算均方误差。

下面是的一个用例:

4.4 均方对数误差(Mean squared logarithmic error)

计算平方对数误差的期望。

4.5 中值绝对误差

对离群值具有鲁棒性。它会取预测值与真实值绝对误差的中位数。

下面是的一个用例:

函数计算决定系数。用来度量样本可以被模型解释的程度。最佳值是1.0,也可以为负数。一个模型,如果对于所有的输入特征都只返回真实样本输出的期望值(也就是y的期望值),那么他的决定系数是0.0。

下面是的一个用例:

5 聚类指标

中实现了一些用于度量距离质量的指标。会在聚类一章中结合聚类算法来介绍。

6 虚拟估计

在做监督学习时,会将一个模型与简单的经验性法则作比较,来做合理性检查。

实现了几个简单的分类策略:

根据训练集中的类别分布生成随机预测;

将训练集中出现频率最高的标签作为所有预测的结果;

总是依据最大化类先验来预测(比如)

均匀的生成随机预测(不考虑训练集的类别分布);

生成给定的常量值;一般用于少数类的评价指标时。

以上所有的策略都会忽略输入的特征数据。

为了说明,首先创建一个不平衡的数据集:

接下来比较和的正确率:

可以看到, 并不比好多少,现在换一下核函数:

可以看到,换了核函数后,准确率有了大的提升。在CPU足够的情况下,建议使用交叉验证来最优化估计器超参数。

如果一个分类器的准确率与随机生成的效果差不多,那么说明这个监督学习的过程可能有问题:特征无效;没有调优估计器超参数;类别分布不均匀等。

也实现了四个简单的经验法则来进行回归:

总是以训练目标的均值作为预测结果;

总是以训练目标的中位数作为预测结果;

总是以训练目标的某个分位数(通过参数指定)作为预测结果;

总是以一个常量(通过参数给定)作为预测结果;

同一样也会忽略输入数据(或者说其输出与输入的特征数据无关)。

参考:

http://scikit-learn.org/stable/modules/model_evaluation.html#classification-metrics

https://blog.csdn.net/chaipp0607/article/details/76037351

https://blog.csdn.net/AI_focus/article/details/78339234?locationNum=4&fps=1

https://blog.csdn.net/jasonzzj/article/details/52017438

https://baike.baidu.com/item/ROC%E6%9B%B2%E7%BA%BF/775606?fr=aladdin

https://en.wikipedia.org/wiki/Coverage_error

http://scikit-learn.org/stable/modules/generated/sklearn.metrics.coverage_error.html#sklearn.metrics.coverage_error

https://blog.csdn.net/lipe12/article/details/51200510

https://en.wikipedia.org/wiki/Explained_variation

https://baike.baidu.com/item/%E5%86%B3%E5%AE%9A%E7%B3%BB%E6%95%B0/10840924?fr=aladdin

https://en.wikipedia.org/wiki/Coefficient_of_determination

http://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html#sklearn.dummy.DummyClassifier

https://blog.csdn.net/luo123n/article/details/50754104

欢迎指正

yuefeng_liu@foxmail.com

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180618G0YFBH00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券