10 应用机器学习的建议
机器入门系列文章中,我已经根据课程,介绍了许多算法,比如线性回归、Logistic回归,以及神经网络,等等。而针对具体的问题,我们采取了某种算法,实现后,发现效果不好,需要改进。有些时候需要增加数据量,有些时候则不需要;我们需要评估一个模型的好坏,从而比较选出更优者;或者根据模型出现的问题,提出解决模型训练出现问题的方法。
10.1 评价假设函数
分类、回归或者预测模型,最终会得出一个假设函数,然后根据输入,带入假设函数中,实现相应的功能,那么假设函数的正确与否与功能实现的优劣有直接关系。因此,在经过训练得出假设函数后,需要对其进行评价,看看它有没有欠拟合、过拟合或者其他问题。
如何评价假设函数
方法有很多,首先针对数据特征少的,数据量少的,可以画图,将假设函数和数据一起画出来,从图中直观显示拟合情况。
如下图所示:
由图可见,该假设曲线将所有训练数据都拟合得很好,也就是说训练集中代价很小,但整个趋势看上去不正确,很可能就是过拟合了。当然,画图这个方法是很直观的,但对于多个特征的数据,难以实现。
这时,我们可以采取另外一种方法,也是常用的方法。就是将训练的数据集,进行划分,划分为两部分,一部分是训练集,另外一部分是测试集。划分比例大概为7:3,同时需进行随机选取。
通过划分,我们可以得到两部分的数据,一部分是训练集,另一部分是测试集。对于线性回归,有以下定义:
训练代价:
测试代价:
对于Logistic回归,有以下定义:
训练代价:
测试代价:
对于多分类问题
首先定义误差函数:
代价为:
这个也是我之前有关手写数字识别的文章中计算测试集准确率的方法。
无论是线性回归还是Logistic回归,都是使用训练中使用训练代价函数,学习到的θ参数,代入测试代价函数中计算测试集中的代价大小,如果小,那该算法模型泛化能力强,如果训练集中代价小,而测试集中代价大,则是过拟合;而如果两个数据集中的代价都大,则是欠拟合的。
10.2 模型的选择
在实际建模解决问题时,我们会使用一些方法,比如多项式回归。当然,同一种方法也需要多次尝试,一次多项式拟合可能会欠拟合,四次多项式可能就过拟合了,当然怎么看这些同一类模型欠拟合和过拟合很重要。同时,有时为了避免过拟合,我们会加上一个正则化的参数,但是正则化的程度需要多少呢,这个也是需要考虑的。
如何选取模型
这里针对多项式的拟合问题讲解。对于一个庞大的数据集,假设我们使用一次、二次、三次、四次到十次多项式进行拟合,我们怎么怎么选择使用多少次是最合理的呢?
这时,我们需要将整个数据集分为三个部分,分别是训练集、交叉验证集(验证集)和测试集。
具体选择过程
使用训练集,通过求解训练代价最小化,可以得出θ参数的值;然后代入交叉验证集中,选取交叉验证集中代价最小的,作为模型,最后代入测试集中,得出泛化误差。
10.3 偏差与方差
如果运行的机器学习算法模型不理想,一般就会有两种情况,偏差(bias)大,或者方差(Variance)大,也就是要么欠拟合,要么过拟合。那么怎么判断和区别他们两者呢?
10.3.1 两者的判断
以多项式拟合为例子,通过画出不同多项式的模型关于训练代价和验证代价的曲线,可以直观的看出偏差大还是方差大。如下图所示:
由图可见,当假设函数的次数较小时,训练代价和验证代价同样大,这时就是偏差大的情况,也是欠拟合;而当假设函数的次数较大时,训练代价小,但验证代价远比训练代价大,这时就是方差大的情况,也就是过拟合。
10.3.2 正则化与偏差和方差的关系
当我们选取好了假设函数后,在之前的课程中,为了避免过拟合,我们会引入一个正则化的参数。而正则化参数是怎么定的呢?
假设四次多项式拟合的效果最好,因此我们决定使用四次多项式作为假设函数。
则其假设函数为:
如果我们加入正则化的参数,则其代价函数为:
这时,我们讨论一下λ的取值问题。
当λ的值很大时,为了使代价最小化,则有:,这时就会产生高偏差的情况。
当λ的值很小时,避免过拟合的程度变小,这时候就会产生高方差。
那么怎么选取合适的λ值呢
我们可以先列出一系列λ的值,比如:
将λ值代入训练代价函数中,求出θ参数,由例子中可见,有12组值,然后将这些θ值代入各自的交叉验证集中,计算代价值,然后选取交叉验证代价值最小的一组θ值作为模型的θ参数,最后代入测试集中,求出代价,这个就是用来衡量模型的泛化能力的依据了。
下面我们画出代价关于λ的函数曲线。
10.4 学习曲线
形象一点来说,学习曲线能够反映学习算法的学习情况。通过学习曲线,我们可以直观的判断我们的模型的学习情况,学得不够(欠拟合)还是学得太好(过拟合),从而从不同方面优化算法模型,而不是浪费时间。
一般情况下的学习曲线,如下图所示:
分析:一般而言,当训练集小时,假设函数容易把训练数据大多或者全部拟合,这样训练代价就小,但泛化能力低,所以验证集代价大;相反,当数据集大了,假设函数不能将大多数的数据都完全拟合,这样,训练代价就大,但数据多了,泛化能力有所增强,所以验证代价也小了。
讨论高偏差和高方差的情况
高偏差时,训练集小,训练代价小,但验证代价大;训练集大,训练代价大,验证代价也大,同时,增加训练集的规模,验证代价同样大。
高方差时,训练集小,训练代价小,验证代价大;训练集大,训练代价大,验证代价会减少,同时,增加训练集规模能减少验证代价,增强泛化能力。
这些判断都是基于学习曲线反映出来的结果,因此这种方法也叫学习曲线诊断法。
10.5 总结与扩展
下面总结几种措施的应用场景。如下表所示:
同时,我们把之前在多项式中的结论,拓展到神经网络中。
在神经网络中,如果隐含层较少,或者隐含层神经单元较少,那么模型容易欠拟合,但是优点是计算量小;而隐含层多,并且隐含层神经单元多,那么模型容易过拟合,但是往往效果比少的好,只是运算量大。在神经网络中,如果隐含层多,为了避免过拟合,我们可以加入正则化参数,也可以采取dropout。