社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

数据挖掘与大数据分析 • 7 年前 • 796 次点击  

作者:Sebastian Raschka

翻译:reason_W

编辑:周翔


简介


正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾,并就每种技术的理论和实证研究的主要优缺点进行讨论。文章还将就机器学习算法中的超参数调优给出尽可能的建议,用以实现最佳的算法效果。文中内容涉及很多常用方法,比如模型评估和选择中的Holdout方法等;介绍了bootstrap技术的不同变体,通过正态逼近得到置信区间来衡量性能估计(performance estimates)的不确定性;在讨论偏差-方差(bias-variance)折中方案时,对比了留一交叉验证法(leave-one-out cross validation)和k-fold交叉验证法,并提供了在k-fold交叉验证中最优k值的选择技巧。

 

1. 引言:基本模型评价术语和技术


机器学习已经逐渐深入到了我们生活的中心。无论是学术研究还是商业应用,共同的出发点都是希望做出“好”的预测。把模型拟合到训练数据上是一方面,但怎么才能知道模型在未知数据上的泛化性能呢?如何针对手头的问题在不同算法间选择出最好的模型呢?模型评估当然不会是机器学习通向的终点。在处理任何数据之前,我们都希望可以提前计划并针对任务选择合适的技术。在这篇文章中,我们就将讨论这些技术的优劣,并通过一个典型的机器学习工作流程,展示其应用的方法。


1.1 性能估计:泛化性能与模型选择


机器学习模型的性能估计流程可以分为以下三步:

  1. 将训练数据输入到学习算法中,以学习模型;

  2. 用模型预测测试集标签;

  3. 计算模型在测试集上的错误率,推导出模型预测精度。

 

然而,当要实现不同的目标时,模型性能估计就不像我们总结的那样简单了。也许我们应该从另一个角度来回答前面的问题:“我们为什么要关心性能估计?” 理想情况下,模型的估计性能说明了它在未知数据上的表现如何——在机器学习的应用或新算法的开发中,对未来数据进行预测通常是我们想要解决的主要问题。

 

通常,机器学习需要大量的实验才能实现最好的算法效果,例如,学习算法的内部参数(所谓的超参数)的调优。由于我们要从这个模型集合中选择最好的模型,所以就需要找到一种方法来评估不同模型的性能,以便对它们进行排序。除了算法调优之外,通常我们还需要尝试多种可以在特定条件下实现最优的单一算法。在比较不同的算法时,我们主要关注预测和计算性能。

 

总结来说,我们进行模型预测性能评估的主要原因有以下三点:

  1. 我们想要估计模型的泛化性能,即模型对未知数据的预测性能。

  2. 我们希望通过调整学习算法和从给定的假设空间中选择最佳的执行模型来提高预测性能。

  3. 我们想要确定最适合于手头问题的机器学习算法;因此,我们需要比较不同的算法,从算法的假设空间中选择最佳性能的算法和最佳的执行模型。

 

尽管上面列出的这三个子任务都需要评估模型的性能,但是却需要不同的方法。我们将在本文中讨论处理这些子任务的不同方法。

 

模型的绝对性能估计或许是机器学习中最具挑战性的任务之一。为了方便比较不同模型的性能,我们可以在选择估计它们的有偏性能(biased performance),当然前提是偏差对所有的模型造成的影响相同。对模型性能的估计偏差并不会影响其相对排名顺序。比如有三种模型,其准确率如下:


M2: 75% > M1: 70% > M3: 65%,


即使增加10%的悲观偏差,仍然不影响排序。


M2: 65% > M1: 60% > M3: 55%。


1.2 假设和术语


模型评估是一个复杂的课题。为了确保不过多地偏离核心信息,我们会先做一些假设,并列举一些稍后会用到的技术术语。


i.i.d.(independent and identically distributed): 独立同分布假设。即所有样本都是从相同的概率分布中抽取出来的,并且在统计上相互独立。但时态数据(temporal date)或时间序列(time-series data)数据不满足该假设。

 

监督学习和分类:本文主要讨论监督学习,这是机器学习的一个子类。虽然许多概念也适用于回归分析,但我们将把重点放在分类上,即将类别目标标签分配给训练和测试样本。

 

0-1损失和预测准确率:预测准确率可以用正确预测的数量除以样本总量n得到,其公式可以表达为:

其中错误率ERR是数据集S中n 个样本0-1损失的期望值

0-1损失定义为:

其中是第i个实际的类标签,是第i个样本预测的类标签。我们的目标是学习到一个泛化性能良好的模型,使得其预测准确率最高,或者说作出错误预测的概率最低:

