比如说我们针对某一个数据集选用了线性回归或者逻辑回归,又或者是神经网络等等的其中一种算法,训练好了一个模型,但是在用测试集数据进行测试的时候,我们的模型表现的并不是很好。那么此时,我们应该做什么? 是直接更换一种模型? 是尝试更多的训练样本? 是减少更多的特征? 还是加入更多的特征? 我们想到了很多的方法对模型进行调试,或者是更换模型,那么选择哪一种方式呢? 在众多的方式中最快捷的选出最有效的一种调优方式,是一个优秀程序员能力的体现。所以,我们需要知道,模型调优的步骤。
我们再遇到上述的,模型在测试集表现不佳的情况下,不应该盲目的随机选择一种调优方式去做,有可能适得其反,并且浪费时间。 我们运用机器学习诊断法来帮助诊断模型到底是出了什么样的问题,然后对模型做出有针对的调优。
诊断法其实就是一种测试方法,通过执行这种测试,能够深入了解我们现在所选择算法而建立起来的模型,是否对于这份数据集是有用的。通常,也能告诉我们,想要对这一模型进行调优,什么样的尝试,才是有意义的。
当我们训练好的模型在测试集表现的不好的时候,多半分为两种情况:要么是偏差比较大,要么是方差比较大。偏差指的是我们的测试集数据中,真实值和预测值之间的差距,差距越大,偏差越大,也就是我们在拟合模型中的欠拟合问题;方差指的是拟合曲线的波动程度,当方差很大时,我们可以想象,我们模型拟合出的曲线是一条尽量去贴合每一个样本点的样子,方差越大,表示波动程度也越大,表示在训练集上拟合了尽可能多的样本点,但是失去了泛化能力,以至于模型在测试集上表现得不尽如人意,这也是过拟合问题。 所以,如果模型在诊断中是高偏差,低方差的类别,那么这属于欠拟合问题;如果模型在诊断中是低偏差,高方差的类别,那么这属于过拟合问题。
假设函数也就是我们说的样本的预测值。通过将训练好的模型参数和测试数据传入模型,获取到预测值,根据预测值和真实值的对比,评估假设函数的好坏,来总结得出模型是过拟合还是欠拟合问题。 为了检验算法是否过拟合,将数据分成训练集和测试集,通常用70%的数据作为训练集,用剩下30%的数据作为测试集 很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。比如说我们的数据是顺序排列的,回归问题中,标签结果由小到大依次排列,分类问题中,标签结果也是有序排列的,那么没有洗牌(将数据顺序打乱至均匀状态)的话,我们切分得到是训练集和测试集的样本类别是不全的,那么这种切分其实是错误的。
交叉验证是把一份数据,在洗牌打乱至均匀以后,切分为训练集和测试集,再把训练集进行等分切分,比如说将训练集切成了10份,一次取出其中一份来作为验证集,剩余9份组合成真正的训练集,做十次这样的模型训练,得到误差最小的一次训练的模型,用之前留好的测试集数据,进行测试。 这样做的好处是,在数据样本不够大的时候,我们可以加大数据的利用率,在众多较好的模型中,选择最好的模型,更有利于我们模型的训练。
假设要在10个不同次数的多项式模型之间进行选择,显然越高次数的多项式模型越能够适应训练数据集,但是适应训练数据集并不代表着能推广至一般情况,应该选择一个更能适应一般情况的模型。 模型选择的方法为: 使用训练集训练出10个模型 用10个模型分别对交叉验证集计算得出交叉验证误差(代价函数的值) 选取代价函数值最小的模型 用上一步中选出的模型对测试集计算得出推广误差(代价函数的值)
选择λ的方法为: 使用训练集训练出12个不同程度正则化的模型 用12模型分别对交叉验证集计算交叉验证误差 选择得出交叉验证误差最小的模型 运用步骤3中选出模型对测试集计算得出推广误差,也可以同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图表上 当lamda较小时,训练集误差较小(过拟合),而交叉验证集误差较大 随着lamda增加时,训练集误差较大(欠拟合),而交叉验证集误差则是先减少后增加。
学习曲线就是一种很好的“诊断法”工具,使用它判断某一个学习算法是否处于高偏差、方差问题。 学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(m)的函数绘制的图表。 当训练较少数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
作为例子,尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大,误差都不会有太大改观 也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。 假设使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。 也就是说在高方差/过拟合的情况下,增加更多数据到训练集,可能可以提高算法效果。
不同的算法在难易程度上有差异,但是并没有优劣之分,甚至于对于我们来说,同时可以解决问题的算法,肯定是越简单是越好的。 事实上,如果你选择任意一个算法,可能是选择了一个“劣等的”算法,如果你给这个劣等算法更多的数据,那么从这些例子中看起来的话,它看上去很有可能会比其他算法更好,甚至会比"优等算法"更好。 “取得成功的人不是拥有最好算法的人,而是拥有最多数据的人”。 一个高性能的学习算法,希望它不要有高的偏差和方差。
类偏斜情况表现为训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。 算法预测结果的四种情况:
正确肯定(True Positive,TP):预测为真,实际为真正确否定(True Negative,TN):预测为假,实际为假错误肯定(False Positive,FP):预测为真,实际为假错误否定(False Negative,FN):预测为假,实际为真 查准率=TP/(TP+FP)例,在所有我们预测有恶性肿瘤的病人中,实际上有恶性肿瘤的病人的百分比,越高越好。(在预测为真中,正确肯定的比率) 查全率=TP/(TP+FN)例,在所有实际上有恶性肿瘤的病人中,成功预测有恶性肿瘤的病人的百分比,越高越好。(在实际为真中,正确肯定的比率)机器学习中的模型调优根据经验的慢慢积累,会做得越来越好。同样的数据,放到不同的人手里操作,会得到不同的结果。不仅仅是算法和模型的不同,更多的体现在数据的预处理上,如果预处理做的好,特征选择的好,权重分配的好,那么会省下很多的力气,并且在后续的调优过程中,也会展现出很直观的过拟合或者欠拟合,我们再调模型的时候,也会顺利的找出参数差异所在。