当前位置:   article > 正文

sklearn gridsearchcv_使用python+sklearn实现度量和评分

sklearn0.2 gridsearchcv 分类评分
有3种不同的API可用来评估模型预测的质量:
  • 估计器评分方法:估计器提供了一种score方法,该方法为其要解决的问题提供默认的评估标准。在此章节上没有讨论该方法的使用,但每个估计器的文档章节中都对此方法进行了讨论。
  • 评分参数:使用交叉验证(例如 model_selection.cross_val_score和 model_selection.GridSearchCV)的模型评估工具依赖于一个内部评分策略。这在“评分参数:定义模型评估规则”的章节中进行了讨论。
  • 度量函数metrics实现了一些函数用于以某种特殊目的评估模型预测误差。这些度量指标在分类度量,多标签排名(Multilabel ranking)度量,回归度量和聚类度量的各章节中都有详细的介绍。
最后,虚拟估计器(Dummy estimators)可以用来获取这些度量的基准值,这对进行随机预测很有用。 也可以看看: 对于“成对”度量指标,是在样本之间的而不是在估计量或者预测值之间,请参阅成对度量,亲和力(Affinities)和内核部分。

1. scoring 参数:定义模型评估准则

模型选择和评估使用工具,例如 model_selection.GridSearchCVmodel_selection.cross_val_score ,接受一个 scoring 参数,该参数控制着估计器的评估过程中使用什么样的度量指标。

1.1. 一般情况: 使用预定义的值

对于最常见的用例,您可以为 scoring 参数指定一个评分器对象(scorer object)。下表显示了所有可能的值。所有评分器对象均遵循以下约定:较高的返回值优先于较低的返回值。因此,度量模型和数据之间的距离度量指标,例如 metrics.mean_squared_error 可以作为neg_mean_squared_error,返回变负的指标值。

ad0611e76bd59135ed5e75c3004f9687.png

用法案例:
>>> from sklearn import svm, datasets>>> from sklearn.model_selection import cross_val_score>>> X, y = datasets.load_iris(return_X_y=True)>>> clf = svm.SVC(random_state=0)>>> cross_val_score(clf, X, y, cv=5, scoring='recall_macro')array([0.96..., 0.96..., 0.96..., 0.93..., 1.        ])>>> model = svm.SVC()>>> cross_val_score(model, X, y, cv=5, scoring='wrong_choice')Traceback (most recent call last):ValueError: 'wrong_choice' is not a valid scoring value. Use sorted(sklearn.metrics.SCORERS.keys()) to get valid options.
注意: 通过ValueError异常列举出来的那些值对应于度量预测精度的函数,它们会在下面的小节中介绍。用于这些函数的评分器对象被存放在 sklearn.metrics.SCORERS 字典中。

1.2.利用度量函数metric自定义评分策略

sklearn.metrics 模块还提供了一组简单的函数,当给定真值和预测值的时候用来度量一个预测错误:
  • _score结尾的函数返回一个值进行最大化,该值越高代表预测越好。
  • _error_loss结尾的函数返回一个值进行最小化,值越低代表预测越好。当我们使用函数make_scorer把这种越小越好的度量转换成评分对象的时候,就需要设置参数greater_is_better为False(这个参数默认是True,对这个参数下面还会解释)。
以下各节详细介绍了可用于各种机器学习任务的度量指标。 许多度量(metrics)指标没有被命名以使得它们被用作 scoring 值,有时是因为它们需要额外的参数,例如 fbeta_score 。在这种情况下,您需要生成一个适当的评分对象,最简单方法是调用 make_scorer 生成一个用于评分的可调用对象。该函数将度量(metrics)指标转换为可用于模型评估的可调用对象。 一个典型的用法是从库中封装一个已经存在的具有非默认值参数的度量(metric)函数,例如 fbeta_score 函数的 beta 参数:
>>> from sklearn.metrics import fbeta_score, make_scorer>>> ftwo_scorer = make_scorer(fbeta_score, beta=2)>>> from sklearn.model_selection import GridSearchCV>>> from sklearn.svm import LinearSVC>>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]},...                     scoring=ftwo_scorer, cv=5)
第二个用法是使用 make_scorer ,从一个简单的python函数构建一个完全自定义的评分对象,该函数可以接收多个参数:
  • 您想使用的python函数(下面的示例中的my_custom_loss_func )
  • 您的python函数返回分数(greater_is_better=True默认值)还是损失(loss)(greater_is_better=False)。如果损失(loss),则评分器对象对python函数的输出取负号,这符合交叉验证约定,即评分器返回越高的值预测越好。
  • 如果你要定义的是一个分类评分度量(metrics),还要确认您的python函数是否具有连续的决策确定性(decision certainties) (needs_threshold=True)。默认值为False。
  • 任意的附加参数,例如f1_score函数中的betalabels
下面是构建一个自定义评分器的例子,并且使用了参数 greater_is_better
>>> import numpy as np>>> def my_custom_loss_func(y_true, y_pred):...     diff = np.abs(y_true - y_pred).max()...     return np.log1p(diff)...>>> # score将会对my_custom_loss_func函数的返回值取反,>>> # 这将会是 np.log(2), 也就是0.693。>>> # X 和 y 的值的定义在下面。>>> score = make_scorer(my_custom_loss_func, greater_is_better=False)>>> X = [[1], [1]]>>> y = [0, 1]>>> from sklearn.dummy import DummyClassifier>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)>>> clf = clf.fit(X, y)>>> my_custom_loss_func(clf.predict(X), y)0.69...>>> score(clf, X, y)-0.69...

1.3. 实现自己的评分对象

您可以从头开始构建自己的评分对象,而无需使用 make_scorer 来生成更加灵活的模型评分器(model scorers)。如果一个python可调用对象被叫做评分器(scorer),那么它需要符合以下两个规则所指定的协议:
  • 可以使用参数(estimator, X, y)来调用它,其中estimator是要被评估的模型,X是验证数据,y是真实目标变量 (在有监督情况下)或None(在无监督情况下)。
  • 它返回一个浮点数,该浮点数作为参考来量化estimator的预测质量。同样,按照惯例,越高的数字越好, 所以如果您的评分器(scorer)返回损失(loss),那么这个返回值应该被取负号 。
注意: 在n_jobs > 1的函数中使用自定义评分器 虽然在定义调用函数的同时,自定义评分函数应该与默认的joblib后端(loky)一起使用,但从另一个模块导入它将会是更可靠的方法,并且它是独立于joblib后端工作的。 例如,在下面的示例中,要给 n_jobs 传入一个大于1的值, custom_scoring_function 函数将保存在用户创建的模块( custom_scorer_module.py )中并可以这样导入:
>>> from custom_scorer_module import custom_scoring_function >>> cross_val_score(model,...  X_train,...  y_train,...  scoring=make_scorer(custom_scoring_function, greater_is_better=False),...  cv=5,...  n_jobs=-1)

1.4. 使用多度量(metric)指标评估

Scikit-learn还允许在 GridSearchCVRandomizedSearchCVcross_validate 中进行多度量指标的评估。 这有两种方法可以为 scoring 参数指定多个评分指标:
  • 把多个度量(metrics)指标的名字以字符串列表的方式作为参数传给scoring:
>>> scoring = ['accuracy', 'precision']
  • 以字典的形式把评分器的名称映射到评分函数上,然后把该字典作为参数传给scoring:
