Bootstrap

机器学习中的模型评估方法和指标

机器学习模型的评估方法和指标

1、选择怎样的评估指标

1.1 Online metrics vs Offline metrics

Online metrics是直接在线上环境做AB测试,比较两个实验组的核心指标,比如CTR、转化率等。

Offline metrics是希望在模型上线之前,使用历史数据进行效果评估。离线指标有些是纯数学模型指标,有些是结合实际问题的量化指标。

1.2 单值评估指标 vs 多值评估指标

单值评估指标清晰明了,有利于最终的评估。如果有多个指标都是很重要的,可以将这多个值合并为一个值来表示。 比如取平均值或者加权平均值是将多个指标合并为一个指标的最常用方法之一。

1.3 指标的作用

一方面是让我们对当前的模型的好坏有一个量化的认知。 另一方面是在训练过程中以某一个指标作为训练算法的目标,通过优化目标来训练模型。

评价指标针对不同的机器学习任务有不同的指标,同一任务也有不同侧重点的评价指标。主要有分类(classification)、回归(regression)、排序(ranking)、聚类(clustering)、热门主题模型(topic modeling)、推荐(recommendation)等。

2、分类模型评价指标(Classification Metric)

分类有二分类和多分类,二分类主要“是”和“不是”的问题,可以扩展到多分类,如逻辑回归->SoftMax。

2.1 准确率

准确率是想要计算所有被分类器预测过的样本中,有多少比例是正确预测的。分类中使用模型对测试集进行分类,即分类正确的样本个数占总样本的比例:

问题

  1. 不同类别样本无区分:各个类平等对待,而实际中会针对不同类有所区分,例如医疗上侧重正例的召回(假阴性:不要漏诊疾病),垃圾邮件侧重垃圾邮件的精度(假阳性:正常邮件不被误分)。

  2. 数据不平衡:对于数据分布不平衡情况下,个别类别样本过多,其他类别样本少,大类别主导了准确率的计算。(平均准确率解决此问题)

#sklearn_example
from sklearn.metrics import accuracy_score
#y_pred是预测标签
y_pred, y_true=[1,2,3,4], [2,2,3,4]
accuracy_score(y_true=y_true, y_pred=y_pred)

2.2 平均准确率

针对不平衡数据,对n个类,计算每个类别i的准确率,然后求平均:

缺点:某些类别样本数很少,测试集中该类别的准确率方差会很大(统计变量偏离程度:高)。

from sklearn.metrics import average_precision_score
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
average_precision_score(y_true=y_true, y_score=y_pred)

2.3 基于混淆矩阵的评估度量

2.3.1 混淆矩阵

混淆矩阵通过计算各种分类度量,指导模型的评估。

(Actual)正例 (Actual)负例
(Predicted)正例 TP FP
(Predicted)负例 FN TN
  • 真阳性(True Positive,TP):指被分类器正确分类的正例数据

  • 真阴性(True Negative,TN):指被分类器正确分类的负例数据

  • 假阳性(False Positive,FP):被错误地标记为正例数据的负例数据

  • 假阴性(False Negative,FN):被错误地标记为负例数据的正例数据

from sklearn.metrics import confusion_matrix
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
confusion_matrix(y_true=y_true, y_pred=y_pred)

2.3.2 精确率(Precision)

精确率意味着其所选出的”正例“中有多少占比确实是对的,即为所有分正确的正样本/所有预测为正类的样本数。

2.3.3 召回率(Recall)

召回率又叫查全率,在我们更关心分类器对正例的判断结果的场景中经常使用,召回率意味着样本中的所有正例有多少占比被分类器给选出来了,所有分正确的正样本/所有的正样本数:

2.3.4 F1-score

在Precision和Recall的基础上提出了F1值的概念,是对Precision和Recall进行整体评价,F1-score中和了二者的评估:

简单来讲就是精确率和召回率的调和均值(倒数平均数的倒数),从评价来讲,精确率和准确率都高的情况下,F1 值也会高。

sklearn中classification_report可以直接输出各个类的precision、 recall 和f1-score support

from sklearn.metrics import classification_report
# y_pred是预测标签
y_pred, y_true =[1,0,1,0], [0,0,1,0]
print(classification_report(y_true=y_true, y_pred=y_pred))

2.4 AUC(Area under the Curve(Receiver Operating Characteristic, ROC))

AUC是ROC(Receiver Operating Characteristic)曲线下的面积。在此再次召唤出混淆矩阵:

(真实)肯定 (真实)否定
(预测)肯定 TP FP
(预测)否定 FN TN

TPR(True Positive Rate,真正类率)

分类器分类正确的正样本个数占总正样本个数的比例,意味着正例里有多少被合理召回了,即为召回率:

FPR&#x

;