有监督学习算法中的偏差-方差困境
1
两个医生
我有两个医生朋友,郭妮荷与安德费婷。她俩都自称擅长新型流感的早期防治,即通过分析过往临床患者的体征和患病与否,她们各自形成一套诊断手段,对新的就诊者进行检查,判断其是否患病。然而在诊断手段方面,她俩是截然不同的两个极端。
先来说说这位郭大夫。她要查看患者的三、四十个指标,既包括常见的血常规、体温、是否咳嗽、是否头疼、身高、体重等,又包括看似和诊断毫无关联的,比如饮食习惯、职业等。结合过去患者的数据,她整理出一些非常奇怪的规律。当新来的就诊者的特定指标满足她发现的规律后,她便可以对这名就诊者是否感染病毒做出判断。
再来看看那位安大夫。与郭大夫相比,她走的是另一个极端。凭借她多年的临床经验,她自信仅仅依靠查看体温以及号脉就能确认就诊者是否感染流感。什么其他的血常规或者流感的典型症状,她一概不看。量量体温、把把脉,就能告诉你患病与否。
一次,我故意将体温弄高,并使得脉搏加快,然后就去找这两位朋友去了。通过将我的体征和一系列令人匪夷所思的规律比对,郭大夫的诊断结果是我没有得新型流感;而安大夫通过给我量体温和号脉,认为我得了新型流感。翌日,我故技重施,并又去找她们诊断。这天,郭大夫用一些新的患者数据更新了她那些所谓的规律。这一更新不要紧,面对和前一天同样状态的我,她竟然给出了我患有新型流感的结论。而安大夫那边倒是没有变化,和前一日一样的体温和脉搏,她给出同样的结论。就这么,我反复试了十来次,几乎每次从郭大夫口中都得到不同的诊断结果:时而说我感染了流感,时而又说没有。而安大夫呢?结论倒是非常一致:一直说我患有流感,然而她没有一次是对的。
对于郭大夫,虽然她在大部分诊断中给出了正确的结论:即我没有得流感。但是她的诊断结果的变化(波动)太大,保不齐哪天就诊的时候,我就恰好赶上了她的某个更新后的规律,就给我诊断为感染了。而安大夫呢?她倒是出奇的一致,可是她的结论没有一次是对的,和实际情况产生了巨大的偏差。有了这样的经历,我对她俩的诊断手段自然是不敢恭维。
读到这里,你一定发现了上面这个故事是虚构的。而我的这两位医生朋友的名字也只不过是过拟合(overfitting)和欠拟合(underfitting)的谐音。这个故事描绘了机器学习领域,有监督学习(supervised learning)建模的一个典型问题。过往患者的体征是训练数据的特征(features),这些患者是否被确诊则是标签(labels)。这两位大夫通过“学习”这些患者的资料和诊断结果,总结了自己的诊断手段,这个过程就是建模(modelling)。最终,她们为我诊断则相当于对新的数据(训练集样本外数据)进行预测(forecasting)。这些步骤构成了完整的机器学习过程。
当有监督学习算法建模时,我们会经常遇到上面提到的过拟合或欠拟合的问题。过拟合的模型对于样本外数据的预测会有较大的方差;而欠拟合的模型对样本外数据的预测会有较大的偏差。偏差和方差就是有监督学习算法预测误差中重要的两个组成部分(还有第三个部分是问题固有的残余误差),也是一对矛盾的统一体。任何算法都必须在偏差和方差之间取舍。
这就是我们今天的话题。
2
有监督学习模型的泛化能力
通俗的说,有监督学习指的是,使用带有标签的样本数据来训练一个机器学习模型,并用这个模型对新发生的样本(unseen data)进行定量分析。具体的,有监督学习包括有监督回归(supervised regression)和有监督分类(supervised classification)。前者的响应变量一般是一个连续变量,比如我们可以构建一个有监督回归模型,利用过去的价格以及公司基本面数据作为特征,来预测股票的收益率,这里收益率就是一个连续变量。反观后者,它的响应变量一般是一个离散的类别,比如通过构建有监督分类,我们可以进行垃圾邮件的识别。
当我们把机器学习应用到量化投资领域时,有监督学习无疑具备广阔的应用前景。然而,就像本文第一节的故事描述的那样,要想衡量一个机器学习模型的效果,必须考察它对样本外数据预测的准确性。因为我们针对用于建模的训练数据,我们可以构建出非常精准的模型,但是这对于模型是否对未来数据仍然有效毫无意义。一个好的模型必须对样本外数据具备出色的泛化效果(generalization performance),评价泛化能力的依据正是模型在样本外数据的预测误差。
3
预测误差的三部分
有监督学习模型对样本外数据的预测误差由三部分构成:偏差(bias)、方差(variance)、以及固有的残余误差(irreducible error)。残余误差来自问题本身的随机噪声(noise),是无法避免的。换句话说,即便我们知道问题的真实模型,我们的预测仍然会有一定的误差,该误差源自问题的随机噪声,该噪声带来的误差就是我们预测误差的下限。在现实世界中,问题的真实模型是未知的,因此我们只能通过已有的样本数据来得到真实模型的一个估计(estimate)。无论我们怎么估计,估计模型的预测结果和未知真实模型的预测结果也总会有差别,这便引入了偏差和方差。
偏差:来自建模时对问题真实模型的错误假设(erroneous assumptions)。一个模型的样本外预测有很大的偏差往往意味着它没有有效的发现自变量(特征)和响应变量(标识)之间的关系;该模型存在欠拟合。
比如我们的安大夫,如果新型流感可以通过血常规中的某个血项来分辨,那么甭管她怎么量体温或者号脉,都无法发现这个体征和是否感染流感的关系。又或者,如果一个问题的真实模型是非线性的,而我们却用了一个线性模型来建模,那么它无论如何也捕捉不了自变量和响应变量之间的非线性关系。
方差:源自建模过程中对训练集数据变化的过度敏感(over-sensitivity to training data)。一个模型的样本外预测有很高的方差意味着它发生过拟合:它可能过度关注自变量和响应变量之间的非显著关系,或者错误对随机噪声建模。
比如我们的郭大夫过度的关注了几十个体征变量,这导致她的诊断对过往病患的数据非常敏感,以至于在对新病患预测时,预测结果出现很大的波动。
4
偏差—方差困境
让我们用数学语言来更精确的解释偏差和方差。
假设我们的特征变量(通常为一个 n 维向量)为 x,响应变量为 y。它们之间的关系由一个未知的真实函数 f 和随机噪声 ε 描述,即:
可见,响应变量 y 和自变量 x 之间的真实关系为 f;而 ε 则代表随机噪声,通常被假设为符合均值为 0、标准差为 σ 的正态分布。由于 f 未知,我们希望通过有监督学习,利用训练集样本数据得到一个 f 的估计,记为 \hat f。对于新的数据,利用该估计进行预测。
在求解f的估计的过程中,机器学习算法看到的仅仅是自变量 x 和响应变量 y。通过考察 x 和 y 的关系,它必须尽可能的分辨出 y 的变化中,哪部分是源自 x 和 y 之间的真正规律(regularities),而哪部分是由问题本身的随机噪声带来的。
有监督学习模型的样本外误差可以定义为预测值和真实值之间的均方误差(mean squared error),即:
这个误差可依下式分解:
其中,第一项为问题固有的残余误差,来自随机噪声;第二项为预测的方差;第三项为预测的偏差(的平方)。
需要特别说明的是,数学期望 E[] 是概率论中的概念,它定义为一个随机变量在其概率空间内取值按照对应概率的加权平均值。当数学期望 E[] 应用于有监督学习模型在样本外的预测误差时,这里的概率空间由自变量 x 和响应变量 y 的未知联合分布 prob(x, y) 刻画,取决于未知函数 f 和随机噪声 ε;而这个概率空间内的“随机变量的实现”则是一个个不同的训练集,每个训练集都是所有历史数据的一个子集。由此可知,这里求解期望的过程时作用于不同的训练子集上。
对于一个给定的模型结构(比如线性模型或者二项式模型),使用不同的训练集训练便得到模型不同的参数;将使用这些来自不同训练集的模型对新的样本点进行预测,得到多个预测值。这些预测值的平均值和真实值得差异就是偏差;这些预测值之间的差异就是方差:
偏差是“使用不同训练集得到的多个模型对新样本的响应变量的多个预测结果的平均值”与“该新样本响应变量的真实取值”之间的差异。
方差则衡量“不同的训练数据集得到的模型对新样本的响应变量的多个预测结果”之间的差异。
在实际应用中,可以采用 K 叠交叉验证(K fold cross-validation)将所有数据分为 K 个训练集,以此来计算预测的偏差和方差。我们会在今后找时间介绍交叉验证。
来看一个例子。假设真实的函数 f 为正弦函数 sin,即 y = sin(x) + ε。下图中蓝色的离散点是由这个过程产生的不同 x 值对应的响应值;黑色曲线代表这个真实函数 f = sin。由于 ε 的存在,蓝色的离散点并没有坐落在黑色正弦曲线上,而是随机分布在黑色曲线的上上下下。对于机器学习来说,f = sin 是未知的,它需要通过分析这些离散点,找到 y 随 x 变化的真实规律。
我们基于不同假设产生了三个复杂程度不同的模型,作为对真实函数 f 的估计:第一个模型是一个线性模型(绿色);第二个模型是一个三次的多项式模型(蓝色);最后一个模型是一个二十次的多项式模型(红色)。对于这个例子,线性关系显然不是一个好的模型,它忽视了 x 和 y 之间的非线性关系;多项式模型则能够捕捉 x 和 y 的关系。
然而,一个优秀的模型不仅要通过训练集数据正确的发现 x 和 y 的关系,更要对样本外数据有优秀的泛化能力,做到低偏差和低方差。当然,双低是很难共存的。事实上,偏差和方差与模型的复杂度有如下关系;
当模型的复杂度很低时,很容易发生欠拟合,即模型无视了 x 和 y 之间的真实关联,把 y 随 x 的变化看作是随机误差。这么做虽然使得模型在不同训练集之间的预测结果方差较小(因为它根本就没从这些子集中学出来多少有效的规律),但是预测均值和真实值的偏差很大。
随着复杂度的提升,模型可以越来越精准的描述训练集数据,因此模型的偏差越来越小。然而如果模型过度关注每个训练子集中 x 和 y 的片面关系或者噪声(过拟合),它必将忽视共存于所有训练子集(即全体历史数据)中的 x 和 y 的重要关系。由此会使得不同训练集训练出来的模型对新样本产生不同的预测结果,导致预测的方差增大。
在上面这个例子中,二十次多项式模型虽然有更低的偏差,但是它的方差却很大。综合考虑偏差和方差,它的预测效果不如三次多项式模型。事实上,由于在这个假想的例子中,我们知道真实函数 f = sin,可以看到,三次多项式模型和真实的 sin 函数非常接近。
总结来说:
简单模型,容易欠拟合,方差小,偏差大;
复杂模型,容易过拟合,偏差小,方差大。
下图是不同模型和方差以及偏差的关系。注意,这仅仅是一个非常简化的示意图。它似乎说明如果必须从欠拟合和过拟合模型选择,我们应该倾向于欠拟合模型,因为它的预测结果相对一致,我们只要把它们整体平移一个偏差值,便可以得到准确的预测。但是,千万不要被这个简单的示意图误导,因为生活中的实际问题远远比这个图复杂的多,我们远没有神之一手来修正偏差。相反,低偏差高方差的模型(假设已经杜绝了过拟合)往往是更有希望的。这是因为可以利用集合学习元算法(ensemble learning meta algorithm)来降低预测模型的方差,从而提高模型的泛化能力。装袋算法(bagging)、提升算法(boosting)、随机森林(random forest)对于分类树的改进都是这样的例子。
有监督学习的泛化能力,即预测误差,是由偏差和方差(以及残余误差)共同决定。偏差和方差之间的取舍是一个永恒的话题。在模型的复杂度和预测效果之间找到一个最佳的平衡点,这不仅依赖于更先进的机器学习算法不断的被发现,同时训练集的数据质量是否足够高也至关重要。
过犹不及!