如何选用这些手段需要我们对模型进行测试与评估,答案会在最后一小节给出
在学习时我们常常会通过上课和刷题来提高对知识的掌握能力,我们最后的目的就是在最后的考试取得好成绩,同时平时做题的正确率并不能一定反映最终考试的成绩。在机器学习中同样如此,平时刷题就相当于模型学习参数,考试就相当于最终检测模型性能,在训练集上的表现优异并不一定代表模型在实际应用中表现良好(但需要注意的是,如果训练集表现都很差,测试集肯定不会好到哪里去)。
通常以7:3的比例将原数据集划分为训练集和测试集,训练集用于让模型学习参数,测试集只评估模型的性能,而不进行训练。需要注意的是,训练集和测试集均要含有各种类型的数据(包括下面提到的验证集),且测试集不能包含训练集出现的数据,比如一个10分类问题中,训练集和测试集的数据都需要包含10种分类的数据。此外,数据集在分割前要对数据进行“洗牌”。
对于线性回归模型,测试集计算损失,此时的损失函数不需要加入惩罚项
对于逻辑回归模型,测试集计算损失
此外针对逻辑回归等分类模型来说还可以计算分类正确的比率
通常我们为了提高模型的性能,就会想提高模型在训练集上的表现,于是我们修改一个超参数(迭代次数,学习率α,正则化参数λ,生成多项式最高次方等等),就看一看测试集的表现,找到一个最好的超参数组合。这实际上是错误的,虽然每次都是在训练集上进行训练的,但会导致你设置的参数组合所提高的拟合效果都是针对提供的这个测试集,因为这个测试集并不包括现实中所有的情况。
于是就出现了验证集(吴恩达视频中也叫交叉验证集Cross-Validation,两个是同一个东西),验证集用于选择超参数,确定由某种参数组合构成的最终的模型。即使用60%的数据作为训练集,20%的数据作为验证集,20%的数据作为测试集。测试集使用一次,它既不参与学习参数过程,也不参数超参数选择过程,只用于最终评估模型的性能。
如果说平时上课和刷题刷题是训练集,测试集是高考,那么验证集就相当于模拟考试,模拟考试可以很大程度反映我们学习的情况,然后调整自己的不足。
验证集并不是必须的,如果你确定了只用某个模型以及不需要调整超参数,此时就不需要验证集。
模型选择的步骤:
K折交叉验证(K-fold cross-validation)
对于比较小的数据集来说,既要划分出测试集,也要划分出验证集会导致训练数据可能会不够,模型欠拟合,可以采用K折交叉验证的方法。
原始的数据集只需划分为训练集和测试集,然后训练集在训练时分成K个互斥的子集(通常是相等大小),称为折叠(folds),K通常取值在3,5,10等。接着,模型会进行K次训练和验证,每次都使用其中的K-1个折叠作为训练集,剩下的1个折叠作为验证集。
K折交叉验证的步骤如下:
数据集划分:训练时将训练集分成K个子集,其中一个子集作为验证集,其余K-1个子集作为训练集。
模型训练:使用K-1个子集的数据进行模型训练。
模型验证:用剩下的1个子集作为验证集进行模型验证。
性能评估:记录模型在验证集上的性能指标,如准确率、精确率、召回率、F1分数等。
重复步骤2~4:重复进行K次训练和验证,每次选择不同的验证集,其他K-1个子集作为训练集。
性能评估的平均值:计算K次验证的性能指标的平均值,作为模型的最终在验证集上的表现
K折交叉验证的优势在于:
- 减少模型评估的方差:通过多次不同子集的训练和验证,可以更准确地评估模型性能,减少因数据分布不均匀而导致的偏差。
- 充分利用数据:每个样本都有机会既作为训练数据又作为验证数据,提高了数据利用率。
- 对模型泛化能力有更好的评估:因为模型在不同的数据集上进行验证,所以对模型的泛化能力有更全面的评估。
K折交叉验证也有一些缺点,如计算成本较高(需要训练K次模型)
总的来说,K折交叉验证特别适用于小样本数据集和需要充分评估模型泛化能力的情况。
在机器学习中,偏差(bias)和方差(variance)是评估模型性能和泛化能力的两个重要概念。它们可以帮助理解模型在训练集和测试集上的表现以及模型的整体性能。
偏差(Bias):
方差(Variance):
假设我们使用不同多项式模型,x轴代表多项式最高次方(d)从低到高,这也意味着模型从复杂到简单,y轴代表损失。会得到下面这样一个图,其中代表模型在交叉验证集的损失,
代表模型在训练集的损失。
对于训练集来说,d比较小时,模型比较简单,模型欠拟合,损失较大。随着d的增长,模型逐渐复杂,能力变强,拟合程度提高,损失会逐渐降低
对于交叉验证集,d比较小时,模型比较简单,模型欠拟合,损失较大。但随着d的增长,损失会呈现先减小后增大的趋势,转折点就是模型开始过拟合训练集的时候。
根据偏差与方差的定义,我们可以大致划分出如下区域
高偏差/欠拟合:
1. 交叉验证集损失和训练集损失都非常大
2.交叉验证集损失和训练集损失接近
高方差/过拟合
1.训练集损失很低
2.交叉验证集损失远大于训练集损失
在我们训练模型的过程中,一般会使用一些正则化方法来防止过拟合。但是正则化参数是一个超参数,正则化程度可能太强了,也可能太弱了。
需要注意的是,在计算损失时,不需要带有正则项,正则项仅仅在训练时使用
学习曲线可以用于判断某个模型是否处于偏差、方差问题
x轴为样本的数量,y轴为损失
当训练样本比较少时,模型很容易就能拟合样本点,所以在训练集上的损失非常低,但这也意味着它学习到的东西非常少,所以在新的数据验证集上损失会很大。
随着样本数量的增加,模型很难完美的拟合所有的数据点,样本数量越多这种情况就越多,点的偏差会增加,所以训练集损失不断增加。同时随着样本数量的增加也意味着模型学习到的东西越来越多,所以在新的数据验证集损失会逐渐变小,但一般来说都是大于
的,因为验证集毕竟是新的数据集。
高偏差指模型预测的结果与真实结果差距较大。随着训练样本的增加,训练集损失在上升到一定程度后也不会再上升(损失是要除2m的,就是每个点平均损失),因为模型太简单了,再多的数据也无法帮助它,验证集同样如此。此外这个损失的纵坐标的值会大于1.中的值
高方差表示模型在不同数据集上预测结果的差异程度大,泛化能力弱,模型复杂,对训练集过拟合。此时增加数据集大小是有用的,让模型认识到更多数据,会让验证集损失会继续下降。
随着迭代次数的增加,梯度下降的作用让训练集和验证集的损失都会减少,然后趋于平稳。对于逻辑回归来说表现为正确率不断上升后趋向平稳
对于一个合适的模型来说,趋势是一样的,但最终误差和正确率表现都要好于高偏差
3.高方差
对于高方差的模型,其验证集和训练集损失随着迭代次数不断下降,然后验证集损失会开始上升,转折点是模型开始过拟合时,此时它会开始捕捉到一些训练集中的特定特征或噪声,这些特征对验证集并不适用,因此在验证集上的表现开始下降。同样对于逻辑回归验证集正确率会先上升后下降。
好的模型是偏差-方差权衡(Bias-Variance Tradeoff):
在实际应用中,理想的模型是能够在减少偏差的同时控制方差,以取得良好的泛化能力。
手段:
大部分算法都具有相似的性能,随着训练数据集的增加,算法的性能也会增加。事实上,如果你选择的可能是一个劣等的算法,但是你能够给予它非常的训练数据,有可能会比所谓的优等算法更好,提高模型性能,大量的训练数据永远是首位
蓝、绿、深蓝三种模型尽管在在一开始性能有较大差异,但在训练数据不断增加后,他们的性能趋向一致,此外红色模型虽然在一开始为优等算法,但在后面性能却不如上面三种
1.首先训练数据集要尽可能地大,甚至说训练集比参数的数量还大,复杂算法过拟合(高方差)的可能性就会比较低,训练误差就有希望接近测试误差
2.其次算法本身要够复杂,包含足够的参数,可以拟合复杂的函数(线性回归/逻辑回归使用更多的特征,神经网络隐藏层数更加多),避免了高偏差
大量的数据保证方差小,多参数算法保证偏差小,二者相辅相成,最终在测试集上的损失就会很小