本章介绍在分类和回归问题中,如何量化预测质量。介绍一些指标以及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
领取专属 10元无门槛券
私享最新 技术干货