当咱们运行一个学习算法时,若是这个算法的表现不理想,那么有两种缘由致使:要么误差比较大、要么方差比较大。换句话说,要么是欠拟合、要么是过拟合。那么这两种状况,哪一个和误差有关、哪一个和方差有关,或者是否是和两个都有关,搞清楚这点很重要。能判断出现的状况是这两种中的哪种,是一个颇有效的指示器,指引着能够改进算法的最有效的方法和途径。html
下面深刻地探讨一下有关误差和方差的问题,而且能弄清楚怎样评价一个学习算法、可以判断一个算法是误差仍是方差有问题。由于这个问题对于弄清如何改进学习算法的效果很是重要。算法
以下图,用两个很简单的假设来拟合数据,好比说用一条直线,那么不足以拟合这组数据(欠拟合,左图),而若是你用两个很复杂的假设来拟合时,那么对训练集来讲则会拟合得很好,但又过于完美(过拟合,右图)。而像这样的中等复杂度的假设(中间的图),好比某种二次多项式的假设,次数既不高也不低,这种假设对数据拟合得刚恰好。此时对应的的泛化偏差,也是三种状况中最小的。app
前面已经掌握了训练集、验证集和测试集的概念(斯坦福大学公开课机器学习:advice for applying machine learning | model selection and training/validation/test sets(模型选择以及训练集、交叉验证集和测试集的概念)),接下来就能更好地理解误差和方差的问题。具体来讲沿用以前所使用的训练集偏差和验证集、偏差的定义,也就是平方偏差。即对训练集数据进行预测,或对验证集数据进行预测,所产生的平均平方偏差。下面咱们来画出以下这个示意图,横坐标上表示的是多项式的次数(中间图),所以横坐标越往右的位置,表示多项式的次数越大。那么咱们来画这幅图对应的状况,d可能等于1的状况,是用很简单的函数来进行拟合。而在右边的这个图中,水平横坐标表示有更多更大的d值.表示更高次数的多项式。所以这些位置对应着使用更复杂的函数,来拟合训练集时所须要的d值。先画训练集偏差,随着咱们增大多项式的次数,咱们将对训练集拟合得愈来愈好。因此若是d等于1时,对应着一个比较大的训练偏差。而若是咱们的多项式次数很高时,咱们的训练偏差就会很小,甚至可能等于0,由于可能很是拟合训练集。因此,当咱们增大多项式次数时,不难发现训练偏差明显降低(紫红色曲线)。这里写上J下标3来表示训练集偏差。接下来再看交叉验证偏差,若是咱们观察测试集偏差的话,咱们会获得一个和交叉验证偏差很是接近的结果。因此,咱们知道若是d等于1的话,意味着用一个很简单的函数来拟合数据。也就是说,咱们会获得一个较大的交叉验证偏差(红色曲线标注1)。而若是咱们用一个中等大小的多项式次数来拟合时,在前一张幻灯片中咱们用的d等于2,那么咱们会获得一个更小的交叉验证偏差。由于咱们找了一个可以更好拟合数据的次数。一样地,反过来,若是次数d太大,好比说d的值取为4,那么咱们又过拟合了,咱们又会获得一个较大的交叉验证偏差。所以,若是你平稳地过渡这几个点,你能够绘制出一条平滑的曲线,就像这样,我用Jcv(θ)来表示(红色曲线)。一样地,若是你画出Jtest(θ),你也将获得一条相似的曲线,这样一幅图也同时能帮助咱们更好地理解误差和方差的概念。机器学习
具体来讲,假设咱们得出了一个学习算法,但这个算法并无表现地如预期那么好。即交叉验证偏差或者测试集偏差都很大。那么咱们应该如何判断此时的学习算法是高误差的问题仍是高方差的问题呢?交叉验证偏差比较大的状况,对应着曲线中的左右两端(下图Jcv(θ)对应的曲线)。左端对应的就是高误差的问题,也就是咱们使用了一个过于小的多项式次数,好比d等于1。但实际上咱们须要一个较高的多项式次数来拟合数据。相反地,右端对应的是高方差问题。也就是说,多项式次数d对于咱们的数据来说太大了。具体地说,第1、高误差的状况,对应欠拟合的状况:交叉验证偏差和训练偏差都会很大。所以,若是你的算法有误差问题的话,那么训练集偏差将会比较大。同时你可能会发现交叉验证集偏差也很大。两个偏差可能很接近,或者可能验证偏差稍大一点,因此若是你看到这样的组合状况,那就表示你的算法正处于高误差的问题。第2、若是算法处于高方差的问题,那么Jtrain(训练偏差)会很小。也就意味着,训练集数据拟合得很是好。而交叉验证集偏差或者说交叉验证集对应的代价函数的值,将会远远大于训练集偏差(双大于符号是一个数学符号,表示远远大于,用两个大于符号表示)。所以若是存在这种组合的状况,预示着学习算法可能正处于高方差和过拟合的状况。同时,区分这两种不一样情形的关键依据是,若是算法处于高误差的状况,那么你的训练集偏差会很大。由于你的假设不能很好地拟合训练集数据。而当你处于高方差的问题时,你的训练偏差一般都会很小,而且远远小于交叉验证偏差。函数