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

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(False Positive Rate,负正类率)

分类器分类错误的负样本个数占总负样本个数的比例,意味着负例里有多少被失误召回了:

TNR(True Negative Rate,真负类率)

计算的是分类器所正确识别出的负实例占所有负实例的比例。

ROC曲线

ROC曲线是以横坐标为 FPR ,以纵坐标为 TPR ,画出的一条曲线。 ROC曲线越靠拢(0,1)点,越偏离45度对角线越好。描述分类器的True Positive Rate与False Positive Rate之间的变化关系。

绘制ROC曲线。

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# y_test:实际的标签, dataset_pred:预测的概率值。
fpr, tpr, thresholds = roc_curve(y_test, dataset_pred)
roc_auc = auc(fpr, tpr)
#画图,只需要plt.plot(fpr,tpr),变量roc_auc只是记录auc的值,通过auc()函数能计算出来
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()

AUC

AUC(Area under Curve):Roc曲线下的面积,显然这个面积的数值不会大于1。AUC取值范围[0.5, 1],越大表示模型效果越好。其计算公式:

M为正类样本的数目,N为负类样本的数目,Ranki是样本i模型预测概率的排名。

from sklearn.metrics import roc_auc_score
# y_test:实际的标签, dataset_pred:预测的概率值。
roc_auc_score(y_test, dataset_pred)

3、回归模型评价指标 Regression Metric

回归是对连续的实数值进行预测,而分类中是离散值。

3.1 平方根误差(root mean square error,RMSE)

均方误差的方根,可从单位度量上衡量模型的效果定义为:

其中,yi是真实值,yi-hat是预测值,n是样本数量,使用了欧式距离。

缺点:平均值是非鲁棒的,对于异常点敏感,如果某个异常点误差大,整个RMSE就会比较大。

3.2 均方差(mean squared error,MSE)

真实目标y与估计值y-hat之间差值的平方的平均值,对比平均绝对误差,均方误差对异常值更敏感。

from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)

3.3 平均绝对误差(mean_absolute_error,MAE)

真实目标y与估计值y-hat之间差值的平均值:

from sklearn.metrics import mean_squared_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
mean_squared_error(y_true, y_pred)123

3.4 中值绝对误差(Median absolute error)

from sklearn.metrics import median_absolute_error
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
median_absolute_error(y_true, y_pred)123

上述几个验证误差交叉验证误差越小,就代表模型的性能越好。

3.5 R2 决定系数(r2_score)

R2用来说明目标的变化由特征引起的比例,R2的值是多少代表模型的性能好?谁也不知道。有的例子中,只要R2达到0.5-0.6就已经很好了。此外,从理论上来说,只要增加特征的个数,R2的值是一直增加的,不管这个特征x和目标y是否有关。因此,R2通常用于特征选择。如果增加一个特征,模型的R2值上升很多,那就说明这个特征和目标有关。

from sklearn.metrics import r2_score
y_true, y_pred = [3, -0.5, 2, 7], [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)

4、损失函数与风险函数

损失函数度量模型预测一次的好坏,即模型预测一次其预测值与真实值之间的差别。

风险函数度量模型平均意义上预测能力的好坏,即模型预测n次预测值与真实值差别的平均。

4.1 损失函数与风险函数

监督学习问题是在假设的空间F中选取模型 f 作为决策函数,对于给定的输入 X,由 f(x) 给定输出Y, 这个输出的预测值与真实值 Y可能不一致,用一个函数来度量预测错误的程度表示这种不一致,这个函数就是损失函数或者代价函数;记f(X)为模型的输出预测值,Y为对应输入的真实值,则损失函数为f(x)和Y的非负实值函数,记为L(Y,f(x))。常见的损失函数有:

4.1.1 0-1损失

0-1损失函数通过比较真实值与预测值是否相等进行度量模型的好坏,若预测值与真实值相等则L=0,不相等则L=1,其为一种“是与非”的思想,而并不考虑预测值与真实值之间的差距。

,,

4.1.2 平方损失函数

平方损失函数度量的是预测值与真实值之间的距离,用进行计算。

4.1.3 绝对损失函数

绝对损失函数度量的同样是预测值与真实值之间的距离,用进行计算。

4.1.4 对数损失函数

针对分类输出不是类别,而是类别的概率,使用对数损失函数进行评价。这也是逻辑回归的分类函数,下面是二分类的损失函数。

其实就是真实值与预测值的交叉熵,包含了真实分布的熵加上假设与真实分布不同的分布的不确定性,最小化交叉熵,便是最大化分类器的准确率。

from sklearn.metrics import log_loss
y_true, y_pred = [0,0,1,1], [[0.9,0.1],[0.8,0.2],[0.3,0.7],[0.01,0.99]]
print(log_loss(y_true,y_pred))