其中D是生成的数据集服从的分布,x是训练样本特征向量,y是对应的标签。


偏差:在本文中,偏差一词是指统计偏差(而不是机器学习系统中的偏差)。一般而言,估计值(estimator) 的偏差是期望值与真实值之差。

所以,若偏差,则就是的无偏估计。再准确一点,预测偏差是模型的期望预测准确率和实际预测准确率的差。而我们在训练集上计算得到的准确率就是绝对准确率的乐观有偏估计,因为它过高估计了模型的准确率。


方差:方差就是估计值与其期望值的统计方差:

方差是一个模型预测性能变化程度的度量,如果我们多次重复学习过程,就会会发现模型在训练集上的表现存在小的波动。模型构建过程对这些波动的敏感性越高,方差就越大。

 

最后,模型、假设、分类器、学习算法和参数的术语在本文中的定义如下:


目标函数:f在预测建模时,我们需要对特定过程建模,然后去学习或逼近一个特定的未知函数。目标函数f(x)=y就是我们想要对其建模的真实函数f(·)。

 

假设:假设实际上是一个确定的函数,我们相信(或希望)该函数与我们想要建模的真实函数非常相似。比如在对垃圾邮件进行分类时,我们提出的分类规则可以将垃圾邮件与非垃圾邮件区分开。

 

模型:在机器学习领域中,假设和模型这两个术语常常可以互换使用。而在其他领域中,这些术语往往代表有不同的含义:一个假设可以认为是研究人员“有根据的猜测”,而模型则是用来检验这个假设的猜想的表现。

 

学习算法:我们的目标是学习或逼近目标函数,学习算法则是一组试图用训练数据集对目标函数进行建模的指令。每个学习算法都会有一个假设空间,即一组可能的假设的集合,这个集合通过系统地描述最终假设(formulating the final hypotheses)对未知的目标函数进行建模。


超参数:超参数是机器学习算法的调优参数(tuning parameters),例如,逻辑回归损失函数中L2惩罚的正则化强度(regularization strength),或决策树分类器最大深度的设置值。而模型参数则是学习算法拟合训练数据的参数——即模型本身的参数。例如,线性回归直线的加权系数(或斜率)及其偏差项(这里指y轴截距)都是模型参数。


1.3 Resubstitution验证和Holdout方法


Holdout 方法无疑是最简单的模型评估技术,它可以概括如下:首先,我们把标签数据集分割成两个部分:一个训练集和一个测试集。然后,我们把模型在训练数据上进行拟合,并预测测试集标签。正确预测所占的比例,可以通过比较预测的标签和测试集的真实标签计算出来,以此构成我们对模型预测准确率的评估。这里需要注意的是,我们不在同一个训练数据集上训练和评估一个模型(这称为Resubstitution验证或Resubstitution评估),因为它通常会带来由于过拟合而产生的非常乐观的偏差。换句话说,我们无法判断模型是仅仅简单地记住了训练数据,还是对新的、未知数据进行了泛化。(另一方面,我们可以把训练集和测试集准确率的差别看做这种所谓的乐观有偏估计。)

 

通常,将数据集拆分为训练集和测试集是一个简单的随机抽样过程。我们假设每一类所有的数据点都是按照相同的概率分布得到的。我们随机选择三分之二的样本用作训练集,三分之一的样本用作测试集。但这一方法还有两个问题,我们会在下一节中讨论。


1.4 层次化(Stratification)


数据集是从某个概率分布中抽取的随机样本的代表,我们通常假设这个数据集是真实数据的代表。在没有替换的情况下,进一步的下采样会改变样本的统计量(平均值、比例和方差)。这种没有替换的下采样对样本统计量的影响程度与样本的大小成反比。让我们来看一个使用Iris数据集的例子,我们将其随机分为2/3的训练数据和1/3的测试数据,如图1所示。(生成此图形的源代码可在GitHub上找到)。


图1:Iris的花类在随机抽样的训练集和测试集上的分布(三种颜色代表三种花的类别)


当我们将一个标记的数据集随机分为训练和测试集时,我们就违反了统计独立的假设。Iris数据集包括50个Setosa, 50个Versicolor,,和50个Virginica;花的种类均匀分布:

  • 33.3% Setosa

  • 33.3% Versicolor

  • 33.3% Virginica

 

如果一个随机的函数将2/3的花(100)分配给训练集,1/3的花(50)分配给测试集,它可能会产生以下结果(如图1所示):

  • 训练集:38Setosa, 28Versicolor, 34Virginica

  • 测试集:12Setosa, 22Versicolor, 16Virginica

 

