机器学习算法笔记(十九):偏差方差权衡

在第十七篇笔记中,我们提到在机器学习模型训练的过程中,会遭遇过拟合或者欠拟合的问题,这些问题都会使训练出来的机器学习模型在真实的预测过程中产生各种误差或者错误。下面我们在更高的视角下来看一下在训练机器学习模型时出现的误差该如何进行分类。

一、什么是偏差和方差

偏差和方差的一个形象的图片描述

所谓偏差(Bias),就是指结果偏离目标位置(左下角的图片);所谓方差(Variance),就是指数据的离散程度,数据分布越集中方差越低,越分散方差越高(右边两幅图)。

在机器学习中,实际要训练模型用来解决一个问题,这个问题本身可以理解为靶心,而模型就是子弹,则子弹呈现在靶子上弹孔位置就可能出现偏差和方差的情况,也就是说训练出的模型可能犯偏差和方差两种错误。

二、模型误差

一般来说我们训练一个模型,这个模型会有误差,这个误差通常来源于三方面:

1、不可避免的误差:指我们无能为力的、客观存在的、由于各种各样的原因导致的误差,是无论怎么改进算法和模型都无法避免的(比如采集的数据本身含有的噪音)。

2、产生偏差的原因:
① 对要解决的问题本身的假设不准确(比如对非线性数据或问题使用线性回归)。
② 欠拟合会产生偏差。
③ 如果训练数据采用的特征跟问题的相关性不强或者根本没有相关性,就会使模型的预测结果偏离真实的结果。

3、产生方差的原因:
① 模型没有完全学习到问题的实质,而学习到了很多噪音(数据的一点点扰动都会较大的影响模型)。
② 模型太复杂(比如高阶多项式回归)。
③ 过拟合会产生方差。

● 有一些算法天生就是高方差的算法,例如 kNN。
一般非参数学习的算法都是高方差的算法,因为这类算法不对数据进行任何假设,只能根据现有数据进行预测,因此它对训练数据的准确度依赖性比较高。换句话说,该类算法对训练数据比较敏感(如 kNN、决策树)。

● 有一些算法天生就是高偏差的算法,例如线性回归。
一般参数学习的算法都是高偏差的算法,因为该类算法对数据具有极强的假设。

三、解决模型误差

当然,大多数机器学习算法都具有相应的参数,可以调整偏差和方差(例如 kNN 中的 k、多项式回归中的阶数)。

● 在 kNN算法中,对 k 的调整,其实就是在调整算法模型中引入的偏差和方差的错误。k 越小模型越复杂,相应的模型的方差越大偏差越小;k 越大模型越简单,直到 k 达到最大值(样本总数),此时 kNN 算法的本质就是看全部样本中哪类样本最多,就将此类样本的类型作为预测结果,这种情况下 kNN 算法的模型的方差最小偏差最大。

● 在线性回归中,调整参数 degree,可改变线性回归算法模型的方差和偏差的误差。degree 越小模型越简单,模型的偏差越大方差越小;degree 越大模型越复杂,模型方差越大偏差越小。

通常在一个机器学习算法中,偏差和方差是矛盾的:降低偏差就会提到方差,降低方差就会提高偏差。一般需要找到一个平衡,也就是偏差方差权衡(Bias Variance Trade off)。当然如果我们训练出来的模型是一个低偏差、低方差的模型,那固然很好。可是实际情况下不是那么理想的,我们会发现算法本身会有误差,这时我们需要观察算法的主要误差是集中在偏差的位置还是方差的位置,看看能不能让它的偏差和方差达到一定的平衡。换句话说,不要太高的方差,因为此情况下模型的泛化能力较弱;也不要太高的偏差,因为此情况下模型太过偏离原问题。我们可能不能完全杜绝误差,但让它有一点偏差,也有一点方差,而不是集中在一个方向上。达到这个目标通常也是机器学习算法在调参的过程中要做的事情。

如果我们只局限在算法的层面上,机器学习领域的主要挑战来自于方差而不是偏差。假设我们已经有了相对比较好的数据,数据也有了相对比较好的特征,在这种情况下,问题关键是使用算法基于这些数据得到可靠的结果。此时,我们的主要挑战大多来自于方差。换句话说,我们很容易就会让模型非常的复杂,让模型偏差特别的低,但是这样的模型有着非常高的方差,它的泛化能力很差,最终没有很好的性能表现。

在问题的层面上不一定是这种情况。因为现实中人们还对很多问题的理解太过肤浅,比如对疾病和金融市场的理解。过去很多人尝试用历史的金融数据来预测未来的金融情况,通常预测的结果不够理想,很有可能历史的金融数据并不能很好的反应未来金融市场的走向,因此此种方法会带来很高的偏差。

所以解决过拟合问题,是很多机器学习算法工程师都要面临的问题。那么面对过拟合问题,我们该如何解决呢?通常有下面几个手段:

1、降低模型复杂度(如多项式回归中通过较小 degree 来降低模型复杂度)

2、减少数据维度、降噪(方差过大的大部分原因是模型学习了过多的噪音)

3、增加样本数

增加样本数也就是增大训练数据的规模:有时候算法具有高的方差,是因为模型太过复杂,模型中的参数非常多,而训练模型的样本数不足以支撑计算出这么多复杂的参数(比如神经网络和深度学习)。使用深度学习的一个非常重要的条件就是数据样本的规模必须足够的大,这样才能发挥深度学习算法的效用。其中的原因就是深度学习算法的模型太过复杂,模型中的参数非常多,而训练模型的样本数不足以支撑计算出这么多复杂的参数。否则,使用深度学习的算法在一个小样本上得到的结果,还不如使用简单的模型得到的结果。

4、使用验证集(在笔记十八中讨论过)

5、模型正则化(后面的文章重点讨论)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注