损失函数值越小,模型越好;由于模式的输入,输出(X,Y)是随机变量,有联合分布P(X,Y) ,所以损失函数的期望是:

4.2 经验风险和结构风险最小化

上面关于联合概率的平均意义下的损失,也被叫做风险函数;由于联合概率是未知的,不能从上式中求出风险函数;而对于给到的训练集 T = {(X,Y),(X2,Y2),.........},模型 f(x) 关于训练集数据的平均损失称为经验风险

根据大数定律:当样本容量趋于无穷大的时候,经验风险 趋于 期望风险。

经验最小化求解的最优模型:

当样本容量足够大的时候,经验风险最小化能保证有很好的学习效果,但样本数量小的时候,就会产生“过拟合”现象。因为参数太多,会导致我们的模型复杂度上升,容易过拟合(训练误差会很小),但训练误差小不是我们的终极目标,我们的目标也是测试误差也小,所以我们要保证模型最简单的基础下最小化训练误差;模型复杂度可以通过正则函数来实现(约束我们的模型特征),强行的让模型稀疏,低秩,平滑等。

结构风险最小化是为了防止过拟合提出的策略,结构风险最小化等价于正则化。结构风险的经验在经验风险上加上表示模型复杂度的正则化项或惩罚项;结构风险的定义:

其中 J( f ) 为模型的复杂度,可以采用正则化与交叉验证来防止模型过拟合。

5、错误分析与假设检验

在前文中,我们了解了模型的评估方法和性能度量,看起来就能够对学习器进行评估比较了:先使用某种评估方法测得学习器的某个性能度量结果,然后对这些结果进行比较。那么如何作比较呢?是直接取得性能度量的值然后比“大小”吗?但实际上没有这么简单,因为我们希望比较的是泛化性能,但通过实验的方法我们能获得的只是测试集上的性能,两者未必相同,其次,由于测试集选择的不同,测试集上的性能也未必相同,第三,很多机器学习算法本身具有一定的随机性例如常见的K-Means),即使是同一个算法,因为参数设置的不同,产生的结果也不同。那么有没有合适的方法去比较学习器的性能呢?这就是比较检验,偏差与方差可以解释学习器泛化性能。

5.1 方差与偏差分析

偏差-方差分解是解释学习器泛化性能的重要工具。在学习算法中:

偏差Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力。偏差是模型本身导致的误差,即错误的模型假设所导致的误差,它是模型的预测值的数学期望和真实值之间的差距。

方差Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性,反应预测的波动情况。方差是由于对训练样本集的小波动敏感而导致的误差。它可以理解为模型预测值的变化范围,即模型预测值的波动程度。

通过对泛化误差的进行分解,可以得到:

  • 期望泛化误差=方差+偏差

  • 偏差刻画学习器的拟合能力

  • 方差体现学习器的稳定性

易知:方差和偏差具有矛盾性,这就是常说的偏差-方差窘境(bias-variance dilamma),随着训练程度的提升,期望预测值与真实值之间的差异越来越小,即偏差越来越小,但是另一方面,随着训练程度加大,学习算法对数据集的波动越来越敏感,方差值越来越大。换句话说:在欠拟合时,偏差主导泛化误差,而训练到一定程度后,偏差越来越小,方差主导了泛化误差。因此训练也不要贪杯,适度辄止。

5.2 假设检验

统计假设检验能够为我们进行学习器性能比较提供依据,基于假设检验的结果,可以推断出,如果在测试集上观察到学习器A比B好,则A的泛化性能是否优于B,以及这个结论的把握有多大。

假设检验:先对总体参数提出某种假设,然后利用样本数据判断假设是否成立。在逻辑上,假设检验采用了反证法,即先提出假设,再通过适当的统计学方法证明这个假设基本不可能是真的。(说“基本”是因为统计得出的结果来自于随机样本,结论不可能是绝对的,所以我们只能根据概率上的一些依据进行相关的判断。)

假设检验依据的是小概率思想,即小概率事件在一次试验中基本上不会发生。

如果样本数据拒绝该假设,那么我们说该假设检验结果具有统计显著性。一项检验结果在统计上是“显著的”,意思是指样本和总体之间的差别不是由于抽样误差或偶然而造成的。

6、对目前模型评估与优化方向的思考

基于Transformer的Google BERT,即首先使用大量无监督语料进行语言模型预训练(Pre-training),再使用少量标注语料进行微调(Fine-tuning)来完成具体NLP任务(分类、序列标注、句间关系判断和机器阅读理解等)。

6.1 模型的问题

  1. 训练效果还可以,实际效果较差;

  2. 多分类中,针对各个类别的效果不同。

