机器学习模型评估方法及代码实现

混淆矩阵

混淆矩阵(confusion matrix)如下所示:

真实\预测 正例 反例
正例 TP(真正例) FN(假反例)
反例 FP(假正例) TN(真反例)

TP: 将正例预测为正例(预测正确);

FN: 将正例预测为负例(预测错误);

FP: 将负例预测为正例(预测错误);

TN: 将负例预测为负例(预测正确)。

正例包括 TP、FN;反例包括 TN、FP

准确率(Accuracy)

定义:指的是分类正确的样本数量占样本总数的比例

公式:

scikit-learn接口:

1
2
3
4
5
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)

精确率(Precision)

定义:精确率(Precision),即查准率。通常我们所说的精确率是正例的精确率,它是被判定为正例的样本中,真正的正例样本的比例。我们同样可以计算负例的精确率,但是通常没有人这样做。精确率主要用来评测是否误检。举个例子,假设一个班级有10个学生,5男5女。我们目标是寻找班级中的女生,返回6个结果分别是男 、 女 、女 、 男 、女 、 男。如果返回的结果中只有3个正确,那么查准率为3/6=0.5。

公式(分类任务):

在信息检索领域,精确率是返回结果中相关文档的数目与返回结果的数目的比例:

scikit-learn接口:

1
2
3
4
5
6
7
8
9
10
from sklearn.metrics import precision_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
precision_score(y_true, y_pred, average='macro')
precision_score(y_true, y_pred, average='micro')
precision_score(y_true, y_pred, average='weighted')
precision_score(y_true, y_pred, average=None)

注释:

macro 度量:对于n个二分类混淆矩阵,在各混淆矩阵上分别计算精确率和召回率,记(P1,R1),(P2,R2)…(Pn,Rn),再计算平均值,得到宏精确率(macro-P)、宏召回率(macro-R),继而得到宏F1(macro-F1)。

micro度量:对于n个二分类混淆矩阵,先对TP、FN、FP、TN求平均值,再用均值计算得到微精确率(micro-P)、微召回率(micro-P),继而得到微F1(micro-F1)。

召回率(Recall)

定义:召回率(Recall),即查全率。通常我们所说的召回率是正例的召回率,它是被正确分类的正例样本,占所有正例样本的比例。我们同样可以计算负例的召回率,但是通常没有人这样做。召回率主要用来评测是否漏检。举个例子,假设一个班级有10个学生,5男5女。我们目标是寻找班级中的女生,返回6个结果分别是男 、 女 、女 、 男 、女 、 男。总共有5个女生,返回结果中有3个女生,那么查全率为3/5=0.6。

公式(分类任务):

在信息检索领域,召回率是返回结果中相关文档的数目与所有相关文档的数目的比例:

scikit-learn接口:

1
2
3
4
5
6
7
8
9
10
from sklearn.metrics import recall_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
recall_score(y_true, y_pred, average='macro')
recall_score(y_true, y_pred, average='micro')
recall_score(y_true, y_pred, average='weighted')
recall_score(y_true, y_pred, average=None)

F1_score

定义:精确率和召回率的调和平均值。

公式:

scikit-learn接口:

1
2
3
4
5
6
7
8
9
10
from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')
f1_score(y_true, y_pred, average='micro')
f1_score(y_true, y_pred, average='weighted')
f1_score(y_true, y_pred, average=None)

ROC和AUC

定义: ROC曲线,是以FPR(False Positive Rate, 召回率) 为横轴、TPR(True Positive Rate, 取伪率)为纵轴,衡量二分类系统性能的曲线。分类器对分类的置信度一般设为50%,即置信度超过50%认为是正例,低于50%认为是反例。依次改变这个置信度为10%~100%,会得到一组不同的混淆矩阵,取其中的FPR和TPR值组成坐标,连接这些值,就得到ROC曲线。ROC曲线与X轴围成的图形面积可以作为一个综合衡量指标,即AUC(Area Under Curve,曲线下面积)。AUC越大,曲线就越凸,分类器的效果也就越好。ROC曲线反映了分类器对正例的覆盖能力和对负例的覆盖能力之间的权衡。

scikit-learn接口:

1
2
3
4
5
6
7
8
import numpy as np
from sklearn.metrics import roc_curve, auc, roc_auc_score
y = np.array([1,1,2,2])
pred = np.array([0.1,0.4,0.35,0.8])
fpr,tpr,thresholds = roc_curve(y,pred,pos_label=2)
result = auc(fpr,tpr)
print(result)

AP/MAP

定义:我们首先引入PR曲线概念。PR曲线(Precision-recall曲线)与ROC曲线的区别是横轴和纵轴不同,PR曲线的横轴Recall也就是TPR,反映了分类器对正例的覆盖能力。而纵轴Precision的分母是识别为正例的数目,而不是实际正例数目。Precision反映了分类器预测正例的准确程度。那么,PR曲线反映了分类器对正例的识别准确程度和对正例的覆盖能力之间的权衡。对于随机分类器而言,其Precision固定的等于样本中正例的比例,不随recall的变化而变化。与AUC相似,AP(Average Precision)就是PR曲线与X轴围成的图形面积

若PR曲线为连续型,则:

若PR曲线为离散型,则:

在信息检索领域,我们引入MAP(Mean Average Precision, 均值平均精度),

其中Q为查询的总次数。