>>> from sklearn.metrics import accuracy_score>>> from sklearn.metrics import make_scorer>>> scoring = {'accuracy': make_scorer(accuracy_score),...            'prec': 'precision'}
要注意的是字典的值既可以是评分函数也可以是sklearn预定义的度量(metric)指标的名字字符串。 目前,只有那些返回单个得分值的评分函数可以被传到字典中,那些有多个返回值的评分函数不被允许传入。如果非要这么做的话,必须对其进行封装使其只有单个返回值:
>>> from sklearn.model_selection import cross_validate>>> from sklearn.metrics import confusion_matrix>>> # 一个简单的toy二分类数据集>>> X, y = datasets.make_classification(n_classes=2, random_state=0)>>> svm = LinearSVC(random_state=0)>>> def tn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 0]>>> def fp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 1]>>> def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 0]>>> def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 1]>>> scoring = {'tp': make_scorer(tp), 'tn': make_scorer(tn),...            'fp': make_scorer(fp), 'fn': make_scorer(fn)}>>> cv_results = cross_validate(svm.fit(X, y), X, y, cv=5, scoring=scoring)>>> # 获得测试集true positive的得分>>> print(cv_results['test_tp'])[10  9  8  7  8]>>> # 获得测试集false negative的得分>>> print(cv_results['test_fn'])[0 1 2 3 2]

2. 分类问题的度量指标

sklearn.metrics 模块实现了多种损失(loss),评分(score)和工具(utility)函数,来度量分类器性能。一些度量指标可能需要对正类(positive class),置信度值(confidence values)或二元决策值(binary decisions values)进行概率估计。大多数实现都允许每个样本通过 sample_weight 参数为整体得分(overall score)提供加权贡献(weighted contribution)。 这里面的一部分度量指标仅仅限于在二分类的情况下使用:

8bbf273efcf65acfd432a9368bd977a9.png

下面这些既能在二分类中用也能够用于多分类的情况:

6c31bb8d954f9f50b80d36f4b1e445f1.png

下面的这些还可以用在多标签分类中:

2494a92a0b43264e5613eee632081387.png

下面的这些指标可以用在二分类和多标签(不是多分类)问题中:

9cff56066f80d5d71bd71b80de2e6cad.png

2.1.  从二分类问题到多类或多标签问题 在下面的小节中,我们会逐个讲解这些函数,包括一些常用API的注解和度量指标的数学定义。 有些度量指标基本上是为二分类任务所服务的(例如 f1_scoreroc_auc_score )。在这些情况下,默认情况下仅评估正类(positive label),假定把正类标记为 1 (尽管可以通过 pos_label 参数进行配置)。 将二分类指标扩展应用于多分类或多标签问题时,数据将被视为二分问题的集合,每个类都有一个二分类指标,然后可以使用多种策略在整个类中计算所有二分类指标的平均值,这些不同的计算平均值的策略在某些特定场景中可能会用到。如果可用,您应该使用 average 参数来选择某个平均策略。
  • "macro"简单地计算二分类指标的平均值,赋予每个类别相同的权重。在不常见的类别是重要的问题上,宏观平均(macro-averaging)可能是突出其性能的一种方法。另一方面,所有类别同样重要的假设通常是不真实的, 因此宏观平均(macro-averaging)将过度强调不常见的类别的典型的低性能。
  • "weighted"通过计算其在真实数据样本中的存在来对每个类的得分进行加权的二分指标平均值来计算类不平衡。
  • "micro" 使每个样本类别对总体指标的贡献均等(样本权重的结果除外),不是将每个类别的度量指标求和,而是将构成每个类别指标的红利(dividends)和除数求和,计算总体商。在多标签设置中,宏观平均可能是优先选择的,包括要忽略多数类的多分类。
  • "samples"仅适用于多标签问题。它不计算每个类别的指标,而是计算评估数据中的每个样本的真实和预测类别的指标,并返回加权平均。
  • 选择average=None将返回一个数组与每个类的得分。
虽然将多类数据作为一个类标签数组(array of class labels)提供给度量指标,就像二分类目标一样,但如果多标签数据指定为标识矩阵(indicator matrix),其中如果样本 i 具有标号 j ,则 [i, j] 具有值1,否则为值0。

2.2. 准确度得分(Accuracy score)

accuracy_score 函数计算准确度,也就是计算正确预测的比例(默认)或数量(normalize=False)。 在多标签分类中,该函数返回子集的准确度。对某个样本的预测标签的整个集合与该样本真正的标签集合严格匹配,那么子集准确率就是1.0,反之,子集准确率为0.0。 如果是第个样本的预测值,并且_是对应的真实值,则在个样本上估计的正确预测的比例的定义如下: 其中,是指标函数。
>>> import numpy as np>>> from sklearn.metrics import accuracy_score>>> y_pred = [0, 2, 1, 3]>>> y_true = [0, 1, 2, 3]>>> accuracy_score(y_true, y_pred)0.5>>> accuracy_score(y_true, y_pred, normalize=False)2
在多标签的情形下,比如每个样本需要预测两个标签:
>>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))0.5
示例:
  • 有关使用数据集的排列准确度得分用法的案例,请参阅测试排列对分类得分的重要性。

2.3. 平衡准确度得分(Balanced accuracy score)

balanced_accuracy_score 函数计算平衡准确度,从而避免对不平衡数据集进行过高的性能估计。它是每个类别的召回得分的宏观平均值,或者是原始准确度,其中,每个样本均根据其真实类别的逆向流行度(inverse prevalence)进行加权。因此,对于平衡的数据集,该函数的得分与准确度得分是相等的。 在二分类情况下,平衡准确度等于灵敏度 (真正率(rue positive rate))和特异性(真负率(true negative rate))的算术平均值 ,或者等于用二分类的预测结果而非分数的ROC曲线下的面积。 如果分类器在两个类上都表现的一样好,该函数就会退化为传统的准确度(即正确预测数量除以总的预测数量)。 作为对比,如果传统的准确度比较好,仅仅是因为分类器利用了一个不均衡测试集,此时平衡准确度将会近似地下降到。 得分的范围是0到1,或者当使用 adjusted=True 时,得分范围会被缩放到从到1(包括1),随机条件下得分为0。 如果是第个样本的真值,并且是对应的样本权重,然后我们调整样本权重到: 其中,是指标函数。给定样本的预测值,平衡准确度定义为: 使用 adjusted=True ,平衡准确度报告了来自的相关增加。在二分类情况下,这也称为* Youden's J statistic *或informedness。 **注意:**这里的多类定义似乎是二分类中使用的度量指标的最合理扩展,尽管在文献中还没有达成共识:
  • 我们的定义:[Mosley2013],[Kelleher2015]和[Guyon2015],其中 [Guyon2015]采用调整后的版本,以确保随机预测的得分为0,完美的预测得分为1..
  • [Mosley2013]中所描述的类平衡准确度:计算每个类的准确度和召回率之间的最小值。然后将这些值在全部的类上取平均值,以获得平衡准确度。
  • [Urbanowicz2015]中所描述的平衡准确度:计算每个类别的敏感性和特异性的平均值,然后在全部的类上取平均值。
参考文献: Guyon2015(1,2) I. Guyon, K. Bennett, G. Cawley, H.J. Escalante, S. Escalera, T.K. Ho, N. Macià, B. Ray, M. Saeed, A.R. Statnikov, E. Viegas, Design of the 2015 ChaLearn AutoML Challenge, IJCNN 2015. Mosley2013(1,2) L. Mosley, A balanced approach to the multi-class imbalance problem, IJCV 2010. Kelleher2015 John. D. Kelleher, Brian Mac Namee, Aoife D’Arcy, Fundamentals of Machine Learning for Predictive Data Analytics: Algorithms, Worked Examples, and Case Studies, 2015. Urbanowicz2015 Urbanowicz R.J., Moore, J.H. ExSTraCS 2.0: description and evaluation of a scalable learning classifier system, Evol. Intel. (2015) 8: 89.

