【机器学习】如何快速找到模型算法中存在的问题

训练集、验证集和测试集

训练集(train sets)主要用于训练模型,调整参数,验证集(validation sets)用于进一步调参,而测试集(test sets)用于最后评估模型的精度。一般训练集、验证集和测试集的比例为60%,20%,20%。

Bias&Variance

我们的学习模型和真实值之间的误差主要来自三个方面:Bias,Variance和随机误差。其中随机误差,也叫噪声,是我们无法避免的。所以我们主要讨论Bias和Variance。
Bias通常是由于我们的模型欠拟合(underfit)造成的,而Variance通常是由于模型过拟合(Overfit)造成的。
下图是形象地表示出多项式的度与High Bias和High Variance的关系。(图来自Andrew Ng)
【机器学习】如何快速找到模型算法中存在的问题
下图是正则化参数λ\lambda与Bias/Variance之间的关系
【机器学习】如何快速找到模型算法中存在的问题
注意:在计算λ\lambda与误差之间的关系时,先用带有正则参数的损失函数J(θ)J(\theta)计算出Θ\Theta,然后将求出的Θ\Theta计算出不带正则的Jcv(θ)J_{cv}(\theta)Jtrain(θ)J_{train}(\theta)

学习曲线(learning curve)

学习曲线(learning curve)是表示样本数目大小(m)与训练集误差(Jtrain(θ)J_{train}(\theta))和验证集误差(Jcv(θ)J_{cv}(\theta))之间的关系图。
当模型有high bias的问题时,如果样本数量很小,那么Jtrain(θ)J_{train}(\theta)比较小,Jcv(θ)J_{cv}(\theta)会较大,但是当样本数量增加后,Jtrain(θ)J_{train}(\theta)Jcv(θ)J_{cv}(\theta)会慢慢变得相近,但是都大于期望的误差。所以对于高偏差的模型,仅仅增加样本的数量对模型帮助不是很大。
【机器学习】如何快速找到模型算法中存在的问题
当模型有high variance时,如果样本数量很小,那么Jtrain(θ)J_{train}(\theta)比较小,Jcv(θ)J_{cv}(\theta)会较大,当样本数量变大之后,Jcv(θ)J_{cv}(\theta)会变小,而Jtrain(θ)J_{train}(\theta)会变大,但Jtrain(θ)<Jcv(θ){J_{train}(\theta)}<{J_{cv}(\theta)},且两者之间有一些差距。对于high variance来说,增加样本数量可以帮助改善模型的准确度。
【机器学习】如何快速找到模型算法中存在的问题

经验总结

下面总结了一些可以有效减小high bias或者high variance的方法:
【机器学习】如何快速找到模型算法中存在的问题
对于神经网络来讲,如果隐藏单元或者隐藏层很少,即模型比较简单,可能会导致欠拟合,但是如果隐藏单元或者隐藏层很多,可能会导致过拟合。所以,对神经网络问题,一般来讲应设计神经网络应优先考虑3层网络(即有1个隐层)。一般地,靠增加隐层节点数来获得较低的误差,其训练效果要比增加隐层数更容易实现。
一般在写模型算法时,比较推荐的方法是:
1.首先花较少的时间完成一个简单的算法,并且在验证集上测试一下
2.画出学习曲线帮你决定你可以通过什么途径来减少误差。
3.误差分析:手动在验证集中检查那些被弄错了的样本,分析出哪些类型的的特征可能能帮助你有效减少误差。

倾斜数据(Skewed Data)

数据倾斜是指数据的分散度不够,导致大量的数据集中在某一类或者某几类中。对于这类数据,我们不能通过简单的准确度来评判模型的好坏,而是通过Precision和Recall两个维度来评判。
对于Precision和Recall的定义如下:
【机器学习】如何快速找到模型算法中存在的问题
对于有些模型来讲,Precision变大,那么Recall就会变小,Precision变小,Recall就会变大,那么就需要在Precision和Recall中权衡。F1 分数(F1 score)是衡量的一个指标。具体的表示为:
F1 Score=2PrecisionRecallPrecision+RecallF_1\space Score = 2*\frac{Precision*Recall}{Precision+Recall}
如果Precision和Recall都能很高就最好了。