AP计算方法:前面给出的是AP的定义式,下面我们将介绍在信息检索领域计算AP的方法。首先求出每个位置上的精确率(Precision),然后求所有的位置的精确率(Precision)的平均值。如果该位置的文档是不相关的则该位置 Precision=0。

注:其中k是返回结果序列的排列次序,n是返回结果的数目,P(k)是返回序列中从第k个文档处截断的精确率,rel(k)是指示函数,如果第k个文档为相关文档则rel(k)=1,否者rel(k)=0。

例如:

Prediction Correctness Points
1 wrong 0
2 right 1 / 2
3 right 2 / 3
4 wrong 0
5 right 3 / 5
6 wrong 0
7 wrong 0
8 wrong 0
9 right 4 / 9
10 wrong 0

上表中Prediction列表示文档的得分排序结果,Correctness列表示结果的正确性,Points列为精确率得分。那么我们将计算得到AP=(0+1/2+2/3+0+3/5+0+0+0+4/9+0)/4=0.55。

MAP计算方法:主集合的平均准确率(MAP)是每个主题的平均准确率(AP)的平均值。假设在测试集中一共有k个类别。我们先算出我们的模型对于每个类别的AP,然后将这些AP相加在一起再除以所有类别的数量k,就可以得到最终模型的MAP。

例如:假设有两个主题,主题1有4个相关网页,主题2有3个相关网页。对于主题1检索出4个相关网页,其rank分别为1, 2, 4, 7,平均准确率为(1/1+2/2+3/4+4/7)/4=0.83;对于主题2检索出3个相关网页,其rank分别为1,3,5,平均准确率为(1/1+2/3+3/5+0+0)/5=0.45。则MAP= (0.83+0.45)/2=0.64。

scikit-learn接口:

1
2
3
4
5
6
import numpy as np
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])
result = average_precision_score(y_true, y_scores) # 计算AP
print(result)

MRR

定义:MRR(Mean Reciprocal Rank, 平均倒数排名)把标准答案在搜索结果中分数的排序取倒数作为它的准确度,再对所有的问题取平均。例如:

Query Results Correct response Rank Reciprocal Rank
cat catten, cati, cats cats 3 1/3
torus torri, tori, toruses tori 2 1/2
virus viruses, virii, viri viruses 1 1

注:黑体为返回结果中最匹配的一项

上表中的MRR=(1/3 + 1/2 + 1)/3 = 11/18=0.61

公式:

其中|Q|是查询个数,$rank_i$是第i个查询相对于第一个相关的结果所在的排列位置。

scikit-learn接口:

1
2
3
4
5
6
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]])
result = label_ranking_average_precision_score(y_true, y_score)
print(result)

NDCG

定义:NDCG(Normalized Discounted Cumulative Gain, 归一化折损累计增益),在MAP中,四个文档和query要么相关,要么不相关,即相关度只能是0或1。NDCG对MAP进行了改进,相关度分成从0到r等级。当取r=5时,等级设定如下图所示:

Relevance Rating Gain
Perfect $31=2^5-1$
Excellent $15=2^4-1$
Good $7=2^3-1$
Fair $3=2^2-1$
xxx $1=2^1-1$
Bad $0=2^0-1$

我们将这些增益相加就是CG(Cumulative Gain,累计增益,),CG就是将每个推荐结果相关性的分支累加后作为整个推荐列表的得分。

其中$rel_i$表示处于位置i的推荐结果的相关性。

Relevance Rating Gain Cumulative Gain
#1 http://abc.go.com/ 31 31=31x1
#2 http://www.abcteach.com/ 3 34=31+3
#3 http://abcnews.go.com/sections/scitech/ 15 49=31+3+15
#4 http://www.abc.net.au/ 15 64=31+3+15+15
#5 http://abcnews.go.com/ 15 79=31+3+15+15+15
#6

考虑到一般情况下用户会优先点选排在前面的搜索结果,所以应该引入一个折算因子(discounting factor),这时将计算得到DCG(Discounted Cumulative Gain)值。

Relevance Rating Gain Discounted Cumulative Gain
#1 http://abc.go.com/ 31 31=31x1
#2 http://www.abcteach.com/ 3 32.9=31+3x0.63
#3 http://abcnews.go.com/sections/scitech/ 15 40.4=32.9+15x0.50
#4 http://www.abc.net.au/ 15 46.9=40.4+15x0.43
#5 http://abcnews.go.com/ 15 52.7=46.9+15x0.39
#6

最后我们对DCG进行归一化得到NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益)。

其中IDCG(Ideal DCG),指推荐系统为某一用户返回的最好推荐结果列表,即假设返回结果按照相关性排序,最相关的结果放在前面,此序列的DCG为IDCG。因此DCG的值介于(0, IDCG],故NDCG的值介于(0,1]。

评估方法实现

参考

[1]: Precision and recall

[2]: https://en.wikipedia.org/wiki/Evaluation_measures_(information_retrieval)

[3]: Precision/Recall、ROC/AUC、AP/MAP等概念区分

[4]: IR的评价指标-MAP,NDCG和MRR

[5]: Mean reciprocal rank

[6]: 二分类模型评估指标的计算方法与代码实现

[7]: Discounted cumulative gain

[8]: 一个评测指标就是MAP(Mean Average Precision)平均精度均值。

显示 Gitment 评论