2.4. Cohen的kappa(Cohen’s kappa)

cohen_kappa_score 函数计算cohen_kappa_score的统计信息。这个度量指标旨在比较由不同人类标注者给出的标签,而不是去比较分类器预测和真值。 kappa得分(请参阅文档)是一个介于-1到1之间的数字,得分超过0.8通常被认为是好的一致(good agreement),得分为0或者小于0意味着不一致(no agreement)。 Kappa得分既可以用于二分类也可用于多分类,但是不能用于多标签问题,并且不能针对两个以上的注释器(annotators)进行计算该得分。
>>> from sklearn.metrics import cohen_kappa_score>>> y_true = [2, 0, 2, 2, 0, 1]>>> y_pred = [0, 0, 2, 2, 0, 2]>>> cohen_kappa_score(y_true, y_pred)0.4285714285714286

2.5. 混淆矩阵(Confusion matrix)

confusion_matrix 函数通过计算混淆矩阵来评估分类结果的准确度。混淆矩阵的每一行对应于真实类< https://en.wikipedia.org/wiki/Confusion_matrix >(维基百科和其他参考文献可能对轴(axes)有不同的约定。) 根据定义,在混淆矩阵中,中存储着实际上应该在组中的观测,但是却被预测到了组里面去的这些观测的数量。这里有一个例子:
>>> from sklearn.metrics import confusion_matrix>>> y_true = [2, 0, 2, 2, 0, 1]>>> y_pred = [0, 0, 2, 2, 0, 2]>>> confusion_matrix(y_true, y_pred)array([[2, 0, 0],       [0, 0, 1],       [1, 0, 2]])
plot_confusion_matrix 可以用来直观地表示一个混淆矩阵,如混淆矩阵案例所示,它创建了下图: 830eae184916f717f2a241714439bf5d.pngnormalize 参数允许报告(report)比率而不是计数。可以用3种不同的方式对混淆矩阵进行归一化: 'pred''true''all' ,然后将计数除以每个列,行或整个矩阵的总和。
>>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]>>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]>>> confusion_matrix(y_true, y_pred, normalize='all')array([[0.25 , 0.125],       [0.25 , 0.375]])
对于二分类问题, 我们可以得到真负(true negatives),假正(false positives),假负(false negatives)和真正(true positives) 的数量:
>>> y_true = [0, 0, 0, 1, 1, 1, 1, 1]>>> y_pred = [0, 1, 0, 1, 0, 1, 0, 1]>>> tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()>>> tn, fp, fn, tp(2, 1, 2, 3)
示例:
  • 有关使用混淆矩阵评估分类器输出质量的案例,请参见混淆矩阵。
  • 有关使用混淆矩阵对手写数字进行分类的案例,请参阅手写数字识别。
  • 有关使用混淆矩阵对文本文档进行分类的案例,请参见使用稀疏特征对文本文档进行分类。

2.6. 分类报告(Classification report)

classification_report 函数生成一个文本报告,其中显示了主要的分类指标。这是一个带有自定义 target_names 标签和推断标签(inferred labels)的小示例:
>>> from sklearn.metrics import classification_report>>> y_true = [0, 1, 2, 2, 0]>>> y_pred = [0, 0, 2, 1, 0]>>> target_names = ['class 0', 'class 1', 'class 2']>>> print(classification_report(y_true, y_pred, target_names=target_names))              precision    recall  f1-score   support     class 0       0.67      1.00      0.80         2     class 1       0.00      0.00      0.00         1     class 2       1.00      0.50      0.67         2    accuracy                           0.60         5   macro avg       0.56      0.50      0.49         5weighted avg       0.67      0.60      0.59         5
示例:
  • 有关手写数字识别的分类报告用法的案例,请参阅识别手写数字。
  • 有关文本文档分类报告用法的案例,请参阅使用稀疏特征分类文本文档。
  • 有关使用嵌套交叉验证的网格搜索的分类报告用法案例,请参阅使用带有交叉验证的网格搜索进行参数估计。

2.7. 汉明损失(Hamming loss)

hamming_loss 计算两组样本之间的平均汉明损失或汉明距离。 如果是给定样本的第个标签的预测值,_是对应的真值,是类或标签的数量,则两个样本之间的汉明损失定义如下: 其中,是指标函数。
>>> from sklearn.metrics import hamming_loss>>> y_pred = [1, 2, 3, 4]>>> y_true = [2, 2, 3, 4]>>> hamming_loss(y_true, y_pred)0.25
在多标签情况下,假如每个样本有两个标签:
>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))0.75
注意: 在多分类中,汉明损失相当于 y_truey_pred 之间的汉明距离,这于零一损失(Zero one loss)函数类似。但是,虽然零一损失惩罚的是不与真值集合严格匹配的预测集合,但是汉明损失惩罚的是独立的标签(individual labels)。因此,汉明损失以零一损失为上界,其取值区间在[0, 1]。预测真实标签的一个合适的子集或超集将会给出一个范围在(0,1)之间的汉明损失。

2.8. 精度,召回率和F度量指标(Precision, recall and F-measures)

直观地讲,精度(precision)指的是分类器不会把负样本标记为正样本的能力,召回率(recall)指的是分类器找到数据集中所有的正样本的能力。 在 F度量指标 (和度量指标)可被解释为精度和召回率的加权调和均值。一个度量指标在取值为1的时候达到它的最好值,而取值为0的时候达到最差得分。当时,和是等价的,而且这时候精度和召回率在的计算中是同等重要的。 precision_recall_curve 函数通过不断改变决策阈值,从真实标签和分类器给出的一个得分中计算一条精度-召回率曲线。 average_precision_score 函数根据预测得分计算平均精度(average precision)(AP)。该值在0到1之间,越高越好。AP定义为: 其中和是第n个阈值处的精度和召回率。对于随机预测,AP是正样本的比例。 参考文献[Manning2008]和[Everingham2010]提出了AP的两种可替代变体对精度-召回率曲线进行内插。当前, average_precision_score 函数未实现任何内插的变体版本。参考文献[Davis2006]和[Flach2015]描述了为什么精度-召回率曲线上的点的线性内插提供了一个过于乐观(overly-optimistic)的分类器性能度量。在函数auc中使用梯形规则(trapezoidal rule)计算曲线下面积的时候,这个线性内插会被使用。 下面这些函数允许分析精度,召回率和F度量指标的得分:

233ccc674a2980d0f943fcd22c25d825.png

注意, precision_recall_curve 函数只能在二分类的情形下使用。 average_precision_score 函数仅适用于二进制分类和多标签指示器(multilabel indicator)的情况。 plot_precision_recall_curve 函数绘制的精度调用如下图所示。 957201855daf627b42347fbdb7585633.png 示例:
  • 有关在文本稀疏分类中使用f1_score的案例,请参见使用稀疏特征对文本文档进行分类。
  • 有关在带有交叉验证的网格搜索的参数估计中使用precision_score和recall_score的案例,请参见使用带有交叉验证的网格搜索的参数估计。
  • 有关在评估分类器输出质量中使用precision_recall_curve案例,请参见精度-召回(Precision-Recall)。