假设Iris数据集是真实种群的代表(比如假设Iris flower在自然界是均匀分布的),我们就创建了两个非均匀类分布的不平衡数据集。学习算法用于学习模型的类别比例为“38% / 28% / 34%”。用于评估模型的测试数据集也不平衡,更糟的是,它在“相反的”方向上是平衡的:“24% / 44% / 32%”。除非学习算法对这些干扰完全不敏感,否则结果会很不理想。如果一个数据集在随机抽样之前有很高的类别不平衡,那么问题就更严重了。在最坏的情况下,测试集甚至不包含任何少数类的样本。因此,推荐的做法是用层次化的方式划分数据集。在这里,层次化仅仅意味着我们随机地划分一个数据集使得其子集(训练集和测试集)可以正确地表示每个类——换句话说,层次化是一种保持类别在所得子集中的原始比例的方法。

 

需要指出的是,以非层次化的方式下随机抽样,在使用相对较大和类别较平衡的数据集时通常不是一个大问题。然而,在我看来,层次化重采样在机器学习应用中通常是有益的。此外,层次化抽样非常容易实现,Ron Kohavi为此提供了经验性的证据[Kohavi, 1995],层次化也有助于k-fold交叉验证中方差和偏差的估计。


1.5 Holdout验证

 

图2 Holdout验证方法的可视化总结


图2提供了Holdout验证方法的可视化总结。下面我们将详细讨论这个方法的优点和缺点。

 

步骤1 :首先,我们将可用的数据随机分为两个子集:一个训练集和一个测试集。对模型来说,测试集代表未知数据;还有一点是,当我们估计泛化性能时,为了避免引入偏差,测试集只能使用一次。通常情况下,我们将2/3的数据分配给训练集,1/3的数据分配给测试集。其他常见的训练/测试分割是60/ 40,70 /30,或80/20 ——如果数据集比较大的话,甚至能到90/10。

 

步骤2 :在获得测试样本之后,我们需要选择一个适合给定问题的学习算法。从图2可以看到超参数值,超参数是我们学习算法的参数。我们必须手动指定这些超参数值——和实际模型参数不同,学习算法不会自动从训练数据学习这些参数。由于在模型拟合过程中没有学习超参数,所以我们需要针对任务进行一些“额外的过程”或“外部循环”来分别优化这些参数——这种Holdout方法是病态的。因此,目前我们必须使用一些固定的超参数值——如果是用现有的机器学习库,我们可以使用现成的默认参数或根据直觉设置参数值。

 

步骤3:学习算法在前面的步骤中拟合一个模型后,下一个问题是:生成模型的性能到底有多“好”?这就是独立测试集发挥作用的地方。由于学习算法还没有“见过”这个测试集,所以它应该对未知数据给出一个相对公正的估计。现在,我们使用模型来对这个测试集进行类标签预测。然后,我们将预测的类标签与“ground truth”(真实的类标签)进行比较,以估计模型的泛化准确率或者错误率。

 

步骤4:最后,我们得到了我们的模型对未知数据的准确率的估计。所以,我们没有理由再在算法中保留测试集了。因为我们假设我们的样本是i.i.d.。没有理由假定模型在提供所有可用数据之后会表现得更糟。根据经验,如果算法使用更多的信息数据——假设它还没有达到性能上限,那么模型将具有更好的泛化性能。


1.6 悲观偏差


第1.3节(Resubstitution验证和Holdout方法)介绍了当数据集被分割为单独的训练和测试集时会遇到的两种问题。其中第一个问题是破坏了数据独立性和在下采样(在第1.4节中讨论)中改变了类比例。在Holdout验证方法(第1.5节)部分,我们讨论了在对数据集进行下采样时遇到的第二个问题:步骤4提到了模型的容量,以及额外的数据是否有用。首先说容量问题:如果一个模型还没有达到它的容量,性能估计将偏向悲观。这假设算法如果得到了更多的数据,可以学习到一个更好的模型——通过分离数据集的一部分进行测试,我们就会保留有价值的数据(例如,测试数据集)来估计泛化性能。

 

为了解决这个问题,在估计泛化性能(参见图2步骤4)之后,可以将模型与整个数据集相匹配(参见图2步骤4)。但是,使用这种方法,我们无法估计其对自拟合模型的泛化性能,因为我们现在已经“消耗”了测试数据集。在现实的应用程序中,我们无法避免这种进退两难的境地,但我们应该意识到如果只有部分数据集,也就是训练数据集,用于模型拟合(尤其是影响模型适合相对较小的数据集),我们的估计泛化性能可能表现的偏向悲观。


