前言
这一章内容还是紧接上一章内容,在前面给大家介绍了线性回归,逻辑回归还有神经网络算法。在实际中,很多研究人员在解决一个问题时,选用了其中的一种算法,然而在经过了大量的计算后,结果可能不是预想的结果,这个时候,大家可能想着是研究的数据不够,就又会去大量地统计数据,比如预测房子价格问题,可能会去采访大量的户主来获取更多的信息,这个就需要花上好几个月的时间,而且最终可能并没有起什么作用,所以我们就会思考,如果我们发现我们预测的结果不是很理想时,我们需要做哪些措施来进行有效的补救,这就是这章讨论的重点。
最后,如果有不对的理解,希望大家不吝赐教,谢谢!
第八章 Advice for applying machine learning(对于应用机器学习的建议)
8.1 下一步该如何做
假设当你在做一个预测房子价格问题时,你已经对你需要训练的数据做出了很好的分析,构造出了预测函数,对于costFunction也是当前最小值,然而在对一个新的数据进行预测时确发现结果有很大的误差,这个时候我们从哪些方面进行改进了?你可能会这样做:
1)去得到更多的训练数据
2)尝试选用更少的数据特征,丢掉一些特征
3)尝试添加多项式的项比如增加x1x2,x1^2,x2^2等等
4)尝试减小
5)尝试增大
...
那么问题就来了,是不是以上任意一种方法就可以解决问题?答案肯定是不对的,就如对症下药,所以我们也需要针对不同的问题采用不同的方法进行改进。
对于以上的分析,我们就有了一个诊断法,用来诊断一个机器学习方法出现了什么问题,需要怎样的改进。诊断法同样需要花时间去落实,但是总比无头苍蝇做一些无用功好,这可以充分地利用我们的时间。
8.2 评估一个假设
我们首先要做的即是对我们做出的假设进行评估,先以一个线性回归的问题来进行说明,例如我们在前面讨论过的房子预测问题的过度拟合,如图1所示。
图1 过度拟合
在这个问题中,我们发现对于训练数据,我们进行了很好的训练,使它的代价函数值接近0,然而对于新的预测数据确不是很好,在这里由于开始我们对于我们做出的假设并不知道它的适应性如何,所以我们就需要通过原本的数据集就可以知道我们的假设是否合理,在这里我们有一个做法就是,把所有的训练数据分成两部分,70%的还是用做训练数据,而剩下的30%则作为测试数据。具体做法如下:对70%的训练数据进行学习,求得使代价函数最小的值,然后用训练数据得出的结果对30%的测试数据进行求代价函数,则可以判断其假设的不合理性。
前面给大家介绍的是怎样判断线性回归问题的合理性,同样逻辑回归也适用,也是进行把训练数据分成两部分,70%的训练集和30%的测试集,通过训练集得出的结果在对测试集求其代价函数时,即可以判断在分类时误判的可能性。
8.3 对模型的挑选
在前面也给大家介绍了,我们的假设模型不止一种,虽然在前面我们喜欢以线性关系来模拟输入和输出的关系,但我也给大家进行了说明,实际问题中,很多问题以线性关系来进行模拟会有很大的偏差,那么我们该如何选取模型了?在这里将给大家介绍一个严谨的评判标准。在这里我们依旧拿出预测房子价格问题来解释这个方法,在图1中出现了过度拟合的问题,那么我们到底选择多项式的次数为多少的模型才能更好地预测结果了?
在这里我们对不同的假设模型通过训练集的数据计算出使代价函数值最小的,并带入测试数据中求出测试数据的,进行比较,得到最小值,即我们认为是最好的预测模型。
1)
2)
3)
...
10)
经过分析比较,我们选择了,当这个能是否能很好地预测新的数据了?有没有可能我们所选择出来的只是适合测试数据而已,所以我们为了避免这个问题,我们对数据集又重新进行规划,60%的还是作为训练集,20%作为交叉验证集,20%作为测试集,这个时候我们用来选择的是根据交叉验证集的代价函数值来选择,这个时候就成了如下这样:
1)
2)
3)
...
10)
再通过来检测这个泛化误差。
把数据分成三部分也一直是大家公认的比较好的方法,通过这个方法,我们就没有直接通过训练集来预测数据,这样弱化了训练集的作用,比较有普遍性。
8.4 Bias or Variance(偏差还是方差)
对于前面也给大家说明了,我们要对模型进行诊断,既然有诊断就必须有个结论,在结论中,我们会有两种结论偏差或者方差,下面我们详细分析什么情况是偏差,什么情况是方差。
如图2所示,这是我们前面在对房子价格预测问题上,对假设做出的几个不同的模型,对模型我们也进行了分析比较,对于第一个模型,我们给出的结论是欠拟合,第二个模型是正好,第三个模型是过拟合。
图2 不同模型的图像
Training error:
Cross validition error:
对于图2中不同程度的多项式(我们用d来表示多项式的次数),我们有如图3所示的关于d的图。
图3 和d的关系
如果我们的预测不是很好的话,那么我们的就会很高,那么这是偏差问题还是方差问题了?
Bias(underfit):会很高,而 (d较小)
Variance(overfit):会很低,而 (d较大)
对于上面的定义,也不难解释,对于过度拟合,就是模型尽可能接近训练集数据,所以我们的训练误差会很小,而欠拟合则是模型没有很好地贴近训练集,所以训练误差会很大,而不管是两者中的哪一种,都不是很好的预测模型,所以我们的交叉误差都会很大。
8.4 正则化和偏差或者方差的关系
对于上面的讨论,我们都还没考虑正则化项,而对于正则化中,我们引入了一个新的变量,所以我们需要讨论下对模型的影响,如图4所示,我们的模型是:,而当很大时,我们就可以忽略掉后面4项了,这个时候就是一条水平线了如图4的第一个图,而当很小时,假设为0,则如图4的第三个图。
图4 不同对模型的影响
同样地,我们在这里选取不同的,分别求出使J()最小的,然后对应地带入到,得到最小的带入计算泛化误差。
我们在这里同样地做出关于的图,如图5所示。
图5 和的关系
在这里,当较小时,很低,而很高,是方差;当较大时,很高,而也很高,是偏差。
8.5 学习曲线
回到我们这章的主要问题上来,我们要进行判断的是进行改进的方法是否有效,在这里我给大家介绍一个learning curves(学习曲线法)来判断此方法是否有效,比如我们前面的方法之一增加训练的数据,即增加m。
1)当是高偏差问题时
我们画出关于m的图像,如图6所示,从图中我们会发现,当m很小时,较小,比如图7所示,而我们的很大,当m很大时,慢慢增大接近一个水平,会慢慢减小,接近水平,两者近似相等,当m再增大,我们会发现两者不会有什么改变,所以可以说明增加m不会对高偏差问题有所改善。
图6 高偏差
图7 m较小时
2)当是高方差问题时
我们同样有关于m的图像,如图8所示,我们会发现随着m的增加,会不断地减小,所以对于高方差问题来说,增加m是有用的。
图8 高方差问题
8.6 总结
在前面我们提出了下一步该如何做的一些做法,但没有指明是解决那类问题的,在这里我们重新拿出那些做法来一一说到。
1)去得到更多的训练数据 高方差
2)尝试选用更少的数据特征,丢掉一些特征 高方差
3)尝试添加多项式的项比如增加x1x2,x1^2,x2^2等等 高偏差
4)尝试减小 高偏差
5)尝试增大 高方差
最后跟大家提一下神经网络,在神经网络中,如果模型的层次比较少即较少,则容易发生欠拟合问题,而如果层次比较多即较多,则容易发生过度拟合问题,我们同样用正则化来解决这个问题。