参考文献: Manning2008 C.D. Manning, P. Raghavan, H. Schütze, Introduction to Information Retrieval, 2008. Everingham2010 M. Everingham, L. Van Gool, C.K.I. Williams, J. Winn, A. Zisserman, The Pascal Visual Object Classes (VOC) Challenge, IJCV 2010. Davis2006 J. Davis, M. Goadrich, The Relationship Between Precision-Recall and ROC Curves, ICML 2006. Flach2015 P.A. Flach, M. Kull, Precision-Recall-Gain Curves: PR Analysis Done Right, NIPS 2015.
2.8.1. 二分类
在一个二分类任务中,词语‘’正(positive)’’和‘’负(negative)’’指的是分类器的预测,词语‘’真(true)’’和‘’假(false)’’指的是预测是否和来自外部判断相互对应。有了上述词汇的定义,我们就可以给出下面这个表:

840d78ed1d50981e11c40f1b6f348389.png

在这种情况下,我们可以定义精度(precision),召回率(recall)和F量度指标(F-measure)的概念: 下面是一些二分类的例子:
>>> from sklearn import metrics>>> y_pred = [0, 1, 0, 0]>>> y_true = [0, 1, 0, 1]>>> metrics.precision_score(y_true, y_pred)1.0>>> metrics.recall_score(y_true, y_pred)0.5>>> metrics.f1_score(y_true, y_pred)0.66...>>> metrics.fbeta_score(y_true, y_pred, beta=0.5)0.83...>>> metrics.fbeta_score(y_true, y_pred, beta=1)0.66...>>> metrics.fbeta_score(y_true, y_pred, beta=2)0.55...>>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5)(array([0.66..., 1.        ]), array([1. , 0.5]), array([0.71..., 0.83...]), array([2, 2]))>>> import numpy as np>>> from sklearn.metrics import precision_recall_curve>>> from sklearn.metrics import average_precision_score>>> y_true = np.array([0, 0, 1, 1])>>> y_scores = np.array([0.1, 0.4, 0.35, 0.8])>>> precision, recall, threshold = precision_recall_curve(y_true, y_scores)>>> precisionarray([0.66..., 0.5       , 1.        , 1.        ])>>> recallarray([1. , 0.5, 0.5, 0. ])>>> thresholdarray([0.35, 0.4 , 0.8 ])>>> average_precision_score(y_true, y_scores)0.83...
2.8.2. 多分类和多标签分类
在多分类和多标签分类任务中,可以将精度,召回率和F量度指标的概念分别应用于每个标签。有很多方法可以把所有标签上的结果组合起来,这可以通过设置参数 averageaverage_precision_score (仅多标签), f1_scorefbeta_scoreprecision_recall_fscore_supportprecision_scorerecall_score 来实现。如所以上所描述的那样。但请注意如果所有标签都包括了,在多类分类的设置“micro” 平均策略,将会使产生的精度,召回率和F量度指标都跟准确度(accuracy)一样。还要注意的是“加权(weighted)”平均策略会产生一个取值范围不在精度和召回率之间的F量度指标得分。 为了使这一点更加明确,我们使用以下符号:
  • 预测的集合对
  • 真实标签的集合对
  • 是标签集
  • 是样本集
  • 是的个样本的子集,即
  • 是的带标签的子集
  • 同样地, 和是的子集
  • 是A和B的一些集合
  • (约定在处理的时候有所不同,此实现使用,并且也是类似的)
然后这些指标就可以定义如下:

c9eee1e2bd566b64a7379167c94fadab.png

>>> from sklearn import metrics>>> y_true = [0, 1, 2, 0, 1, 2]>>> y_pred = [0, 2, 1, 0, 0, 1]>>> metrics.precision_score(y_true, y_pred, average='macro')0.22...>>> metrics.recall_score(y_true, y_pred, average='micro')0.33...>>> metrics.f1_score(y_true, y_pred, average='weighted')0.26...>>> metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5)0.23...>>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None)(array([0.66..., 0.        , 0.        ]), array([1., 0., 0.]), array([0.71..., 0.        , 0.        ]), array([2, 2, 2]...))
对于带有一个“negative class”的多分类任务,不包括某些标签是可能的:
>>> metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro')... # 除了0, 没有标签被正确召回(recalled)。0.0
类似的,可以在宏平均中考虑数据样本中不存在的标签。
>>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro')0.166...

2.9. Jaccard相似系数得分(Jaccard similarity coefficient score)

jaccard_score 函数计算成对的标签集之间的Jaccard相似系数的平均值,也称为Jaccard索引。 给定第样本,以及关于样本的真正的标签集合和预测出的标签集合,Jaccard相似系数定义为: jaccard_score 工作方式就像 precision_recall_fscore_support 一样,它作为天生就设置好的度量指标,它适用于二分类的目标,并且通过使用 average ,使自身扩展适用于多标签和多分类(见 上文)。 在二分类情况下:
>>> import numpy as np>>> from sklearn.metrics import jaccard_score>>> y_true = np.array([[0, 1, 1],...                    [1, 1, 0]])>>> y_pred = np.array([[1, 1, 1],...                    [1, 0, 0]])>>> jaccard_score(y_true[0], y_pred[0])0.6666...
在带有二分类标签指示器(binary label indicators)的多标签情况下:
>>> jaccard_score(y_true, y_pred, average='samples')0.5833...>>> jaccard_score(y_true, y_pred, average='macro')0.6666...>>> jaccard_score(y_true, y_pred, average=None)array([0.5, 0.5, 1. ])
将多分类问题进行二值化并像处理多标签问题一样处理:
>>> y_pred = [0, 2, 1, 2]>>> y_true = [0, 1, 2, 2]>>> jaccard_score(y_true, y_pred, average=None)array([1. , 0. , 0.33...])>>> jaccard_score(y_true, y_pred, average='macro')0.44...>>> jaccard_score(y_true, y_pred, average='micro')0.33...

2.10. 合页损失(Hinge loss)

hinge_loss 函数使用合页损失(仅考虑预测误差的单边独立指标)来计算模型与数据之间的平均距离 。(在支持向量机等最大间隔分类器中使用了合页损失。) 如果类标签被编码为+1和-1,:是真值,并且用 decision_function 预测得到作为输出的决策,那么合页损失定义如下: 如果标签超过两个,则 hinge_loss 使用Crammer&Singer的多类变体(multiclass variant)。这是描述它的论文。 如果是对真实标签预测出的决策,并且是所有其他标签的预测中的最大值,其中预测出的决策是决策函数的输出,那么多个类的合页损失定义如下: 这是一个例子演示在二分类问题中,如何将 hinge_loss 函数与svm分类器一起使用:
>>> from sklearn import svm>>> from sklearn.metrics import hinge_loss>>> X = [[0], [1]]>>> y = [-1, 1]>>> est = svm.LinearSVC(random_state=0)>>> est.fit(X, y)LinearSVC(random_state=0)>>> pred_decision = est.decision_function([[-2], [3], [0.5]])>>> pred_decisionarray([-2.18...,  2.36...,  0.09...])>>> hinge_loss([-1, 1, 1], pred_decision)
这是一个例子说明在多分类问题中,如何将 hinge_loss 函数与svm分类器一起使用:
>>> X = np.array([[0], [1], [2], [3]])>>> Y = np.array([0, 1, 2, 3])>>> labels = np.array([0, 1, 2, 3])>>> est = svm.LinearSVC()>>> est.fit(X, Y)LinearSVC()>>> pred_decision = est.decision_function([[-1], [2], [3]])>>> y_true = [0, 2, 3]>>> hinge_loss(y_true, pred_decision, labels)0.56...

2.11. 对数损失(Log loss)