1.7 正态逼近置信区间


利用第1.5节中描述的Holdout方法,我们计算了模型泛化性能的一个点估计结果(point estimate)。当然,这一估计的置信区间不仅在某些应用中具有更丰富的信息和可取性,而且也可能对特定的训练集/测试集划分相当敏感(比如方差很大时)。计算模型预测精度或计算误差置信区间的一种简单方法是通过所谓的正态逼近。在这里,我们假设预测结果会遵循一个正态分布,然后根据中心极限定理计算单次训练-测试划分的平均值的置信区间。我们计算预测精度如下:

其中L(·)为0-1损失函数(式3),n表示测试数据集中的样本个数。表示对第i个样本的预测类别,表示第i个样本的真实类别。因此,我们现在可以把每次预测都看成伯努利实验,正确预测的次数X服从一个实验样本数为n∈N,实验次数为 k=0,1,2,...,n,成功概率为p∈[0,1]的二项分布X~(n,p):

其中

现在,预期的成功次数为μ=np,或者更具体地说,如果模型有50%的成功率,那么40次预测的期望成功次数为20次。估计方差为:

标准差为: 

因为我们更感兴趣的是成功的平均次数,而不是其绝对值,所以可以计算其准确率估计值的方差:

相应的标准差为:

通过正态逼近,我们可以得到预测的置信区间:

其中是误差分位数和z是标准正态分布的分位数。置信区间为95%(α=0.05)时,z = 1.96。

 

然而,在实际操作中,最好还是通过多次划分训练-测试集,计算置信区间的平均估计。还一个有趣的结论是,测试集中样本较少时,方差会变大(参见分母中的n),从而扩大置信区间。

 

总结


本节我们介绍了在监督机器学习中模型评估的一般概念。其中Holdout方法可以用于评估模型在未知数据上的泛化性能。Holdout方法需要首先将数据集分成训练集和测试集两部分。算法首先在训练集数据上进行学习构建模型,然后对所得模型在测试集数据上的预测性能进行评估。在测试集上的性能就可以用于估计模型对未知数据的泛化性能。此外,我们还简要介绍了正态逼近,在一定假设的前提下,可以通过正态逼近计算出基于单个测试集的性能估计的不确定性。下一节中我们将详细讨论置信区间和估计不确定性。


2 Bootstrapping 和不确定性


2.1 概述


本节将向大家介绍一些先进的模型评估技术。我们将首先讨论模型性能估计的不确定性以及模型的方差和稳定性。之后将讨论模型选择的交叉验证技术。


2.2 重采样


模型估计有偏差也有方差。而Resubtitution 评估(用同样的训练集对模型进行评估)有很高的乐观偏差。反之,将数据集的很大部分数据作为测试集很容易为评估带来悲观偏差。随着测试集样本数量的减少,悲观偏差会降低,但性能估计方差却会增加。图3展示了方差和偏差直接的关系。 



为了寻找在模型评估和选择中的偏差-方差折中方案,本节我们将介绍重采样方法。


之前说测试集数据比例太大会使得模型评估偏向悲观可能是因为模型的性能尚未达到最优。当算法训练数据可以继续增多时,模型的泛化性能也会相应的更好。图4就是一个softmax分类器在MNIST数据集上的学习曲线。 



MNIST数据集样本均为0-9的数字,其中每一类共有500个随机样本,数据集共5000个样本。实验时我们将其按比例分为3500个训练样本和1500个测试样本。然后再按照随机,层次化分割的方法将训练集分为更小的子集,使用这些子集拟合softmax分类器。用于评估性能的测试集则依然是1500个样本。从图中可以看出,随着训练样本增加,resubstitution精度下降,同时模型泛化性能提高。这可以归因于过拟合的缓解。当训练集小的时候,算法更容易受训练数据噪声影响,从而难以得到很好的泛化。训练数据越多,算法越受益的现象也可以解释用Holdout方法进行模型评估为何偏向悲观:该方法从数据中选出了相当一部分用于测试集,而这些数据本可以用于模型训练。所以一般评估完一个模型之后,最好还要在完整数据集上再运行一遍算法,得到效果更好的模型。


