为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外,还可以计算误分类的比率,对于每一个测试集实例,计算:
然后对计算结果求平均。
一般越高次数的多项式模型越能够适应我们的训练数据集,但是适应训练数据集的模型可能导致过拟合,我们应该选择一个更能适应一般情况的模型。一般使用交叉验证集来帮助选择合适的模型。
如果给定的样本数据充足,我们通常使用均匀随机抽样的方式将数据集划分成3个部分——训练集、验证集和测试集,这三个集合不能有交集,常见的比例是8:1:1。需要注意的是,通常都会给定训练集和测试集,而不会给验证集。这时候验证集该从哪里得到呢?一般的做法是,从训练集中均匀随机抽样一部分样本作为验证集。
之所以出现交叉验证,主要是因为训练集较小。无法直接像前面那样只分出训练集,验证集,测试就可以了(简单交叉验证)。
需要说明的是,在实际情况下,人们不是很喜欢用交叉验证,主要是因为它会耗费较多的计算资源。一般直接把训练集按照50%-90%的比例分成训练集和验证集。但这也是根据具体情况来定的:如果超参数数量多,你可能就想用更大的验证集,而验证集的数量不够,那么最好还是用交叉验证吧。至于分成几份比较好,一般都是分成3、5和10份。
交叉验证集:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集
模型选择的方法为:
对于训练集,当 较小时,模型拟合程度更低,误差较大;随着 的增长,拟合程度提高,误差减小。
对于交叉验证集,当 较小时,模型拟合程度低,误差较大;但是随着 的增长,误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
训练集误差和交叉验证集误差近似时:偏差/欠拟合
交叉验证集误差远大于训练集误差时:方差/过拟合
正则化可防止出现过拟合状况,但是无法选出合适的正则参数 。选择一系列的想要测试的 值,通常是 0-10 之间的呈现 2 倍关系的值(如: 0,0.01,0.02,0.04,0.08,0.15,0.32,0.64,1.28,2.56,5.12,10共 12 个)。我们同样把数据分为训练 集、交叉验证集和测试集。
选择的方法为:
1.使用训练集训练出 12个不同程度正则化的模型;
2.用 12个模型分别对交叉验证集计算的出交叉验证误差;
3.选择得出交叉验证误差最小的模型;
4.运用步骤 3中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ的值绘制在一张图表上。
当 较小时,训练集误差较小(过拟合)而交叉验证集误差较大;
随着 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加。
通过学习曲线来判断某一个学习算法是否处于偏差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量()的函数绘制的图表。
即,如果我们有 100行数据,我们从 1行数据开始,逐渐学习更多行的数据。思想是:当训练较少行数据的时候,训练的模型将能够非常完美地适应较少的训练数据,但是训练出来的模型却不能很好地适应交叉验证集数据或测试集数据。
利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:
在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并
且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数
据可以提高模型的效果
在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代价较小;使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。
构建一个学习算法的推荐方法为:
设定某个实数来评估你的学习算法,并衡量它的表现,即为误差度量值。就使用一个合适的误差度量值,这有时会对于你的学习算法造成非常微妙的影响,这件重要的事情就是偏斜类(skewed classes)的问题。
类偏斜情况表现为我们的训练集中有非常多的同一种类的实例,只有很少或没有其他类的实例。
例如用算法来预测癌症是否是恶性的,在我们的训练集中,只有 0.5%的实例 是恶性肿瘤。假设我们编写一个非学习而来的算法,在所有情况下都预测肿瘤是良性的,那么误差只有 0.5%。然而我们通过训练而得到的神经网络算法却有 1%的误差。这时,误差的大小是不能视为评判算法效果的依据的。
查准率(Precision)和查全率(Recall) 我们将算法预测的结果分成四种情况:
对于上述预测肿瘤的例子中,假使,我们的算法输出的结果在 0-1 之间,我们使用阀值 0.5 来预测真和假。
如果想要高的查准率,我们可以使用比 0.5更大的阀值,如 0.7,0.9。这样做我们会减少错误预测病人为恶性肿瘤的情况,同时却会增加未能成功预测肿瘤为恶性的情况。
如果想要高的查全率,尽可能地让所有有可能是恶性肿瘤的病人都得到进一步地检查、诊断,我们可以使用比 0.5更小的阀值,如 0.3。
通过以下公式确定合适的阈值,选使F1最高的阈值。
F 1 S c o r e = 2 ∗ P R P + R F1Score=2* \frac{PR}{P+R} F1Score=2∗P+RPR