1.测试集不可知的悖论

我们知道机器学习模型主要通过模型在测试集上的运行效果来判断模型好坏,测试集相当于是“高考",而此前的模型训练都相当于是在练习,但怎么样的练习才能有效的提高高考成绩,这里就存在一个“悖论”,那就是练习是为了高考,而在高考前我们永远不知道练习是否有效,那高考对于练习的核心指导意义何在?在机器学习领域,严格意义上的测试集是不能参与建模的,此处不能参与建模,不仅是指在训练模型时不能带入测试集进行训练,更是指当模型训练完成之后、观察模型在测试集上的运行结果后,也不能据此再进行模型修改(比如增加神经网络层数),后面我会提到,把数据带入模型训练是影响模型参数,而根据模型运行结果再进行模型结构调整,实际上是修改了模型超参数,不管是修改参数还是超参数,都是影响了模型建模过程,都相当于是带入进行了建模。是的,如果通过观察测试集结果再调整模型结构,也相当于是带入测试集数据进行训练,而严格意义上的测试集,是不能带入模型训练的。(这显然是一个有点绕的"悖论".)

但是,机器学习建模的核心目标就是提升模型的泛化能力么?而泛化能力指的是在模型未知数据集(没带入进行训练的数据集)上的表现,虽然测试集只能测一次,但我们还是希望有机会能把模型带入未知数据集进行测试,此时我们就需要一类新的数据集--验证集。验证集在模型训练阶段不会带入模型进行训练,但当模型训练结束之后,我们会把模型带入验证集进行计算,通过观测验证集上模型运行结果,判断模型是否要进行调整,验证集也会模型训练,只不过验证集训练的不是模型参数,而是模型超参数,关于模型参数和超参数的概念后面还会再详细讨论,当然,我们也可以把验证集看成是应对高考的“模拟考试”,通过"模拟考试"的考试结果来调整复习策略,从而更好的应对“高考"。总的来说,测试集是严格不能带入训练的数据集,在实际建模过程中我们可以先把测试集切分出来,然后“假装这个数据集不存在",在剩余的数据集中划分训练集和验证集,把训练集带入模型进行运算,再把验证集放在训练好的模型中进行运行,观测运行结果,再进行模型调整。

总的来说,在模型训练和观测模型运行结果的过程总共涉及三类数据集,分别是训练集、验证集和测试集。不过由于测试集定位特殊,在一些不需要太严谨的场景下,有时也会混用验证集和测试集的概念,我们常常听到“测试集效果不好、重新调整模型“等等,都是混用了二者概念,由于以下是模拟练习过程,暂时不做测试集和验证集的区分。在不区分验证集和测试集的情况下,当数据集切分完成后,对于一个模型来说,我们能够获得两套模型运行结果,一个是训练集上模型效果,一个是测试集上模型效果,而这组结果,就将是整个模型优化的基础数据。

2.模型拟合度概念与实验

在所有的模型优化问题中,最基础的也是最核心的问题,就是关于模型拟合程度的探讨与优化。根据此前的讨论,模型如果能很好的捕捉总体规律,就能够有较好的未知数据的预测效果。但限制模型捕捉总体规律的原因主要有两点:

  • 其一,样本数据能否很好的反应总体规律
    如果样本数据本身无法很好的反应总体规律,那建模的过程就算捕捉到了规律可能也无法适用于未知数据。举个极端的例子,在进行反欺诈检测时,如果要基于并未出现过欺诈案例的历史数据来进行建模,那模型就将面临无规律可捕捉的窘境,当然,确切的说,是无可用规律可捕捉;或者,当扰动项过大时,噪声也将一定程度上掩盖真实规律。
  • 其二,样本数据能反应总体规律,但模型没有捕捉到
    如果说要解决第一种情况需要在数据获取端多下功夫,那么如果数据能反应总体规律而模型效果不佳,则核心原因就在模型本身了。此前介绍过,机器学习模型评估主要依据模型在测试集上的表现,如果测试集效果不好,则我们认为模型还有待提升,但导致模型在测试集上效果不好的原因其实也主要有两点,其一是模型没捕捉到训练集上数据的规律,其二则是模型过分捕捉训练集上的数据规律,导致模型捕获了大量训练集独有的、无法适用于总体的规律(局部规律),而测试集也是从总体中来,这些规律也不适用于测试集。前一种情况我们称模型为欠拟合,后一种情况我们称模型为过拟合,我们可以通过以下例子进行进一步了解:

    np.random.seed(1999)
    #创建数据
    n_dots = 20
    x = np.linspace(0, 1, n_dots)                        #从0到1,等宽排布的20个数
    y = np.sqrt(x)+ 0.2*np.random.rand(n_dots) - 0.1
最后修改:2022 年 03 月 19 日
如果觉得我的文章对你有用,请随意赞赏