那么,是不是说测试集数据越少越好呢?其实对数据集来说,每次对其进行重采样都会改变训练集和测试集各自样本分布的统计信息。测试集越小,这个改变越明显。自然而然地,测试集数据的减少会带来另一个问题:模型性能估计方差的增大。这也是为什么大多数监督学习算法都要加上数据集符合真实数据分布,以及为什么要采用层次化数据集分割(就是为了保持样本比例不变)。但是基于特征的底层样本统计数据变化依然是一个问题,特别是在小数据集上(图5)。

 


2.3 重复Holdout 验证


我们可以通过多次随机划分训练集和测试集,重复Holdout方法估计模型性能然后取平均值的方法获得更具鲁棒性的评估。这种重复Holdout的方法也称为蒙特卡洛交叉验证。同标准方法相比,这种方法可以更好地衡量模型在随机测试集上的性能,从中还能了解模型在不同数据集上的稳定性。图6是在多次随机划分的Iris数据集上运行knn分类器(k=3),重复Holdout验证的结果。



左图中数据集每次划分训练集与测试集均有75个样本,比例为1:1,而右图每次划分训练集135个样本,测试集15个样本,比例为1:1。左图平均准确率95%,右图平均96%。从中可以验证上文的发现,测试集样本数减少会使模型性能估计方差增大,同时训练集样本减少会使得模型估计偏向悲观。


2.4 Bootstrap方法和经验置信区间


如何才能获得性能估计的置信区间呢?尤其是在其分布未知的时候,我们如何才获得性能估计均值的方差和置信区间?对现实世界来说,多次独立实验统计数据特性是比较昂贵的实验方式。为了避免这种极端的方法,我们可以用bootstrap方法。Bootstrap背后的思想就是从经验分布中采样生成新样本。它是一种用于估计样本分布的重采样技术,本文中我们用其来衡量性能估计的不确定性。如果把Holdout方法理解为不放回采样,那么bootstrap就可以理解为通过有放回重采样产生新数据。

 

步骤如下:

  1. 给定n个样本的数据集

  2. 对b次bootstrap循环:从数据集中抽取一个样本,令其为第j个bootstrap样本。重复该步骤,直至bootstrap样本的大小为n。每次循环均通过有放回抽样,生成一个与原数据集大小相同的数据。有些样本可能在新数据集中出现多次,有些则可能从不出现。

  3. 在每个bootstrap数据集上运行算法,并计算resubstitution准确率。

  4. 计算b次准确率估计的平均值。

但正如前面所说,resubstitution准确率可能偏向乐观,因为模型对数据集中的噪声可能过于敏感。bootstrap一开始是用于数据潜在分布未知且没有额外样本时确定估计器统计特性。现在,为了更好地对模型预测进行评估,我们更喜欢使用Leave-one-out Bootstrap(LOOB)方法。

 

这种方法测试集数据和训练集数据没有重叠。图7对该方法进行了说明。

 


若假设样本付出正态分布,则其均值估计为

方差估计为:

标准误差SE为标准差(SD=α)除以。根据公式可得均值的95%置信区间(z=1.96)为:

其中t与样本数量n(或精确度)有关,可以通过查表法获得。如n=100时,。又已知平均准确率

则标准误差为:

所以平均估计的置信区间为:

 

但上述方法的前提是数据服从正态分布。当数据不服从正态分布时,一种更鲁棒的方法是百分位方法。首先设定置信上下界:

其中

α满足“置信区间 = 100 × (1 - 2 × α)”。如置信区间为95%时,α=0.025,b次bootstrap采样分布上下界分别是第2.5个百分位和第97.5个百分位。图8是留一法bootstrap采样标准置信区间计算和百分位置信区间计算的对比。A图是在Iris数据集使用knn(k=3)的模型估计结果,B图是在MNIST数据集上进行softamx回归的模型估计结果。

在经典bootstrap方法中,估计结果更偏向悲观,这是因为bootstrap采样样本中大约只涉及原始数据的63.2%的不重复样本。在n个样本的数据集中,进行bootstrap采样,则单个样本无法被抽中的概率为:

当时,上式约等于。所以样本被抽中的概率就为P(chosen)=1 - P(not chosen) = 0.632 。对于大数据集,我们就可以在每次迭代中选择0.632 × n个样本作为bootstrap训练集,剩余0.368 × n个样本留作测试集。图9显示了随着n的增大,样本在bootstrap采样中被抽中的概率。


为了解决这种放回抽样带来的估计悲观偏差,Bradley提出了“.632估计”,估计准确率可通过下面的方法计算:

其中是resubstitution准确率,是模型在测试集上的准确率。虽然是为了解决悲观偏差,但却可能导致乐观偏差,所以后来Bradley又提出了“.632 + Bootstrap方法”:

该方法不再使用ω = 0.632的固定权重,而是通过下式计算ω

其中R是相关过拟合率:

为了计算R,我们需要知道非信息率γ。我们可以通过在包含样本和标签 所有可能组合的数据集上拟合模型计算γ,其中先假设样本和标签彼此独立:

或者,通过

估计非信息率。其中为在数据集中观察到的k类样本的比例,而q_k是分类器在数据集中所预测的k类样本的比例。


总结


本节我们继续讨论了机器学习模型评估的偏差和方差,此外还介绍了重复Holdout方法,该方法可以获得关于模型稳定性的信息。然后我们讨论了bootstrap方法——一种来自统计学的方法——及其分支在衡量模型性能不确定性中的作用。下一节我们将讨论模型选择和超参数调优。


3 交叉验证和超参数优化


3.1 概述


几乎每种机器学习算法都有大量的设置,而超参数可以帮助我们在优化机器学习算法性能时控制算法,在偏差和方差折中方案之间找到一个好的平衡。超参数调优本身就是一门艺术,而且没有既准有快的方法可以保证在给定数据集上实现最佳性能。本节将重点讨论模型评估和模型选择交叉验证的不同方法。交叉验证技术会对多个超参数配置对模型进行排序,并估计模型对独立数据集的泛化性能。


3.2 超参数和模型选择


在第一节中我们已经介绍过超参数和模型参数的区别。超参数需要在算法运行之前就手动给定,如knn中的k,而模型参数可以由算法自动学习到。Logistic回归模型中,模型参数就是数据集中每个特征变量的权重系数,该系数可以最大化对数似然函数或最小化损失函数自动更新,而超参数则比如是迭代次数,或基于梯度的优化中传递训练集(epochs)的次数。另一个超参数是正则化参数估计的值。

 

在训练集上运行算法时更改超参数的值可能会产生不同的模型。从一组由不同的超参数值产生的模型中寻找最佳模型的过程称为模型选择。下一小节将介绍一个Holdout方法的拓展,该方法可用于模型选择。


3.3 超参数调优的three-way Holdout方法


在第一节中为了估计模型的泛化性能,我们使用Holdout方法将数据划分为训练集和测试集。那Holdout方法可以用于超参数调优吗?答案是肯定的,但我们必须对初始方法进行一些修改,将数据集划分为训练、验证和测试集三部分(three-way)。

 

超参数优化的目的通常是优化某个性能指标,如分类精度或ROC(Receiving Operating Characteristic)曲线下的面积,调优之后再根据模型在测试集上的性能进行选择。然而多次重复使用测试集会带来偏差,最终的性能评估可能偏向过度乐观。将数据集分为训练、验证和测试集之后,超参数调优和模型选择中的训练集-验证集对可以让测试集在模型评估中保持独立。

 

图12对这种方法进行了说明。 



Step 1. 将数据集划分为三部分:训练集用于模型拟合,验证集用于模型选择,测试集用于最终评估选定模型。

Step 2. 超参数优化:使用不用超参数设置的算法在训练数据上拟合模型。

Step 3. 对模型在验证集上的性能进行评估。在比较性能评估之后选择最佳性能模型对应的超参数设置。实际操作中常常合并步骤2和步骤3。

Step 4. 为了避免训练集太小造成的性能估计偏向悲观,我们可以在模型选择之后将训练集和验证集合并,并使用第3步的最佳超参数模型设置将模型在合并后的数据集上进行拟合。

Step 5.  使用独立测试集估计模型泛化性能。测试集目的是估计模型在未知数据上的泛化能力,重复使用该数据集或导致模型泛化性能的乐观估计。

Step 6. 最后可以将训练集、验证集和测试集合并,将模型在全部数据上进行拟合,以供实际使用。

 

理论上使用全部数据拟合出的模型性能只会提高,这会和第5步中得到的模型稍有不同。在此假设下,第5步的性能评估可能会略微低估第6步得到的模型性能。


3.4 K-Fold交叉验证


在机器学习中,模型评估和模型选择最常用的方法是k-fold交叉验证。有人可能会将训练/测试holdout方法称为交叉验证技术,但是将交叉验证看做训练-验证阶段的交叉可能会更有意义。这里交叉验证的主要思想是数据集中的每个样本都有被测试的机会。作为交叉验证的一种特殊情况,在k-fold每次迭代中,数据被分为k部分,其中第1部分用于验证集,剩下的k-1部分用于训练集,该流程总共迭代k次。图13展示了一个5-fold交叉验证的流程。这一过程会产生5种不同的模型,这些模型在不同但部分重叠的训练集上进行拟合,在不重叠的验证集上进行评估。最终,交叉验证性能就是k次模型在验证集上性能估计的算术平均值。