对数损失(Log loss),又被称为逻辑回归损失(logistic regression loss)或者交叉熵损失(cross-entropy loss),定义在概率估计上。它通常用于多项式逻辑回归(multinomial logistic regression)和神经网络以及期望最大化(expectation-maximization)的一些变体中,并且可用于评估分类器的概率输出( predict_proba )而不是其离散预测值。 对于二分类问题,并伴有真实类标签以及 一个概率估计,则每个样本的对数损失是给定真实标签时分类器的负对数似然函数(negative log-likelihood): 上面的公式可以按下述方法扩展到多分类的情形。首先把一个样本集合的真实类标签编码成 1-of-K 二进制指示矩阵:,也就是说,如果样本有标签,而标签又是取自于个类标签的集合中,那么就让。再令是概率的估计值的矩阵,并有。那么 整个样本集上的对数损失就定义如下: 为了能看清楚上面的公式是如何对二分类对数损失进行推广的,请注意在二分类情况下,和,因此在上扩展内部和就可以得到二分类对数损失。 log_loss 函数根据真实标签和概率矩阵来计算对数损失,这是由估计器的 predict_proba 方法返回的。
>>> from sklearn.metrics import log_loss>>> y_true = [0, 0, 1, 1]>>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]]>>> log_loss(y_true, y_pred)0.1738...
y_pred 中的第一个预测是 [.9, .1] ,这意味着第一个样本的标签是0的概率达到了90%。对数损失是非负的。

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

matthews_corrcoef 函数用于计算二分类的马修斯相关系数(Matthews correlation coefficient)(MCC)。下面引用维基百科的相关解释: “马修斯相关系数(Matthews correlation coefficient)在机器学习中用作二分类的质量度量。它以真假正负(true and false positives and negatives)为考虑,并且被广泛认为是一个均衡的度量,即使是在各个类的样本集大小差别极大时候也可以使用。MCC本质上是一个取值范围在-1到+1的相关系数,“0”代表了平均随机预测,”-1” 代表了反转预测。该统计信息也称为phi系数。 在二分类情况下,,,和分别指的是true positives,true negatives,false positives和false negatives的数量,MCC就定义为: 在多类情况下,给定个类的 confusion_matrix 之后。马修斯相关系数可以这样定义,为了简化定义,我们用以下这些中间变量:
  •  e86d066d7d03f5159c47a07bd067f9fb.png类实际发生的次数
  • 类实际被预测的次数
  • 正确预测的样本总数
  • 样本总数。
然后,多类MCC的定义如下所示: 当有两种以上类标签时,MCC的值将不再在-1到+1之间。它的最小值将是一个介于-1到0之间的数,具体数值取决于真实类标签的数量和分布。它的最大值总是+1。 下面是说明 matthews_corrcoef 函数用法的小例子:
>>> from sklearn.metrics import matthews_corrcoef>>> y_true = [+1, +1, +1, -1]>>> y_pred = [+1, -1, +1, +1]>>> matthews_corrcoef(y_true, y_pred)-0.33...

2.13. 多标签混淆矩阵

multilabel_confusion_matrix 函数计算每个类(默认)或每个样本(samplewise = True)的多标签混淆矩阵,以评估分类的准确度。multilabel_confusion_matrix还将多类数据视为多标签,这是一种转换,通常用于评估具有二分类指标(例如精度,召回率等)的多类问题(multiclass problems)。 在计算每个类的多标签混淆矩阵时,类的true negatives数是,false negatives是,true positives是,false positives是。 这是一个示例来说明如何使用多标签指示器矩阵(multilabel indicator matrix)作为输入的 multilabel_confusion_matrix 函数:
>>> from sklearn.metrics import multilabel_confusion_matrix>>> y_true = np.array([[1, 0, 1],...                    [0, 1, 0]])>>> y_pred = np.array([[1, 0, 0],...                    [0, 1, 1]])>>> multilabel_confusion_matrix(y_true, y_pred)array([[[1, 0],        [0, 1]],       [[1, 0],        [0, 1]],       [[0, 1],        [1, 0]]])
或者可以为每个样本的标签构建一个混淆矩阵:
>>> multilabel_confusion_matrix(y_true, y_pred, samplewise=True)array([[[1, 0],        [1, 1]],       [[1, 1],        [0, 1]]])
这是一个示例来说明如何使用多类(multiclass)作为输入的 multilabel_confusion_matrix 函数:
>>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]>>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]>>> multilabel_confusion_matrix(y_true, y_pred,...                             labels=["ant", "bird", "cat"])array([[[3, 1],        [0, 2]],       [[5, 0],        [1, 0]],       [[2, 1],        [1, 2]]])
以下是一些示例说明如何使用多标签指标矩阵作为输入的 multilabel_confusion_matrix 函数来计算每个类别的召回率(或灵敏度),特异性(specificity),失败率(fall out)和未命中率(miss rate)。 计算每个类别的召回率(也称为true positive rate或灵敏度):
>>> y_true = np.array([[0, 0, 1],...                    [0, 1, 0],...                    [1, 1, 0]])>>> y_pred = np.array([[0, 1, 0],...                    [0, 0, 1],...                    [1, 1, 0]])>>> mcm = multilabel_confusion_matrix(y_true, y_pred)>>> tn = mcm[:, 0, 0]>>> tp = mcm[:, 1, 1]>>> fn = mcm[:, 1, 0]>>> fp = mcm[:, 0, 1]>>> tp / (tp + fn)array([1. , 0.5, 0. ])
计算每个类别的特异性(specificity )(也称为true negative rate):
>>> tn / (tn + fp)array([1. , 0. , 0.5])
计算每个类别的失败(fall out)率(也称为false positive rate):
>>> fp / (fp + tn)array([0. , 1. , 0.5])
计算每个类别的未命中率(miss rate)(也称为false negative rate):
>>> fn / (fn + tp)array([0. , 0.5, 1. ])

2.14. ROC(Receiver operating characteristic)

