姓名:曾祎
学号:15020120057
转自:https://blog.csdn.net/zhihua_oba/article/details/78684257
【嵌牛导读】初如机器学习,肯定会被经验误差、泛化误差、bias等等等等的名词所困惑,曾小编便是特意从全网搜罗到了很用心很适合初学者扫盲科普自己的文章,光速带你明白如何解决机器学习中的基础问题,快带领自己进入机器学习的世界吧。
【嵌牛鼻子】人工智能 深度学习 初学者
【嵌牛提问】作为初学者,你真的搞懂了怎么判别欠拟合和过拟合么?
【嵌牛正文】
主要内容 :
1.经验误差与泛化误差
2.偏差与方差
3.欠拟合与过拟合
4.交叉验证
一、经验误差(训练误差)与泛化误差
经验误差(训练误差):模型在训练集上的误差称为“经验误差”(empirical error)或者“训练误差”“training error”。
泛化误差:模型在新样本集(测试集)上的误差称为“泛化误差”(generalization error)。
二、偏差与方差
泛化误差可分解为偏差、方差与噪声之和,即generalization error=bias2+variance+noisegeneralization error=bias2+variance+noise。
“噪声”:描述了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
假定期望噪声为零,则泛化误差可分解为偏差、方差之和,即generalization error=bias2+variancegeneralization error=bias2+variance。
“偏差”:描述了模型的期望预测(模型的预测结果的期望)与真实结果的偏离程度。偏离程度越大,说明模型的拟合能力越差,此时造成欠拟合。
“方差”:描述了数据的扰动造成的模型性能的变化,即模型在不同数据集上的稳定程度。方差越大,说明模型的稳定程度越差。如果模型在训练集上拟合效果比较优秀,但是在测试集上拟合效果比较差劣,则方差较大,说明模型的稳定程度较差,出现这种现象可能是由于模型对训练集过拟合造成的。
简单的总结一下:偏差大,说明模型欠拟合;方差大,说明模型过拟合。如何平衡模型的偏差和方差,一直是我们追求的效果。感兴趣的童鞋,可以阅读《Understanding the Bias-Variance Tradeoff》。
下图可以帮助读者,更加直观的理解“偏差”与“方差”。
图1
三、欠拟合与过拟合
如何通过学习曲线来识别模型是否发生了欠拟合/过拟合呢?如果发生了欠拟合/过拟合,我们又该如何处理呢?
1、横轴为训练样本数量,纵轴为误差:
首先,我们来看如何通过学习曲线识别是否发生了欠拟合/过拟合,如下图2。模型欠拟合时,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大;模型过拟合时,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大。模型正常时,在训练集以及测试集上,同时具有相对较低的偏差以及方差。
图2
然后,我们想办法解决欠拟合/过拟合。根据上图2,我们发现:当模型欠拟合的时候,我们发现增大训练集,偏差无法降低,无法解决欠拟合问题;当模型过拟合的时候,我们发现增大训练集,方差减小,可以解决过拟合问题。
2、横轴为模型复杂程度,纵轴为误差:
横轴表示模型的复杂程度,增加模型的复杂程度的方法,比如增加特征项、添加多项式等等。
首先,我们来看如何通过学习曲线识别是否发生了欠拟合/过拟合,如下图3。模型在点A处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大,模型欠拟合;模型在点C处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大,模型过拟合。模型复杂程度控制在点B处为最优。
图3
然后,我们想办法解决欠拟合/过拟合。根据上图3,我们发现:当模型欠拟合时,可以增加模型的复杂程度;当模型过拟合时,可以减小模型的复杂程度。
3、横轴为正则项系数,纵轴为误差:
一般情况下,为了限制模型造成过拟合,可以添加正则项(惩罚项)。
首先,我们来看如何通过学习曲线识别是否发生了欠拟合/过拟合,如下图4。模型在点A处,在训练集上具有较低的误差,在测试集上具有较高的误差,此时模型的方差较大,模型过拟合;模型在点C处,在训练集以及测试集上同时具有较高的误差,此时模型的偏差较大,模型欠拟合。模型正则项系数控制在点B处为最优。
图4
然后,我们想办法解决欠拟合/过拟合。根据上图4,我们发现:当模型过拟合时,可以增大模型正则项系数;模型欠拟合时,可以减小模型正则项系数。
上文中,我们介绍了,如何通过学习曲线识别欠拟合/过拟合,以及对应的解决方法。接下来,我们针对欠拟合/过拟合,给出其他对应的解决方法。
如何解决欠拟合:
1)添加其他特征项,有时候我们模型出现欠拟合,是因为特征项不够导致的,可以添加其他特征项来解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如,FM模型、FFM模型,其实就是线性模型,增加了二阶多项式,保证了模型一定的拟合程度。
3)减小正则化系数,前文中已经分析。
等等,还有很多方法,可以对应下边的过拟合解决方法来进行欠拟合解决方法的选择。
如何解决过拟合:
1)重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
2)增加训练样本数量,前文中已经分析。
3)降低模型复杂程度,前文中已经分析。
4)增大正则项系数,前文中已经分析。
5)采用dropout方法,这个方法在神经网络里面很常用。dropout方法,通俗一点讲就是在训练的时候让神经元以一定的概率不工作。
6)early stoping。
7)减少迭代次数。
8)增大学习率。
9)添加噪声数据。
10)树结构中,可以对树进行剪枝。
等等,方法很多,需要根据实际问题,实际模型,进行选择。
四、交叉验证
交叉验证,主要目的是针对模型的“泛化误差”(generalization error)进行评估,得到模型的“泛化误差”的近似值。当有多个模型可以选择时,我们通常选择“泛化误差”最小的模型。
这里主要介绍“K折交叉验证”:
1、将数据集(其实是训练集,我们暂且称为数据集吧,假设含有N个样本)分成K份(每份含有N/K个样本),选择其中1份作为测试集,另外K-1份作为训练集。这样的话,测试集就有K种情况。
2、在每种情况中,用训练集训练模型,用测试集测试模型,计算模型的泛化误差(暂且这么叫吧)。
3、将K种情况下,模型的泛化误差取均值,得到模型最终的泛化误差。
注:一般2<=K<=10。
训练集中样本数量要足够多,一般至少大于总样本数的50%。
训练集和测试集必须从完整的数据集中均匀取样。均匀取样的目的是希望减少训练集、测试集与原数据集之间的偏差。当样本数量足够多时,通过随机取样,便可以实现均匀取样的效果。