和two-way holdout方法每个样本最终只有0.632的概率被抽中进行训练或测试不同,k-fold交叉验证所有的数据都将用于训练和测试。与重复holdout方法相比,k-fold交叉验证的测试数据没有重叠,而重复holdout是重复使用样本进行测试。


3.5 特殊情况:2-fold和留一法(Leave-One-Out)交叉验证


K-fold交叉验证有两种特殊情况:k=2和k=n。大多数文献都说2-fold交叉验证等于holdout方法。然而这种方法只有在训练集和验证集不重新随机划分,而是直接交换的情况(训练集数据和验证集数据各占50%)下才对。本文中将holdout方法和2-fold交叉验证描述为两个不同的过程,见图14。

而在另一种特殊情况下,k=n时,k-fold等价于留一交叉验证法。图15显示了这一过程,每次迭代中,模型都在其中n-1个样本上进行拟合,然后在剩余的一个样本上进行评估。这种方法对小数据集特别有用。

 

很多研究都在比较k-fold交叉验证中k值选择如何影响模型性能估计的方差和估计偏差。不过,天下没有免费的午餐。尽管Benigo和Grandvalet的研究显示,在所有分布情况下均不存在K-fold交叉验证方差的无偏估计量。然而我们仍比较希望可以找到一个k值,使得方差和偏差之间取得一个很好的折中。

 

在计算可行的情况下,同Holdout方法相比,留一法交叉验证更值得推荐。表1展示了Ridge回归模型一个469样本的数据集上的实验评估对比。第1行是留一法交叉验证用于回归模型在100个样本训练子集上拟合结果的评估。第2-4行是holdout方法用于模型在100个样本训练子集上拟合结果的评估,依次是holdout样本数量为10/20/50的结果。我们发现留一法交叉验证的平均估计最接近真实的。

 

而当数据集很大的时候,出于计算效率的考虑我们就会更倾向于holdout方法。经验上,数据集大的时候,悲观偏差和方差大的问题都会出现的较少。此外,重复使用不同随机种子的k-fold交叉验证过程有助于得到一个更“鲁棒”的估计,比如重复一个5-fold交叉验证100次,就可以得到500个测试的性能估计,交叉验证性能就可以取这500个的算术平均值。但是,重复留一法交叉验证确实没有意义的,因为留一法交叉验证每次都是产生相同的分割。


3.6 K-fold交叉验证和偏差-方差平衡


在小数据集和中等数据集上,留一法交叉验证比holdout更好。另外,我们可以认为留一法交叉验证近似无偏:因为几乎所有样本都可用于模型拟合,所以其悲观倾向显著低于k

 

既然我们已经确定留一法交叉验证的估计值通常都伴随着大方差和小偏差,那么这个方法与k取其他值时的k-fold交叉验证以及bootstrap方法相比如何呢?第2小节中,我们曾讨论标准bootstrap方法的悲观偏差,其训练集大约包含了原始数据集样本的63.2%;2-fold或3-fold交叉验证也存在类似的悲观偏差。实验还发现,与k-fold交叉验证相比,bootstrap在某些真实数据集上的偏差更明显(偏向乐观)。最终,各种真实数据集上的实验发现,10-fold交叉验证在偏差和方差之间取得了最佳的平衡。此外,还有研究发现重复k-fold交叉验证可以提高评估的精确度同时保持较小的偏差。

 

在k-fold交叉验证中,随着k的增加有如下趋势:

  • 性能估计偏差减小(更准确)

  • 性能估计方差增大(更大的变化性)

  • 计算成本增加(在拟合过程中训练集更大,需要的迭代次数更多)

  • 在k-fold交叉验证中将k的值降到最小(如2或3)也会增加小数据集上模型估计的方差,因为随机抽样变化较大


3.7 通过K-fold交叉验证进行模型选择


和前面一样,这其中很关键的一点是保持独立的测试数据集。要从训练和模型选择阶段保留出来,以避免在训练阶段泄露测试数据。图16展示了该流程的具体步骤。



Step 1. 将数据集分为一个训练集和独立的测试集(测试集仅在最终模型评估时用)。

Step 2. 尝试各种超参数设置,如贝叶斯优化,随机搜索或网格搜索。对每个超参数配置,在训练集上应用k-fold交叉验证可以得到多个模型和性能估计。