roc_curve 函数计算ROC曲线。引用维基百科: “一个接收器工作特性(ROC),或简单点叫做ROC曲线,是一幅图,这幅图展示了一个二分类器系统在它的判别阈值不断变化时D 性能。这条曲线上坐标点的纵轴取值是真正的正样本的比例(TPR= true positive rate)。这条曲线上坐标点的横轴取值是负样本中假的正样本的比例(FPR = false positive rate)。当不断改变二分类器的阈值的时候,上述TPR和FPR就会跟着发生变化。这样每一个阈值都会对应一对坐标点(TPR,FPR),只要不断改变阈值就会产生一条曲线。TPR也被称之为灵敏度(sensitivity),而FPR是1减去特异性(specificity)或TNR” 此函数需要真实的二进制值和目标分数,它们可以是正类的概率估计值,置信度值或二元决策(binary decisions)。这是一个有关如何使用 roc_curve 函数的小例子:
>>> import numpy as np>>> from sklearn.metrics import roc_curve>>> y = np.array([1, 1, 2, 2])>>> scores = np.array([0.1, 0.4, 0.35, 0.8])>>> fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)>>> fprarray([0. , 0. , 0.5, 0.5, 1. ])>>> tprarray([0. , 0.5, 0.5, 1. , 1. ])>>> thresholdsarray([1.8 , 0.8 , 0.4 , 0.35, 0.1 ])
该图显示了这样的ROC曲线的示例: 29910be63df8fd935c75f3ea56d3011c.png
roc_auc_score 函数计算ROC曲线下的面积,该面积也用AUC或AUROC表示。通过计算ROC曲线下的面积,可将曲线信息汇总为一个数值。有关更多信息,请参阅Wikipedia上的AUC文章。
>>> import numpy as np>>> from sklearn.metrics import roc_auc_score>>> y_true = np.array([0, 0, 1, 1])>>> y_scores = np.array([0.1, 0.4, 0.35, 0.8])>>> roc_auc_score(y_true, y_scores)0.75
在多标签分类中, roc_auc_score 函数被扩展到计算所有标签上的平均值,如上所述。 与子集准确度,汉明损失或F1得分等度量指标相比,ROC不需要为每个标签优化阈值。 roc_auc_score 函数也可以用于多分类。当前支持两种平均策略:“一对一(one-vs-one)”算法计算成对的ROC AUC得分的平均值,“一对多(one-vs-rest)”算法计算每个类别相对于所有其他类别的ROC AUC得分的平均值。在这两种情况下,预测标签都以数组的形式提供,该数组的值范围为0到 n_classes ,并且得分对应于样本属于特定类别的概率估计。一对一(OvO)和一对多(OvR)算法支持统一加权( average='macro' )和流行度(prevalence)( average='weighted' )。 一对一(One-vs-one)算法:计算类的所有可能成对组合的平均AUC。[HT2001]定义了一个统一加权的多类AUC度量指标: 其中,是类别的数量,是正类和负类的AUC得分。一般来说,在多类情况下, 。通过将关键字参数 multiclass 设置为 'ovo' 和将关键字参数 average 设置为 'macro' 来使用此算法。 [HT2001]中的多类AUC度量指标可以扩展到由权重进行加权: 其中,是类别的数量。通过将关键字参数设置 multiclass'ovo' 和将关键字参数 average 设置为 'weighted' 来使用此算法。如[FC2009]中所述,该选项将返回权重加权平均值。 一对多(One-vs-rest)算法 :计算每个类相对于其他类的AUC[PD2000]。该算法在功能上与多标签情况相同。要启用此算法,请将关键字参数 multiclass 设置为 'ovr' 。像OvO一样,OvR支持两种平均类型: 'macro' [F2006]和 'weighted' [F2001]。 在false positive rate不被容忍的情况下, roc_auc_score 函数的参数 max_fpr 可被用来把ROC曲线累加到一个给定的限制。 c2a4bcf93f1024c0185a869177b8cb31.png
示例:
  • 有关使用ROC评估分类器输出质量的案例,请参阅接收器工作特性(ROC)。
  • 有关使用ROC使用交叉验证来评估分类器输出质量的案例,请参阅具有交叉验证的接收器工作特性(ROC)。
  • 有关使用ROC对物种分布进行建模的案例,请参阅物种分布建模。
参考文献: HT2001(1,2) Hand, D.J. and Till, R.J., (2001). A simple generalisation of the area under the ROC curve for multiple class classification problems. Machine learning, 45(2), pp.171-186. [FC2009] Ferri, Cèsar & Hernandez-Orallo, Jose & Modroiu, R. (2009). An Experimental Comparison of Performance Measures for Classification. Pattern Recognition Letters. 30. 27-38. [PD2000] Provost, F., Domingos, P. (2000). Well-trained PETs: Improving probability estimation trees (Section 6.2), CeDER Working Paper #IS-00-04, Stern School of Business, New York University. [F2006] Fawcett, T., 2006. An introduction to ROC analysis. Pattern Recognition Letters, 27(8), pp. 861-874. [F2001] Fawcett, T., 2001. Using rule sets to maximize ROC performance In Data Mining, 2001. Proceedings IEEE International Conference, pp. 131-138.

2.15. 零一损失(Zero one loss)

zero_one_loss 函数在上计算0-1分类损失()的和或均值。默认情况下,该函数会在样本上进行归一化。如果想要获得的和,把 normalize 设为 False 。 在多标签分类问题中, zero_one_loss 函数给一个子集评分为1,如果这个子集的真实标签与预测严格匹配,反之如果有任何一处不匹配则评分为0。默认情况下,函数返回不完美预测子集的百分比。如果想要获得这些不完美预测子集的数量,只需要把参数 normalize 设置成 False 。 如果是第个样本的预测值,_是对应的真值,那么0-1损失定义如下: 其中,是指标函数。
>>> from sklearn.metrics import zero_one_loss>>> y_pred = [1, 2, 3, 4]>>> y_true = [2, 2, 3, 4]>>> zero_one_loss(y_true, y_pred)0.25>>> zero_one_loss(y_true, y_pred, normalize=False)
在带有二元标签指示器(binary label indicators)的多标签情况下,第一个标签集[0,1]出现错误:
>>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)))0.5>>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)),  normalize=False)1
示例:
  • 有关在交叉验证进行递归特征消除中使用零一损失的案例,请参见使用交叉验证进行递归特征消除。

2.16. Brier得分损失

brier_score_loss 函数计算二分类的Brier得分。引用维基百科: Brier得分是一个用于度量概率性预测准确率的合适的评分函数。它可以被用到某些任务中,在这些任务里面预测必须分配概率到一个由互斥离散输出组成的集合上。 该函数返回实际输出和可能输出预测概率之间的平均平方差得分。实际输出必须是1或0(true或false),而实际输出的预测概率可以是一个介于0和1之间的数。 Brier得分损失也是一个介于0到1之间的数,而且得分越低(也就是平均平方误差)则预测越精确。它可被认为是对一组概率性预测“校准(calibration)”的度量。 其中:是预测的总数,是实际输出,的预测出的概率。 下面是该函数的用法示例:
>>> import numpy as np>>> from sklearn.metrics import brier_score_loss>>> y_true = np.array([0, 1, 1, 0])>>> y_true_categorical = np.array(["spam", "ham", "ham", "spam"])>>> y_prob = np.array([0.1, 0.9, 0.8, 0.4])>>> y_pred = np.array([0, 1, 1, 0])>>> brier_score_loss(y_true, y_prob)0.055>>> brier_score_loss(y_true, 1 - y_prob, pos_label=0)0.055>>> brier_score_loss(y_true_categorical, y_prob, pos_label="ham")0.055>>> brier_score_loss(y_true, y_prob > 0.5)0.0
示例:
  • 有关使用Brier分数损失来执行分类器概率校准的示例,请参阅分类器的概率校准。
参考文献:
  • G. Brier, Verification of forecasts expressed in terms of probability, Monthly weather review 78.1 (1950)

3. 多标签排名指标(ranking metrics)

在多标签学习中,每个样本可以有任意个与之相关联的真实标签。目标是给予真实标签更高的分数和更好的排名。

3.1. 覆盖误差

coverage_error 函数计算最终预测中必须包含的标签平均数量,以便预测所有真实标签。如果你想知道你平均需要预测多少最高分的标签(top-scored-labels)而不漏掉任何一个真实标签,这个函数是很有用的。因此,这个指标的最佳值是真实标签的平均数量。 注意 我们的实现得分比Tsoumakas等人2010年给出的得分高1分。这将扩展处理一个实例具有0个真标签的退化情况。 形式上,给出真实标签的二元指示矩阵(binary indicator matrix)和与每个标签相关联的得分,覆盖度(coverage)定义为 其中,。给定排名(rank)的定义, y_scores 中的联系(ties)会通过给出分配给所有绑定值(tied values)的最大排名而被破坏。 下面是关于此函数用法的小示例:
>>> import numpy as np>>> from sklearn.metrics import coverage_error>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> coverage_error(y_true, y_score)2.5

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

label_ranking_average_precision_score 函数实现 label ranking average precision(LRAP)。此度量与 average_precision_score 函数相关,但基于标签排名的概念,而不是精确度和召回率。 标签排名平均精度(LRAP)在样本上的平均值回答了以下问题:对于每个真实标签,高排名标签中的哪一部分是真标签?如果您能够给与每个样本相关联的标签更好的排名,则此性能指标将更高。得到的分数总是严格大于0,最佳值为1。如果每个样本只有一个相关标签,则标签排名平均精度等于平均倒数排名。 形式上,给出真实标签的二元指示矩阵(binary indicator matrix)和与每个标签相关联的得分,平均精度(average precision)定义为 其中,,,计算集合的基数(即集合中的元素数),是“范数”(计算向量中非零元素数)。 下面是关于此函数用法的小示例:
>>> import numpy as np>>> from sklearn.metrics import label_ranking_average_precision_score>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> label_ranking_average_precision_score(y_true, y_score)0.416...