分析一下模型是Overfitting还是Underfitting,从数据、特征和模型等环节做针对性优化。

训练集表现 测试集表现 问题
< 期望目标值 < 期望目标值 Underfitting
> 期望目标值 接近或略逊于训练集 合适
> 期望目标值 远差于训练集 Overfitting

6.2 优化方向

6.2.1 数据方面

根据不同的分类业务场景,数据优化方面的主要工作是:

  • 从原始数据,如文本、图像或者应用数据中清洗出特征数据和标注数据。

  • 对清洗出的特征和标注数据进行处理,例如样本采样,样本调权,异常点去除,特征归一化处理,特征变化,特征组合等过程。最终生成的数据主要是供模型训练使用。

问题 数据 特征 模型
Underfitting 清洗数据 1. 增加特征 2. 删除噪音特征 1. 调低正则项的惩罚参数 2. 换更“复杂”的模型(如把线性模型换为非线性模型) 3. 多个模型级联或组合
Overfitting 增加数据 1. 进行特征选择 2. 降维(如对特征进行聚类、主题模型进行处理等) 1. 提高正则项的惩罚参数 2. 减少训练迭代次数 3. 换更“简单”的模型(如把非线性模型换为线性模型)

6.2.2 模型方面

  1. 预训练效率方面:混合精度训练方式

    为了进一步加快MT-BERT预训练和推理速度, 实验了混合精度训练方式。混合精度训练指的是FP32和FP16混合的训练方式,使用混合精度训练可以加速训练过程并且减少显存开销,同时兼顾FP32的稳定性和FP16的速度。

  2. 领域迁移、知识融入

    发挥领域数据的优势,考虑在Google中文BERT模型上加入领域数据继续训练进行领域自适应(Domain Adaptation),使得模型更加匹配我们的业务场景。常识(Common Sense)的缺失、缺乏对语义的理解,尝试在MT-BERT预训练过程中融入知识图谱信息。知识图谱可以组织现实世界中的知识,描述客观概念、实体、关系。这种基于符号语义的计算模型,可以为BERT提供先验知识,使其具备一定的常识和推理能力。使模型从对单字建模实现对实体的建模,以及它跟上下文其他实体之间的关联,增强了模型语义表征能力。

  3. 模型轻量化

  • 模型裁剪和剪枝。减少模型层数和参数规模。

  • 低精度量化。在模型训练和推理中使用低精度(FP16甚至INT8、二值网络)表示取代原有精度(FP32)表示。

  • 模型蒸馏。通过知识蒸馏方法基于原始BERT模型蒸馏出符合上线要求的小模型。

  1. 通过在业务数据上进行微调,支持不同类型的业务需求

    例如单句分类中的细粒度情感分析,设计了基于MT-BERT的多任务分类模型。模型架构整体分为两部分:一部分是各情感维度的参数共享层(Share Layers),另一部分为各情感维度的参数独享层(Task-specific Layers)。其中参数共享层采用了MT-BERT预训练语言模型得到文本的上下文表征。MT-BERT依赖其深层网络结构以及海量数据预训练,可以更好的表征上下文信息,尤其擅长提取深层次的语义信息。 参数独享层采用多路并行的Attention+Softmax组合结构,对文本在各个属性上的情感倾向进行分类预测。

附录

sklearn-metrics

Scoring Function Comment
Classification
‘accuracy’ metrics.accuracy_score
‘average_precision’ metrics.average_precision_score
‘f1’ metrics.f1_score for binary targets
‘f1_micro’ metrics.f1_score micro-averaged
‘f1_macro’ metrics.f1_score macro-averaged
‘f1_weighted’ metrics.f1_score weighted average
‘f1_samples’ metrics.f1_score by multilabel sample
‘neg_log_loss’ metrics.log_loss requires predict_proba support
‘precision’ etc. metrics.precision_score suffixes apply as with ‘f1’
‘recall’ etc. metrics.recall_score suffixes apply as with ‘f1’
‘roc_auc’ metrics.roc_auc_score
Clustering
‘adjusted_rand_score’ metrics.adjusted_rand_score
Regression
‘neg_mean_absolute_error’ metrics.mean_absolute_error
‘neg_mean_squared_error’ metrics.mean_squared_error
‘neg_median_absolute_error’ metrics.median_absolute_error
‘r2’ metrics.r2_score

参考文献

scikit-learn中的metric 3.3. Metrics and scoring: quantifying the quality of predictions — scikit-learn 1.0.2 documentation

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

https://www.analyticsvidhya.com/blog/2016/02/7-important-model-evaluation-error-metrics/

https://towardsdatascience.com/metrics-to-evaluate-your-machine-learning-algorithm-f10ba6e38234

https://en.wikipedia.org/wiki/Association_rule_learning#Useful_Concepts

