模型评估——评估指标的局限性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型评估——评估指标的局限性相关的知识,希望对你有一定的参考价值。

参考技术A 在模型评估过程中,往往对于不同的模型,需要不同的指标进行评估,在众多评估指标中,大部分指标只能反映模型的部分性能,如果不能合理的利用指标进行评估,往往达不到好的效果,甚至还能起到副作用。

1 准确率(Accuracy) : 分类正确的样本占总样本个数的比例。

当不同的类别的样本比例非常不均衡时,将准确率作为分类性能的指标非常的局限,可以使用更加有效的平均准确率

2 精确率(Precision):分类正确的正样本个数占分类器判定为正样本个数的比例。

3 召回率(Recall): 分类正确的正样本个数占真正的正样本个数的比例。

4 Precision 和 Recall 是即矛盾又统一的两个指标。通常要绘制P-R曲线,单个点对应的精确率和召回率并不能全面的衡量模型的性能,画曲线能对模型进行更为全面的评估

5 F1值和ROC曲线也能综合反映一个排序模型性能。ROC曲线后面一节再说,F1值是精确率和召回率的调和均值。

6 均方根误差,通常用来衡量回归模型的好坏,但是如果存在个别偏离程度大的离群点,即使离群点非常少,也会让rmse 指标变得很差。

模型性能评估

模型性能评估

模型性能评估是为了评价模型的泛化能力,模型性能评估主要有两个问题要解决:

1)用什么数据来评估?

2)用什么标准来评估?

 下面的第一节内容主要解答用什么数据来评估模型的性能,第二节解答用什么标准来评估。

1.用什么数据来评估模型性能

常用的有3中,按照复杂程度程度排序分别为:

1)训练集+测试集

2)holdout方法

3)K折交叉验证

其中第1种方法是用测试集来评估模型的性能;第二种方法是用验证集+测试集来评估,验证集用于训练过程中的评估,测试集用于最终的评估;第3种方法也是用验证集+测试集的方式,但是不同于第2种,在k折交叉验证方法下验证集是不重复的,且一次训练会得到k个模型。

1.1 训练集+测试集

最简单的方法,就是将数据集按比例分为训练集和测试集,训练集用来训练模型,测试集用来测试模型性能;

优点:简洁,易操作;

缺点:鲁棒性差,可能存在性能评估失真和过拟合情况;(原因:重复使用同一组测试集来评估,意味这测试集也在间接的参与模型训练,那么测试集有又当运动员又当裁判的风险)

scikit-learn库中的model_selection模块下提供了train_test_split方法,专门用于这种方式的数据集划分;

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)

参数中的test_size是指测试集占全部数据的比例。

1.2 holdout方法

该方法是机器学习模型泛化性能的一个经典且常用的方法;

holdout方法是在前一种方法的基础上改进而来,它把数据集划分为3个部分:1)训练集,2)验证集,3)测试集;

在模型训练和参数调优阶段,只使用验证集对模型做性能评估,在训练的过程中选择那些在训练集和验证集上表现都良好的模型,最后才在测试集上对模型性能进行泛化评估;这样会大大减少测试集使用的次数,减少过拟合的风险。

优点:降低模型过拟合风险;

缺点:模型性能对训练集数据划分为训练及验证子集的方法是敏感的,评价结果会随样本的不同而发生变化。

1.3 K折交叉验证

在k折交叉验证方法中,我们将不重复并随机的将训练数据划分为k个,其中k-1个用于模型的训练,剩下一个用于模型的测试,重复此过程k次,得到k个模型以及其性能评价;

一般过程如下:

1)选择一套超参,进行K折交叉验证,记录此套超参在K折交叉验证下的性能评价(一般是K个模型的性能评价的平均);

2)更换超参,继续1)步骤中的方法;

3)所有超参完成训练;

4)选取其中表现最好的超参数,使用这套超参值在所有的训练集上重新训练模型;

5)使用独立的测试集对最终的模型进行测试评价;

该方法的重点是:无重复抽样,即将数据集划分为k个之后,每次选择不同的块作为交叉验证中的验证集,保证不会有重复的验证集。

scikit-learn库中的model_selection模块中有StratifiedKFold类,可以方便的进行操作:

import numpy as np
from sklearn.model_selection import StratifiedKFold

X = np.array([    [1,2],    [3,4],    [1,3],    [2,4],    [2,3],
    [1,4],
    ])
y = np.array([0,0,0,1,1,1])

skf = StratifiedKFold(n_splits=3)
for train_index,valid_index in skf.split(X,y):
    print("train:",train_index,"valid:",valid_index)
    X_train,X_valid = X[train_index],X[valid_index]
    y_train,y_valid = y[train_index],y[valid_index]
创建类时传入的n_split参数代表k折中的k;
执行结果如下:

技术图片

 

 

2.用什么标准来评价模块性能的好坏

在分类模型中,最常用评价标准就是错误率;但是除了错误率,还有准确率,召回率,F1分数等评价指标,在不同的应用场景下,不同的评价指标可能会带来更好的效果;在介绍这些指标之前先介绍它们的基础--混淆矩阵;

2.1 混淆矩阵(confusion matrix)

混淆矩阵是一个简单的方阵,用于显示一个分类器的分类效果;

如下图所示:

技术图片

为简化叙述,下面以二分类模型来描述:

在二分类中模型中,有4个变量:1)真正(true positive),2)真负(true negative),3)假正(false positive),4)假负(false negative);这4个变量分布如下图,变量值代表属于此类的数据个数。

技术图片

scikit-learn库中的metrics模块中有confusion_matrix方法,可以直接调用此方法来生成混淆矩阵:

from sklearn.metrics import confusion_matrix

confmat = confusion_matrix(y_true=y_test,y_pred=y_pred)

confusion_matrix方法中的参数分别为实际测试样本的类标以及使用模型预测出来测试样本的类标。

 2.2 分类模型的准确率与召回率

这里定义了3个不同的评价指标,根据实际应用需要可以选择其中合适的指标作为模型评价标准,或者通过组合变换实现更复杂的评价指标。

准确率:预测为正的数据中实际为正的比率;$PRE = \\fracTPTP+FP$;

召回率:实际为正的样本被预测正确的比率;$REC=\\fracTPTP+FN$;

F1分数:$F1=2\\fracPRE\\times RECPRE+REC$

scikit-learn库中的metrics模块中有precision_score,recall_score,f1_score方法,使用方法与confusion_matrix相同。

这些指标都只是参考,有需要的话可以自己订制指标。

 

以上是关于模型评估——评估指标的局限性的主要内容,如果未能解决你的问题,请参考以下文章

机器学习模型评估

机器学习:模型评估

模型性能评估

你应该知道的模型评估的五个方法

第二章 模型评估与选择

[人工智能-综述-10]:模型评估 - 常见的模型评估指标与方法大全汇总