社区所有版块导航
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学习  »  机器学习算法

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

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


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






『运筹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
     
    460 次点击