Step 3. 使用k-fold交叉验证过程中结果最好的超参数设置,使用完整的训练集来进行这些设置。

Step 4. 使用之前保留的独立测试集评估第3步获得的模型。

Step 5. 将模型在所有数据(训练集和测试集合并)上进行拟合,得到最终部署模型。


3.8 关于模型选择和大型数据集的说明


由于计算成本较低,许多深度学习文献在模型评估时,常常选择three-way holdout方法;很多早期的文献也常常使用这种方法。除了计算效率方面的问题,当处理的数据相当大时,我们一般只使用深度学习算法,也不用担心会出现高方差。所以当数据集相对较大时,在模型选择中使用holdout方法进行训练、验证和测试,而不是使用k-fold方法。


3.9 关于模型选择过程中特征选择的说明


注意,如果我们对数据归一化或进行特征选择,我们通常会在k-fold交叉验证循环中执行这些操作,而不是在划分数据之前就将这些步骤应用到整个数据集。在交叉验证循环内部,特征选择避免了在训练阶段测试数据信息的峰值,通过过度拟合减少了偏差。然而,因为训练的数据较少,交叉验证循环中的特征选择可能导致过度悲观的估计。


3.10奥卡姆剃刀原则(The Law of Parsimony)


机器学习领域一个非常经典的节俭原则,也就是奥卡姆剃刀原则是:在相互冲突的假设中,选择假设最少的一个。在模型选择中,奥卡姆剃刀也是一个很有用的工具,如“一个标准误差法”(one-standard error method):

  • 考虑数值最优估计及其标准误差

  • 选择模型,其性能需在步骤1中得到的值的一个标准误差以内的

 

虽然我们很多人可能更喜欢简单的模型,但Pedro Domingos却在文章中表达了他对“复杂”模型的支持。他在他的文章“关于机器学习的十个误区”中说:


更简单的模型更准确。这种信念有时等同于奥卡姆剃刀,但剃刀只说了更简单的解释更可取,却没有说为什么。它们更可取,因为它们更容易理解、记忆和推理。有时候,与数据相一致的最简单的假设,比复杂的假设更不准确。一些最强大的学习算法输出的模型似乎是没有必要的,有时甚至在它们完全拟合数据之后还会继续拟合?但那样的话他们甚至还不如弱一些的算法。

 

当然,只要性能在一定的可接受范围内(例如使用“一个标准误差法”(one-standard error method)),我们仍倾向于选择最简单的模型。虽然一个简单的模型可能不是最“精确”的模型,但是它可能比其他复杂的方法更有效,更容易实现,更容易理解和推理。

 

为了搞清楚“一个标准误差法”是怎么操作的,我们举一个例子:现在有300个训练样本,150个第1类样本,150个第2类样本,服从同心圆均匀分布。将同心圆数据集分为两部分:70%的训练数据和30%的测试数据,使用层次化方法保持类别比例。图17显示了210个训练数据集中的样本。



假设我们的目标是优化一个非线性RBF核SVM的超参数γ,γ是高斯RBF核的自由参数。

直观上,我们认为参数γ控制单个训练样本在决策边界处的影响。

 

首先在训练数据集上运行使用不同γ值的RBF核SVM,然后进行10-fold交叉验证。图18显示了性能估计的结果。



其中误差带(error bars)是交叉验证估计的标准误差。正如图8所示,在0.1和100之间选择γ值可以得到80%以上的预测准确率。γ=10会得到一个相当复杂的决策边界,γ=0.001得到的决策边界就非常简单。而γ=0.1则看起来在这两个模型(γ=0.001γ=10.0)之间取得了一个很好的平衡。当γ=0γ=10时,对应的模型性能落在最佳模型的一个标准误差内。


3.11总结


预测模型泛化性能的评价方法还有很多。到目前为止,本文介绍了holdout方法、bootstrap方法的不同变体以及k-fold交叉验证。当处理的样本量较大时,使用holdout方法进行模型评价非常合适。对于超参数优化,我们更推荐10折交叉验证。而在小样本的情况下,留一法交叉验证则是一个不错的选择。当涉及到模型选择时,如果数据集很大,并且计算效率也是一个问题,则最好选择three-way handout 方法;模型选择的另一个不错的方法是,在一个独立的测试集上使用k-fold交叉验证。

 

完整文章请见:https://sebastianraschka.com/pdf/manuscripts/model-eval.pdf

———— / END / ————


欢迎加入数据君亲自打造有情怀、高效学习数据分析的


点击了解→_→:最后的战斗~~~~


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/NZwpRsVq58
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/7183
 
796 次点击