赞
踩
score
方法,该方法为其要解决的问题提供默认的评估标准。在此章节上没有讨论该方法的使用,但每个估计器的文档章节中都对此方法进行了讨论。metrics
实现了一些函数用于以某种特殊目的评估模型预测误差。这些度量指标在分类度量,多标签排名(Multilabel ranking)度量,回归度量和聚类度量的各章节中都有详细的介绍。model_selection.GridSearchCV
和
model_selection.cross_val_score
,接受一个
scoring
参数,该参数控制着估计器的评估过程中使用什么样的度量指标。
scoring
参数指定一个评分器对象(scorer object)。下表显示了所有可能的值。所有评分器对象均遵循以下约定:较高的返回值优先于较低的返回值。因此,度量模型和数据之间的距离度量指标,例如
metrics.mean_squared_error
可以作为neg_mean_squared_error,返回变负的指标值。
用法案例:
>>> 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
字典中。
sklearn.metrics
模块还提供了一组简单的函数,当给定真值和预测值的时候用来度量一个预测错误:
_score
结尾的函数返回一个值进行最大化,该值越高代表预测越好。_error
或_loss
结尾的函数返回一个值进行最小化,值越低代表预测越好。当我们使用函数make_scorer把这种越小越好的度量转换成评分对象的时候,就需要设置参数greater_is_better为False(这个参数默认是True,对这个参数下面还会解释)。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函数构建一个完全自定义的评分对象,该函数可以接收多个参数:
my_custom_loss_func
)greater_is_better=True
默认值)还是损失(loss)(greater_is_better=False
)。如果损失(loss),则评分器对象对python函数的输出取负号,这符合交叉验证约定,即评分器返回越高的值预测越好。needs_threshold=True
)。默认值为False。beta
或labels
。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...
make_scorer
来生成更加灵活的模型评分器(model scorers)。如果一个python可调用对象被叫做评分器(scorer),那么它需要符合以下两个规则所指定的协议:
(estimator, X, y)
来调用它,其中estimator
是要被评估的模型,X
是验证数据,y
是真实目标变量 (在有监督情况下)或None(在无监督情况下)。estimator
的预测质量。同样,按照惯例,越高的数字越好, 所以如果您的评分器(scorer)返回损失(loss),那么这个返回值应该被取负号 。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)
GridSearchCV
,
RandomizedSearchCV
和
cross_validate
中进行多度量指标的评估。
这有两种方法可以为
scoring
参数指定多个评分指标:
>>> scoring = ['accuracy', 'precision']
>>> 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]
sklearn.metrics
模块实现了多种损失(loss),评分(score)和工具(utility)函数,来度量分类器性能。一些度量指标可能需要对正类(positive class),置信度值(confidence values)或二元决策值(binary decisions values)进行概率估计。大多数实现都允许每个样本通过
sample_weight
参数为整体得分(overall score)提供加权贡献(weighted contribution)。
这里面的一部分度量指标仅仅限于在二分类的情况下使用:
下面这些既能在二分类中用也能够用于多分类的情况:
下面的这些还可以用在多标签分类中:
下面的这些指标可以用在二分类和多标签(不是多分类)问题中:
2.1. 从二分类问题到多类或多标签问题
在下面的小节中,我们会逐个讲解这些函数,包括一些常用API的注解和度量指标的数学定义。
有些度量指标基本上是为二分类任务所服务的(例如
f1_score
,
roc_auc_score
)。在这些情况下,默认情况下仅评估正类(positive label),假定把正类标记为
1
(尽管可以通过
pos_label
参数进行配置)。
将二分类指标扩展应用于多分类或多标签问题时,数据将被视为二分问题的集合,每个类都有一个二分类指标,然后可以使用多种策略在整个类中计算所有二分类指标的平均值,这些不同的计算平均值的策略在某些特定场景中可能会用到。如果可用,您应该使用
average
参数来选择某个平均策略。
"macro"
简单地计算二分类指标的平均值,赋予每个类别相同的权重。在不常见的类别是重要的问题上,宏观平均(macro-averaging)可能是突出其性能的一种方法。另一方面,所有类别同样重要的假设通常是不真实的, 因此宏观平均(macro-averaging)将过度强调不常见的类别的典型的低性能。"weighted"
通过计算其在真实数据样本中的存在来对每个类的得分进行加权的二分指标平均值来计算类不平衡。"micro"
使每个样本类别对总体指标的贡献均等(样本权重的结果除外),不是将每个类别的度量指标求和,而是将构成每个类别指标的红利(dividends)和除数求和,计算总体商。在多标签设置中,宏观平均可能是优先选择的,包括要忽略多数类的多分类。"samples"
仅适用于多标签问题。它不计算每个类别的指标,而是计算评估数据中的每个样本的真实和预测类别的指标,并返回加权平均。average=None
将返回一个数组与每个类的得分。i
具有标号
j
,则
[i, j]
具有值1,否则为值0。
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
示例:
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。
**注意:**这里的多类定义似乎是二分类中使用的度量指标的最合理扩展,尽管在文献中还没有达成共识:
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
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
可以用来直观地表示一个混淆矩阵,如混淆矩阵案例所示,它创建了下图:
该
normalize
参数允许报告(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)
示例:
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
示例:
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_true
和
y_pred
之间的汉明距离,这于零一损失(Zero one loss)函数类似。但是,虽然零一损失惩罚的是不与真值集合严格匹配的预测集合,但是汉明损失惩罚的是独立的标签(individual labels)。因此,汉明损失以零一损失为上界,其取值区间在[0, 1]。预测真实标签的一个合适的子集或超集将会给出一个范围在(0,1)之间的汉明损失。
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度量指标的得分:
注意,
precision_recall_curve
函数只能在二分类的情形下使用。
average_precision_score
函数仅适用于二进制分类和多标签指示器(multilabel indicator)的情况。
plot_precision_recall_curve
函数绘制的精度调用如下图所示。
示例:
>>> 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...
average
为
average_precision_score
(仅多标签),
f1_score
,
fbeta_score
,
precision_recall_fscore_support
,
precision_score
和
recall_score
来实现。如所以上所描述的那样。但请注意如果所有标签都包括了,在多类分类的设置“micro” 平均策略,将会使产生的精度,召回率和F量度指标都跟准确度(accuracy)一样。还要注意的是“加权(weighted)”平均策略会产生一个取值范围不在精度和召回率之间的F量度指标得分。
为了使这一点更加明确,我们使用以下符号:
>>> 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...
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...
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...
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%。对数损失是非负的。
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
之后。马修斯相关系数可以这样定义,为了简化定义,我们用以下这些中间变量:
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...
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. ])
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曲线的示例:
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曲线累加到一个给定的限制。
示例:
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
示例:
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
示例:
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
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...
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
参考文献:
sklearn.metrics
模块实现了几个loss、score和utility函数来度量回归性能。其中一些已被增强来处理多输出情况:
mean_squared_error
,
mean_absolute_error
,
explained_variance_score
和
r2_score
。
这些函数有一个
multioutput
关键字参数,指定每个目标的得分或损失的取平均方式。默认值为
'uniform_average'
,指定输出的均匀加权平均值。如果通过了形状为
(n_outputs,)
的
ndarray
,则将其条目(entries)解释为权重,并返回相应的加权平均值。如果指定
multioutput
为
'raw_values'
,则所有未更改的单个分数或损失将以一个形状为
(n_outputs,)
的数组返回。
r2_score
和
explained_variance_score
接受
multioutput
参数的附加值
'variance_weighted'
。此选项将通过相应目标变量的方差对每个个体得分进行加权。此设置量化全局捕获的未缩放方差。如果目标变量具有不同的大小,那么这一得分就更加重视对高方差变量的解释。
multioutput='variance_weighted'
是
r2_score
向后兼容性的默认值。未来将改为
uniform_average
。
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...
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
不支持多输出。
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...
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...
示例:
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...
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
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...
示例:
mean_tweedie_deviance
函数用一个
power
参数(p)计算 mean Tweedie deviance error。这是一个度量,可以得出回归目标的预期值。
存在以下特殊情况,
power=0
时,等于 mean_squared_error(均方误差)
.power=1
时,等于 mean_poisson_deviance(平均泊松偏差)
.power=2
时,等于 mean_gamma_deviance(平均伽马偏差)
.2-power
)齐次函数。因此,Gamma分布(
power=2
)意味着同时缩放
y_true
和
y_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)敏感。
sklearn.metrics
模块实现了几个loss、score 和 utility 函数。有关更多信息,请参阅聚类性能评估部分,例如聚类和用于二分聚类的二分聚类评估部分。
DummyClassifier
实现了几种简单的分类策略:
stratified
根据训练集的类分布生成随机预测。most_frequent
预测训练集中最常见的标签。prior
给出最大化类先验概率(class prior)(如most_frequent
)的预测,predict_proba
返回类先验概率。uniform
随机生成预测。constant
预测用户提供的常量标签。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)
接下来,让我们比较
SVC
和
most_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学习路线专栏 文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“系列文章”,如图:
欢迎大家和我一起沿着scikit-learn文档这条路线,一起巩固机器学习算法基础。(添加微信:mthler,备注:sklearn学习,一起进【sklearn机器学习进步群】开启打怪升级的学习之旅。)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。