Metrics – Classification Report Breakdown (Precision, Recall, F1) – Josh Lawman

美团BERT的探索和实践 - 美团技术团队

李航, 统计学习方法[M],北京:清华大学出版社,2012

周志华, 机器学习

机器学习中的模型评估方法和指标相关推荐

  1. ML之ME/LF:机器学习中常见模型评估指标/损失函数(LiR损失、L1损失、L2损失、Logistic损失)求梯度/求导、案例应用之详细攻略

    ML之ME/LF:机器学习中常见模型评估指标/损失函数(LiR损失.L1损失.L2损失.Logistic损失)求梯度/求导.案例应用之详细攻略 目录 常见损失函数求梯度案例 1.线性回归求梯度 2.L ...

  2. ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介、损失函数/代价函数/目标函数之间区别、案例应用之详细攻略

    ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介.损失函数/代价函数/目标函数之间区别.案例应用之详细攻略 目录 损失函数的简介 损失函数/代价函数/目标函数之间区别 损失 ...

  3. 机器学习中的模型评价、模型选择及算法选择

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 正确使用模型评估.模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要.本文将对这三个任务的相关技术 ...

  4. 一文读懂机器学习中的模型偏差

    一文读懂机器学习中的模型偏差 http://blog.sina.com.cn/s/blog_cfa68e330102yz2c.html 在人工智能(AI)和机器学习(ML)领域,将预测模型参与决策过程 ...

  5. ML:机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率)

    ML:机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率) 目录 机器学习中与模型相关的一些常见的判断逻辑(根据自调整阈值计算阳性率)

  6. 机器学习中树模型算法总结之 决策树(下)

    写在前面 首先回顾一下上一篇的相关内容,主要是理论的介绍了决策树的模型及几种常见的特征选择准则,具体可参见机器学习中树模型算法总结之 决策树(上).今天主要接着学习,包括决策树的生成(依赖于第一篇的三 ...

  7. 机器学习中的模型是什么?

    在机器学习中,模型是指一种数学函数,它能够将输入数据映射到预测输出.模型是机器学习算法的核心部分,通过学习训练数据来自适应地调整模型参数,以最小化预测输出与真实标签之间的误差. 机器学习中的模型是什么 ...

  8. 干货丨机器学习中的模型评价、模型选择与算法选择

    本论文回顾了用于解决模型评估.模型选择和算法选择三项任务的不同技术,并参考理论和实证研究讨论了每一项技术的主要优势和劣势.进而,给出建议以促进机器学习研究与应用方面的最佳实践. 1 简介:基本的模型评 ...

  9. 3. 机器学习中为什么需要梯度下降_机器学习中一些模型为什么要对数据归一化?...

    一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释: 1)归一化后加快了梯度下降求最优解的速度 蓝 ...

最新文章

  1. 苹果公司揭秘首批列入 Swift 源代码兼容性开源项目清单
  2. idea_pyspark 环境配置
  3. java数据库驱动_Java数据库驱动链接大全
  4. BZOJ 3910 并查集+线段树合并
  5. 十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?
  6. 蛋白结构建模与优化_最终幻想: 无中生有的蛋白质从头设计
  7. 连载 3:利用 matlab计算卷积
  8. strcpy的用法、c语言实现、及注意点
  9. python简单笔试题_这十道经典Python笔试题,全做对算我输
  10. android swf 文件播放器,swf播放器怎么用?swf播放器安卓版使用教程
  11. 如何批量将 jpg 图片转换为 png 格式
  12. 使用U盘重装win10系统
  13. 如何画出diffusion models的扩散过程示意图?
  14. 精读《对 Markdown 的思考》
  15. IOC容器中bean的生命周期
  16. java 如何定时_Java怎么实现定时提醒功能
  17. django图形验证码和邮件
  18. python画十字_python matplotlib作带上下限的十字图
  19. Leetcode_6_Z字形变换_模拟
  20. oauth0 oauth2_OAuth需要死于大火

热门文章

  1. android获取ro._Android应用获取系统属性
  2. 数字图像处理 基于傅里叶变换的图像拼接
  3. 哈佛大学图书馆二十条训言_ywyuan_新浪博客
  4. Dalvik与ART的GC调试
  5. 53岁周鸿祎考上清华博士;图灵奖得主杨立昆炮轰ChatGPT:五年内就没人用了;Red Hat恪守对开源的承诺|极客头条...
  6. 智慧养老解决方案之养老院人员定位系统,医养结合式养老,高精准人员定位-新导智能
  7. 融入6S教学法的机器人教育
  8. 使用 KMS 驱动进行数据加密
  9. EasyExcel导入小数转BigDecimal精度问题
  10. Java实现小程序订阅消息