3.3. 排名损失(Ranking loss)

label_ranking_loss 函数在样本上计算平均错误排序的标签对数量的排序损失,即真标签的得分低于假标签,由假和真标签的排序对的数量倒数加权。可实现的最低排名损失为零。 形式上,给出真实标签的二元指示矩阵(binary indicator matrix)和与每个标签相关联的得分,排序损失定义为 其中计算集合的基数(即集合中的元素数),而是“范数”(计算向量中非零元素数)。 下面是关于此函数用法的小示例:
>>> import numpy as np>>> from sklearn.metrics import label_ranking_loss>>> y_true = np.array([[1, 0, 0], [0, 0, 1]])>>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]])>>> label_ranking_loss(y_true, y_score)0.75...>>> # 随着接下来的预测,我们有一个完美并且最小的损失(loss)>>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]])>>> label_ranking_loss(y_true, y_score)0.0
参考文献:
  • Tsoumakas, G., Katakis, I., & Vlahavas, I. (2010). Mining multi-label data. In Data mining and knowledge discovery handbook (pp. 667-685). Springer US.

3.4. 标准化折扣累积收益(Normalized Discounted Cumulative Gain)

折扣累积收益(DCG)和标准化折扣累积收益(NDCG)是排名指标(ranking metrics);它们比较预测顺序与真实值得分,例如答案与查询的相关性。 从Wikipedia页面获取折扣累计收益相关描述: “折扣累积收益(DCG)是衡量排名质量的一个指标。在信息检索中,它经常被用来衡量web搜索引擎算法或相关应用程序的有效性。DCG使用搜索引擎结果集中文档的分级关联度,根据文档在结果列表中的位置来衡量文档的有用性或收益。收益是从结果列表的顶部到底部累积起来的,每个结果的收益在较低等级时被打折。” DCG按照预测的顺序排列真实目标(例如查询答案的相关性),然后将它们乘以对数衰减(logarithmic decay),并对结果进行求和。在第一个K结果之后,总和可以被截断,在这种情况下我们称之为DCG@K.NDCG,或者NDCG@K是DCG除以完美预测得到的DCG,所以它总是在0和1之间。通常,NDCG比DCG更受欢迎。 与排名损失相比,NDCG可以考虑相关性得分,而不是ground-truth排名。因此,如果ground-truth仅包含一个排序,则应优先考虑排名损失;如果ground-truth包含实际有用性得分(例如,0表示不相关,1表示相关,2表示非常相关),则可以使用NDCG。 对于一个样本,给定每个目标连续真实值向量,其中是输出的数目,并且预测值是,排序函数是,DCG得分为 且NDCG分数是DCG分数除以由y获得的DCG分数。 参考文献:
  • Wikipedia entry for Discounted Cumulative Gain: https://en.wikipedia.org/wiki/Discounted_cumulative_gain
  • Jarvelin, K., & Kekalainen, J. (2002). Cumulated gain-based evaluation of IR techniques. ACM Transactions on Information Systems (TOIS), 20(4), 422-446.
  • Wang, Y., Wang, L., Li, Y., He, D., Chen, W., & Liu, T. Y. (2013, May). A theoretical analysis of NDCG ranking measures. In Proceedings of the 26th Annual Conference on Learning Theory (COLT 2013)
  • McSherry, F., & Najork, M. (2008, March). Computing information retrieval performance measures efficiently in the presence of tied scores. In European conference on information retrieval (pp. 414-421). Springer, Berlin, Heidelberg.

4. 回归度量(Regression metrics)

sklearn.metrics 模块实现了几个loss、score和utility函数来度量回归性能。其中一些已被增强来处理多输出情况: mean_squared_error , mean_absolute_error , explained_variance_scorer2_score 。 这些函数有一个 multioutput 关键字参数,指定每个目标的得分或损失的取平均方式。默认值为 'uniform_average' ,指定输出的均匀加权平均值。如果通过了形状为 (n_outputs,)ndarray ,则将其条目(entries)解释为权重,并返回相应的加权平均值。如果指定 multioutput'raw_values' ,则所有未更改的单个分数或损失将以一个形状为 (n_outputs,) 的数组返回。 r2_scoreexplained_variance_score 接受 multioutput 参数的附加值 'variance_weighted' 。此选项将通过相应目标变量的方差对每个个体得分进行加权。此设置量化全局捕获的未缩放方差。如果目标变量具有不同的大小,那么这一得分就更加重视对高方差变量的解释。 multioutput='variance_weighted'r2_score 向后兼容性的默认值。未来将改为 uniform_average

4.1. 解释方差得分(variance score)

explained_variance_score 计算 explained variance regression score。 如果是估计的目标输出,是相应的(正确的)目标输出,而Var是方差,即标准差的平方,则解释方差(explained variance)估计如下: 最好的可能得分是1.0,值越低越差。 下面是一个使用 explained_variance_score 函数的小例子:
>>> from sklearn.metrics import explained_variance_score>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> explained_variance_score(y_true, y_pred)0.957...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> explained_variance_score(y_true, y_pred, multioutput='raw_values')array([0.967..., 1.        ])>>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7])0.990...

4.2. 最大误差(Max error)

max_error 函数计算最大剩余误差(residual error),这是一个度量,用于捕获预测值和真值之间最坏情况的误差。在完全拟合的单输出回归模型中,训练集上的 max_error 将为 0 ,尽管在现实世界中这是极不可能的,但此度量显示了模型拟合时的误差程度。 如果是第个样本的预测值,是相应的真实值,则最大误差定义为 下面是关于 max_error 函数用法的一个小例子:
>>> from sklearn.metrics import max_error>>> y_true = [3, 2, 7, 1]>>> y_pred = [9, 2, 7, 1]>>> max_error(y_true, y_pred)6
max_error 不支持多输出。

4.3. 平均绝对误差(Mean absolute error)

mean_absolute_error 函数计算 mean absolute error,是与绝对误差损失或范数损失的期望值相对应的风险度量(risk metric)。 如果是第个样本的预测值,而是相应的真实值,则在个样本上估计的平均绝对误差(MAE)定义为 下面是关于 mean_absolute_error 函数用法的一个小例子:
>>> from sklearn.metrics import mean_absolute_error>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> mean_absolute_error(y_true, y_pred)0.5>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> mean_absolute_error(y_true, y_pred)0.75>>> mean_absolute_error(y_true, y_pred, multioutput='raw_values')array([0.5, 1. ])>>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7])0.85...

4.4. 均方误差(Mean squared error)

mean_squared_error 函数 mean square error,即与平方(二次)误差或损失的期望值相对应的风险度量(risk metric)。 如果是第个样本的预测值,而是相应的真实值,则在个样本上估计的均方误差(MSE)定义为 下面是关于 mean_squared_error 函数用法的一个小例子:
>>> from sklearn.metrics import mean_squared_error>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> mean_squared_error(y_true, y_pred)0.375>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> mean_squared_error(y_true, y_pred)0.7083...
示例:
  • 有关评估梯度增强回归的均方误差使用示例,请参见 梯度增强回归。

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

