Py学习  »  机器学习算法

数据科学 | 算法工程师必备的机器学习--模型评估(上)

运筹OR帷幄 • 4 年前 • 471 次点击  


↑↑↑↑↑点击上方蓝色字关注我们!






『运筹OR帷幄』原创


作者:华校专


作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!

模型选择

一、泛化能力

  1. 为了评估机器学习算法的能力,必须给定其性能的衡量指标。

  2. 有些情况下,很难决定衡量指标是什么:

  • 如:翻译任务中,应该衡量整个翻译结果的准确率,还是衡量每个单词翻译的准确率?
  • 如:密度估计任务中,很多模型都是隐式地表示概率分布。此时计算样本空间某个点的真实概率是不可行的,因此也就无法判断该点的概率估计的准确率。
  • 通常利用最小化训练误差来训练模型,但是真正关心的是测试误差。因此通过测试误差来评估模型的泛化能力。

    • 训练误差是模型在训练集的平均损失,其大小虽然有意义,但是本质上不重要。
    • 测试误差是模型在测试集上的平均损失,反应了模型对未知测试数据集的预测能力。
  • 模型对未知数据的预测能力称作模型的泛化能力,它是模型最重要的性质。

    泛化误差可以反映模型的泛化能力:泛化误差越小,该模型越有效。

  • 假设训练集和测试集共同的、潜在的样本分布称作数据生成分布,记作 。则泛化误差定义为模型的期望风险,即:


    • 通常泛化误差是不可知的,因为无法获取联合概率分布 以及无限的采样点。
    • 现实中通常利用测试误差评估模型的泛化能力。由于测试数据集是有限的,因此这种评估结果不完全准确。
  • 统计理论表明:如果训练集和测试集中的样本都是独立同分布产生的,则有 模型的训练误差的期望等于模型的测试误差的期望

  • 机器学习的“没有免费的午餐定理”表明:在所有可能的数据生成分布上,没有一个机器学习算法总是比其他的要好。

    • 该结论仅在考虑所有可能的数据分布时才成立。
    • 现实中特定任务的数据分布往往满足某类假设,从而可以设计在这类分布上效果更好的学习算法。
    • 这意味着机器学习并不需要寻找一个通用的学习算法,而是寻找一个在关心的数据分布上效果最好的算法。
  • 正则化是对学习算法做的一个修改,这种修改趋向于降低泛化误差(而不是降低训练误差)。

    • 正则化是机器学习领域的中心问题之一。
    • 没有免费的午餐定理说明了没有最优的学习算法,因此也没有最优的正则化形式。

    二、过拟合、欠拟合

    1. 当使用机器学习算法时,决定机器学习算法效果的两个因素:降低训练误差、缩小训练误差和测试误差的差距。

      这两个因素对应着机器学习中的两个主要挑战:欠拟合和过拟合。

    2. 过拟合overfitting:选择的模型包含的参数过多,以至于该模型对于已知数据预测得很好,但是对于未知数据预测的很差,使得训练误差和测试误差之间的差距太大。

    • 过拟合的原因是:将训练样本本身的一些特点当作了所有潜在样本都具有的一般性质,这会造成泛化能力下降。
    • 过拟合无法避免,只能缓解。因为机器学习的问题通常是NP难甚至更难的,而有效的学习算法必然是在多项式时间内运行完成。如果可以避免过拟合,这就意味着构造性的证明了P=NP
  • 欠拟合underfitting:选择的模型包含的参数太少,以至于该模型对已知数据都预测的很差,使得训练误差较大。

    欠拟合的原因一般是学习能力低下造成的。

  • 通过调整模型的容量capacity可以缓解欠拟合和过拟合。

  • 2.1 模型容量

    1. 模型的容量是指其拟合各种函数的能力。

    • 容量低的模型容易发生欠拟合,模型拟合能力太弱。
    • 容量高的模型容易发生过拟合,模型拟合能力太强。
  • 通过选择不同的假设空间可以改变模型的容量。

    模型的假设空间指的是:代表模型的函数集合。这也称作模型的表示容量representational capacity

    由于额外的限制因素(比如优化算法的不完善),模型的有效容量effective capacity一般会小于模型的表示容量。

  • 通常在模型的假设空间中出最佳的函数是非常困难的优化问题,实际应用中只是挑选一个使得训练误差足够低的函数即可。

  • 统计学习理论提供了量化模型容量的方法,其中最出名的是VC维理论:训练误差与泛化误差之间差异的上界随着模型容量增长而增长,随着训练样本增多而下降

  • 虽然VC 维理论对于机器学习算法有很好的指导作用,但是它在深度学习很难应用。原因有二:

    • 边界太宽泛。
    • 难以确定深度学习的容量。由于深度学习模型的有效容量受限于优化算法,因此确定深度学习模型的容量特别困难。
  • 通常泛化误差是关于模型容量的 U形函数。随着模型容量增大:

    • 训练误差会下降直到逼近其最小值。
    • 泛化误差先减小后增大。
    • 泛化误差与训练误差的差值会增大。

    2.2 缓解过拟合

    1. 缓解过拟合的策略:

      具体内容参考深度学习《正则化》章节。

    • 正则化。
    • 数据集增强:通过人工规则产生虚假数据来创造更多的训练数据。
    • 噪声注入:包括输入噪声注入、输出噪声注入、权重噪声注入。将噪声分别注入到输入/输出/权重参数中。
    • 早停:当验证集上的误差没有进一步改善时,算法提前终止。
  • 正则化 :基于结构化风险最小化(SRM)策略的实现,其中 为正则化项。

    在不同的问题中,正则化项可以有不同的形式:

    • 回归问题中,损失函数是平方损失,正则化项是参数向量的 范数。
    • 贝叶斯估计中,正则化项对应于模型的先验概率

    2.3 缓解欠拟合

    1. 缓解欠拟合的策略:选择一个模型容量更高的模型。

    三、偏差方差分解

    3.1 点估计

    1. 点估计:对参数 的一个预测,记作

      假设 为独立同分布的数据点,该分布由参数 决定。则参数 的点估计为某个函数:

      注意:点估计的定义并不要求 返回一个接近真实值

    2. 根据频率学派的观点:

    • 真实参值 是固定的,但是未知的。
    • 是数据点的函数。
    • 由于数据是随机采样的,因此 是个随机变量。

    3.2 偏差

    1. 偏差定义为:,期望作用在所有数据上。

    • 如果 ,则称估计量 是无偏的。
    • 如果 ,则称估计量 是渐近无偏的。
  • 无偏估计并不一定是最好的估计。

  • 偏差的例子:

    • 一组服从均值为 的伯努利分布的独立同分布样本 的无偏估计。

    • 一组服从均值为,方差为 的高斯分布的独立同分布样本

    3.3 一致性

    1. 通常希望当数据集的大小 m 增加时,点估计会收敛到对应参数的真实值。即:

      表示依概率收敛。即对于任意的,当 时,有:


    2. 上述条件也称做一致性。它保证了估计偏差会随着样本数量的增加而减少。

    3. 渐近无偏不一定意味着一致性。

      如:在正态分布产生的数据集中,可以用 作为 的一个估计。

    • 它是无偏的,因为 ,所以不论观测到多少个数据点,该估计都是无偏的
    • 但它不是一致的,因为他不满足

    3.4 方差

    1. 估计量的方差记作,标准差记作

      它们刻画的是:从潜在的数据分布中独立的获取样本集时,估计量的变化程度。

    2. 例:一组服从均值为 的伯努利分布的独立同分布样本

    • 的无偏估计。
    • 。表明估计量的方差随增加而下降。
  • 估计量的方差随着样本数量的增加而下降,这是所有估计量的共性。

  • 例:均值估计 ,其标准差为:


    其中是样本 的真实标准差,但是这个量难以估计。实际上

    都不是真实标准差 的无偏估计,这两种方法都倾向于低估真实的标准差。


    实际应用中, 是一种比较合理的近似估计,尤其是当较大的时候。

  • 3.5 误差诊断

    1. 通常偏差方差反映了模型的过拟合与欠拟合。

    • 高偏差对应于模型的欠拟合:模型过于简单,以至于未能很好的学习训练集,从而使得训练误差过高。

      此时模型预测的方差较小,表示预测较稳定。但是模型预测的偏差会较大,表示预测不准确。

    • 高方差对应于模型的过拟合:模型过于复杂,以至于将训练集的细节都学到,将训练集的一些细节当做普遍的规律,从而使得测试集误差与训练集误差相距甚远。

      此时模型预测的偏差较小,表示预测较准确。但是模型预测的方差较大,表示预测较不稳定。

  • 误差诊断:通过训练误差和测试误差来分析模型是否存在高方差、高偏差。

    • 如果训练误差较高:说明模型的方差较大,模型出现了欠拟合。

    • 如果训练误差较低,而训练误差较高:说明模型的偏差较大,出现了过拟合。

    • 如果训练误差较低,测试误差也较低:说明模型的方差和偏差都适中,是一个比较理想的模型。

    • 如果训练误差较高,且测试误差更高:说明模型的方差和偏差都较大。

      上述分析的前提是:训练集、测试集的数据来自于同一个分布,且最优误差较小。否则讨论更复杂。

    3.6 误差缓解

    1. 高方差和高偏差是两种不同的情况。如果算法存在高偏差的问题,则准备更多训练数据其实没什么卵用。

      所以首先要清楚:问题是高偏差还是高方差还是二者兼有。

    2. 如果模型存在高偏差,则通过以下策略可以缓解:

    • 选择一个容量更大、更复杂的模型。
    • 使用更先进的最优化算法。该策略通常在神经网络中使用。
  • 如果模型存在高方差,则通过以下策略可以缓解:

    • 增加更多的训练数据。它通过更多的训练样本来对模型参数增加约束,会降低模型容量。

      如果有更多的训练数据,则一定会降低方差。

    • 使用正则化。它通过正则化项来对模型参数增加约束,也会降低模型容量。

      有时候更多的训练数据难以获取,只能使用正则化策略。

  • 通常优先解决高偏差的问题。这是最低标准,要反复尝试,直到训练误差降低到足够小。然后试图降低方差。

    总之就是不断重复尝试,直到找到一个低偏差、低方差的模型。

  • 四、参数估计准则

    4.1 最大似然估计

    1. 假设数据集

      样本独立同分布地由 产生,但是该分布是未知的。

      是一族由 参数控制的概率分布函数族,希望通过 来估计真实的概率分布函数 ,也就是要估计 参数。

    2. 最大似然估计最大化数据集 出现的概率。即:


    • 由于概率的乘积会因为很多原因不便使用(如容易出现数值下溢出),因此转换为对数的形式:

    • 因为 无关,因此它也等价于:


    • 由于数据集的经验分布为:

      其中 为狄拉克函数。因此:


  • 最大似然估计有两个很好的性质:

    • 在某些条件下,最大似然估计具有一致性。这意味着当训练样本数量趋向于无穷时,参数的最大似然估计依概率收敛到参数的真实值。这些条件为:

    •  a. 真实分布 必须位于分布函数族 中;否则没有估计表示

    •  b. 真实分布 必须对应一个 值;否则从最大似然估计恢复出真实分布 之后,也不能解出参数

    • 最大似然估计具有很好的统计效率statistic efficiency。即只需要较少的样本就能达到一个良好的泛化误差。

  • 最大似然估计通常是机器学习中的首选估计准则。

  • 当样本数量太少导致过拟合时,正则化技巧是最大似然的有偏估计版本。

  • 4.2 贝叶斯估计

    1. 在最大似然估计中,频率学派的观点是:真实参数 是未知的固定的值,而点估计 是随机变量。因为数据是随机生成的,所以数据集是随机的。

      在贝叶斯估计中,贝叶斯学派认为:数据集是能够直接观测到的,因此不是随机的。而真实参数 是未知的、不确定的,因此 是随机变量。

    • 的已知的知识表示成先验概率分布 :表示在观测到任何数据之前,对于参数 的可能取值的一个分布。

      在机器学习中,一般会选取一个相当宽泛的(熵比较高)的先验分布,如均匀分布。

    • 假设观测到一组数据

      根据贝叶斯法则,有:


  • 贝叶斯估计与最大似然估计有两个重要区别:

    • 贝叶斯估计预测下,样本的分布不同。

    • 贝叶斯估计会使得概率密度函数向着先验概率分布的区域偏移。

  • 当训练数据有限时,贝叶斯估计通常比最大似然估计泛化性能更好。

    当训练样本数量很大时,贝叶斯估计往往比最大似然估计计算代价较高。

  • 五、泛化能力评估

    1. 模型泛化能力的评估:用测试集对模型进行评估。通常有下列方法:

    • 留出法hold-out
    • K 折交叉验证法cross validation
    • 留一法Leave-One-Out:LOO
    • 自助法bootstrapping

    5.1 留出法

    1. 留出法:直接将数据切分为三个互斥的部分(也可以切分成两部分,此时训练集也是验证集),然后在训练集上训练模型,在验证集上选择模型,最后用测试集上的误差作为泛化误差的估计。

    2. 数据集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。若训练集、验证集、测试集中类别比例差别很大,则误差估计将由于训练/验证/测试数据分布的差异而产生偏差。

      如:在分类任务中至少要保持样本的类别比例相似。如果从采样的角度来看到数据集的划分过程,则保留类别比例的采样方式称作“分层采样“(strafified sampling)。

    3. 即使进行了分层采样,仍然存在多种划分方式对数据集进行划分(比如排序后再划分、随机划分...)。这些不同的划分将导致不同的训练集/验证集/测试集。因此单次留出法得出的估计结果往往不够稳定可靠。

      在使用留出法时,往往采用若干次随机划分、重复进行实验评估后,取平均值作为留出法的评估结果。

    5.2 K 折交叉验证

    1. K 折交叉验证法:数据随机划分为K 个互不相交且大小相同的子集,利用 K-1 个子集数据训练模型,利用余下的一个子集测试模型(一共有 种组合)。

      K 种组合依次重复进行,获取测试误差的均值,将这个均值作为泛化误差的估计。

    2. 与留出法相似,将数据集划分为 K 个子集同样存在多种划分方式。为了减少因为样本划分不同而引入的差别, K 折交叉验证通常需要随机使用不同划分重复p 次,这 pK 折交叉验证的测试误差均值作为最终的泛化误差的估计。

    5.3 留一法

    1. 留一法:假设数据集中存在 N 个样本,令 K=N 则得到了 K 折交叉验证的一个特例。

    2. 优点:由于训练集与初始数据集相比仅仅少一个样本,因此留一法的训练数据最多。

      缺点:在数据集比较大时,训练 N 个模型的计算量太大。

    六、训练集、验证集、测试集

    6.1 训练集

    1. 训练集用于训练模型。理论上训练集越大越好。

    6.2 验证集

    1. 大多数机器学习算法具有超参数,超参数的值无法通过学习算法拟合出来(比如正则化项的系数、控制模型容量的参数 )。
    2. 为了解决这个问题,可以引入验证集。将训练数据分成两个不相交的子集:训练集用于学习模型,验证集用于更新超参数。
    3. 通常要求验证集足够大。如果验证集很小,那么模型的超参数可能就记住了一个小验证集里的样本,模型将对验证集严重过拟合。
    4. 验证集通常会低估泛化误差。因此当超参数优化完成后,需要通过测试集来估计泛化误差。

    6.3 测试集

    1. 测试集用于评估模型的泛化误差。理论上测试集越大,则模型的泛化误差评估的越准确。

    2. 测试集中的样本一定不能是训练样本。如果将训练样本放入测试集中,则会低估泛化误差。

    3. 测试集 vs 验证集:

    • 测试集通常用于对模型的预测能力进行评估,它提供了模型预测能力的无偏估计。

      如果你不需要对模型预测能力的无偏估计,则不需要测试集。

    • 验证集用于超参数的选择,它无法提供模型预测能力的有偏估计。

      因为模型依赖于超参数,而超参数依赖于验证集。因此验证集参与了模型的构建,这意味着模型已经考虑了验证集的信息。

    6.4 拆分

    1. 对于小批量数据,数据的拆分的常见比例为:

    • 如果未设置验证集,则将数据三七分:70% 的数据用作训练集、30% 的数据用作测试集。
    • 如果设置验证集,则将数据划分为:60% 的数据用作训练集、20%的数据用过验证集、20% 的数据用作测试集。
  • 对于大批量数据,验证集和测试集占总数据的比例会更小。

    • 对于百万级别的数据,其中1万条作为验证集、1万条作为测试集即可。

    • 验证集的目的就是验证不同的超参数;测试集的目的就是比较不同的模型。

      a. 一方面它们要足够大,才足够评估超参数、模型。

      b. 另一方面,如果它们太大,则会浪费数据(验证集和训练集的数据无法用于训练)。

  • k 折交叉验证中:先将所有数据拆分成 k 份,然后其中1 份作为测试集,其他k-1 份作为训练集。

    • 这里并没有验证集来做超参数的选择。所有测试集的测试误差的均值作为模型的预测能力的一个估计。

    • 使用k 折交叉的原因是:样本集太小。如果选择一部分数据来训练,则有两个问题:

      a. 训练数据的分布可能与真实的分布有偏离。k 折交叉让所有的数据参与训练,会使得这种偏离得到一定程度的修正。

      b. 训练数据太少,容易陷入过拟合。k 折交叉让所有数据参与训练,会一定程度上缓解过拟合。

    6.5 分布不匹配

    1. 深度学习时代,经常会发生:训练集和验证集、测试集的数据分布不同。

      如:训练集的数据可能是从网上下载的高清图片,测试集的数据可能是用户上传的、低像素的手机照片。

    • 必须保证验证集、测试集的分布一致,它们都要很好的代表你的真实应用场景中的数据分布。
    • 训练数据可以与真实应用场景中的数据分布不一致,因为最终关心的是在模型真实应用场景中的表现。
  • 如果发生了数据不匹配问题,则可以想办法让训练集的分布更接近验证集。

    • 一种做法是:收集更多的、分布接近验证集的数据作为训练集合。

    • 另一种做法是:人工合成训练数据,使得它更接近验证集。

      该策略有一个潜在问题:你可能只是模拟了全部数据空间中的一小部分。导致你的模型对这一小部分过拟合。

  • 当训练集和验证集、测试集的数据分布不同时,有以下经验原则:

    • 确保验证集和测试集的数据来自同一分布。

      因为需要使用验证集来优化超参数,而优化的最终目标是希望模型在测试集上表现更好。

    • 确保验证集和测试集能够反映未来得到的数据,或者最关注的数据。

    • 确保数据被随机分配到验证集和测试集上。

  • 当训练集和验证集、测试集的数据分布不同时,分析偏差和方差的方式有所不同。

    • 如果训练集和验证集的分布一致,那么当训练误差和验证误差相差较大时,我们认为存在很大的方差问题。

    • 如果训练集和验证集的分布不一致,那么当训练误差和验证误差相差较大时,有两种原因:

      a. 第一个原因:模型只见过训练集数据,没有见过验证集的数据导致的,是数据不匹配的问题。

      b. 第二个原因:模型本来就存在较大的方差。

    • 为了弄清楚原因,需要将训练集再随机划分为:训练-训练集训练-验证集。这时候,训练-训练集训练-验证集 是同一分布的。

      a. 模型在训练-训练集训练-验证集 上的误差的差距代表了模型的方差。

      b. 模型在训练-验证集 和 验证集上的误差的差距代表了数据不匹配问题的程度。


    本文福利

    可以在 公众号后台 回复关键词:“ DS 获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!


    —— 完 ——




    文章须知

    文章作者:华校专 

    责任编辑:周岩 Logic 征帆

    审核编辑:阿春

    微信编辑:Logic

    本文由『运筹OR帷幄』原创发布

    如需转载请在公众号后台获取转载须知





    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/113573
     
    471 次点击