mean_squared_log_error 函数计算与平方对数(二次)误差或损失的期望值相对应的风险度量(risk metric)。 如果是第个样本的预测值,而是对应的真实值,则在个样本上估计的均方对数误差(MSLE)定义为 其中是指的自然对数。当目标呈指数增长趋势时,此指标较为合适,如人口计数、跨年度商品的平均销售额等。请注意,此指标对预测不足的估计值的惩罚大于对预测过高的估计值。 下面是关于 mean_squared_log_error 函数用法的一个小例子:
>>> from sklearn.metrics import mean_squared_log_error>>> y_true = [3, 5, 2.5, 7]>>> y_pred = [2.5, 5, 4, 8]>>> mean_squared_log_error(y_true, y_pred)0.039...>>> y_true = [[0.5, 1], [1, 2], [7, 6]]>>> y_pred = [[0.5, 2], [1, 2.5], [8, 8]]>>> mean_squared_log_error(y_true, y_pred)0.044...

4.6. 中位数绝对误差(Median absolute error)

median_absolute_error 特别有趣,因为它对离群值具有鲁棒性。损失的计算方法是取目标和预测之间所有绝对差异的中位数。 如果是第个样本的预测值,是相应的真实值,则在个样本上估计的中位绝对误差(MedAE)定义为 median_absolute_error 不支持多输出。 下面是关于 median_absolute_error 函数用法的一个小例子:
>>> from sklearn.metrics import median_absolute_error>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> median_absolute_error(y_true, y_pred)0.5

4.7. R² score, 决定系数(coefficient of determination)

r2_score 函数计算 coefficient of determination,通常表示为R²。 它表示由模型中的独立变量解释(independent variables)的方差 (of y)比例。它提供了拟合优度的指示,因此通过解释方差的比例来衡量模型预测未见过的样本性能。 由于这种方差依赖于数据集,因此不同数据集之间的R²可能没有可比性。最好的分数是1.0,并且它可能是负的(因为模型可能会随意变差)。如果一个常数模型总是预测y的期望值,而不考虑输入特征,则R²得分为0.0。 如果是第个样本的预测值,是总共个样本的对应真实值,则估计的R²定义为: 其中, 和 请注意, r2_score 计算未经调整的R²,且不校正y的样本方差中的偏差。 下面是关于 r2_score 函数用法的一个小例子:
>>> from sklearn.metrics import r2_score>>> y_true = [3, -0.5, 2, 7]>>> y_pred = [2.5, 0.0, 2, 8]>>> r2_score(y_true, y_pred)0.948...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> r2_score(y_true, y_pred, multioutput='variance_weighted')0.938...>>> y_true = [[0.5, 1], [-1, 1], [7, -6]]>>> y_pred = [[0, 2], [-1, 2], [8, -5]]>>> r2_score(y_true, y_pred, multioutput='uniform_average')0.936...>>> r2_score(y_true, y_pred, multioutput='raw_values')array([0.965..., 0.908...])>>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7])0.925...
示例:
  • 参见 Lasso and Elastic Net for Sparse Signals 以获取在稀疏信号上评估 Lasso and Elastic Net 的 R² score 使用示例。

4.8. 平均泊松、伽马和二次偏差(Mean Poisson, Gamma, and Tweedie deviances)

mean_tweedie_deviance 函数用一个 power 参数(p)计算 mean Tweedie deviance error。这是一个度量,可以得出回归目标的预期值。 存在以下特殊情况,
  • power=0时,等于 mean_squared_error(均方误差).
  • power=1时,等于 mean_poisson_deviance(平均泊松偏差).
  • power=2时,等于 mean_gamma_deviance(平均伽马偏差).
如果是第个样本的预测值,是相应的真实值,则 power p 的平均二次偏差(Tweedie deviances)误差(D)定义为 二次偏差(Tweedie deviances)是二次幂(degree 2-power )齐次函数。因此,Gamma分布( power=2 )意味着同时缩放 y_truey_pred 对偏差没有影响。对于泊松分布( power=1 ),偏差线性缩放;对于正态分布( power=0 ),偏差二次缩放。一般来说, power 越大,真实目标和预测目标之间的极端偏差的权重就越小。 例如,让我们比较两个预测值1.0和100,它们都是对应真实值的50%。 均方误差( power=0 )对第二点的预测差非常敏感:
>>> from sklearn.metrics import mean_tweedie_deviance>>> mean_tweedie_deviance([1.0], [1.5], power=0)0.25>>> mean_tweedie_deviance([100.], [150.], power=0)2500.0
如果我们将 power 增加到1:
>>> mean_tweedie_deviance([1.0], [1.5], power=1)0.18...>>> mean_tweedie_deviance([100.], [150.], power=1)18.9...
误差的差别减小了。最后,设置, power=2
>>> mean_tweedie_deviance([1.0], [1.5], power=2)0.14...>>> mean_tweedie_deviance([100.], [150.], power=2)0.14...
我们会得到相同的错误。因此,当 power=2 时的偏差仅对相对误差(relative errors)敏感。

5. 聚类度量(Clustering metrics)

sklearn.metrics 模块实现了几个loss、score 和 utility 函数。有关更多信息,请参阅聚类性能评估部分,例如聚类和用于二分聚类的二分聚类评估部分。

6. 虚拟(Dummy)估计器

在进行有监督的学习时,一个简单的完整性检查(sanity check)包括比较估计器和简单的经验法则。 DummyClassifier 实现了几种简单的分类策略:
  • stratified 根据训练集的类分布生成随机预测。
  • most_frequent预测训练集中最常见的标签。
  • prior给出最大化类先验概率(class prior)(如most_frequent)的预测,predict_proba 返回类先验概率。
  • uniform随机生成预测。
  • constant预测用户提供的常量标签。
当正类比较少时,这种方法的一个主要动机是 F1-scoring。 注意,在所有这些策略中, predict 方法完全忽略了输入数据! 为了说明 DummyClassifier ,我们首先创建一个不平衡的数据集:
>>> from sklearn.datasets import load_iris>>> from sklearn.model_selection import train_test_split>>> X, y = load_iris(return_X_y=True)>>> y[y != 1] = -1>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
接下来,让我们比较 SVCmost_frequent 的准确率:
>>> from sklearn.dummy import DummyClassifier>>> from sklearn.svm import SVC>>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train)>>> clf.score(X_test, y_test)0.63...>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)>>> clf.fit(X_train, y_train)DummyClassifier(random_state=0, strategy='most_frequent')>>> clf.score(X_test, y_test)0.57...
我们看到 SVC 并没有比虚拟(dummy)分类器做得更好。现在,让我们更改内核:
>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train)>>> clf.score(X_test, y_test)0.94...
我们看到准确率提高到了几乎100%。如果CPU成本不高,建议使用交叉验证策略以更好地估计准确性。有关更多信息,请参阅交叉验证:评估估计器性能部分。此外,如果要在参数空间上进行优化,强烈建议使用适当的方法;有关详细信息,请参阅调整估计器的超参数部分。 通常,当一个分类器的准确率太接近随机性时,它可能意味着出了问题:特征没有帮助,超参数没有得到正确调整,类不平衡导致分类器出现问题等… DummyRegressor 还为回归实现了四个简单的经验法则:
  • mean 预测训练目标的平均值。
  • median 预测训练目标的中位数。
  • quantile 预测用户提供的训练目标的分位数(quantile)。
  • constant 预测用户提供的常量值。
在所有这些策略中, predict 方法完全忽略了输入数据

编辑器”提供技术支持

☆☆☆为方便大家查阅,小编已将scikit-learn学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:

978ec90822629470968607df07e47366.png

欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)

3eea912bdf5ab10f45f1ad92375338c4.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/287882
推荐阅读
相关标签
  

闽ICP备14008679号