商用机器学习:数据科学实践
上QQ阅读APP看书,第一时间看更新

1.3 验证和测试

利用机器学习进行预测分析或决策支持时,一个非常重要的先决条件是输入的数据是否有代表性,这在很大程度上影响了最终结果的准确度。例如,如果我们用一部分高收入人群的消费行为来预测全国的销售情况,毫无疑问最终的结果将会有很大的偏差。

长期以来,统计学家意识到用样本外数据来验证模型准确性的重要性。我们指的是,测试模型的数据应该不同于模型中用来拟合参数的数据。数据科学家把拟合参数的样本数据称为训练集,将用于测试模型准确性的数据称为测试集(通常也用到验证集,我们将在这一节的后面进行介绍)。

我们将用一个非常简单的例子来展示训练集和测试集的用法。我们用美国某个地区10位从事特定职业的人的年龄来预测这部分人群的收入情况(在真实的机器学习实践中,数据量级远超于此)。表1-1给出了训练数据集,图1-1为表1-1中数据的散点分布图。

表1-1 训练数据集:某地区从事某一特定职业的10个随机抽样工资数据

图1-1 表1-1中数据的散点分布图

选择一个能拟合各项数据的模型非常重要。经过一些试验,我们可以选择一个五次多项式建立这个模型:

在式(1-1)中,Y代表工资收入,X代表年龄。图1-2展示了数据拟合五次多项式的结果(关于完整的数据分析结果,请参考www-2.rotman.utoronto.ca/~hull)。

从图1-2中可见,模型对数据进行了很好的拟合,训练集中10个样本的模型估算工资水平与真实工资水平之间的标准偏差即均方根误差(root mean square error,RMSE)为12 902美元。然而,为了避免模型的过度拟合(over-fit)情况(这是因为图1-2看起来很不现实,它随着年龄的增大一会儿下降,一会儿上升,接着又下降、又上升),我们需要用样本外数据对其结果进行测试。用数据科学的语言来表达就是,我们需要确定模型是否很好地泛化到与表1-1不同的新数据上。

图1-2 表1-1和图1-1中数据拟合的五次多项式结果(具体结果请参考Excel文件:Salary vs.Age)

假设我们的测试数据集包括新增的10个样本的工资收入数据(见表1-2),该数据的散点分布图如图1-3所示。当我们用图1-2中拟合的模型时,所得出的结果中均方根误差为38 794美元,较之前我们使用表1-1中的训练数据集进行拟合得出的12 902美元有明显升高。该结果证明,图1-2中的模型存在过度拟合现象,即模型拟合结果不具有通用性。

表1-2 测试数据集:新一组的工资收入样本数据

图1-3 表1-2中数据的散点分布图

在这种情况下,常规的调整步骤是寻找一个新的模型。通过对图1-1中的散点分布进行分析,我们调整模型为二次多项式,公式为:

图1-4展示了上述二次多项式模型对图1-1中训练数据集的最佳拟合结果,该拟合结果的均方根误差为32 932美元,拟合效果不及式(1-1)。但是,该二次多项式模型与表1-2中测试数据集的拟合效果有所提升,该二次多项式项模型对测试数据集的拟合均方根误差为33 554美元,只比训练数据集的均方根误差32 932美元高一点。因此,二次多项式模型可以作为更适合的模型,可替换前面用到的五次多项式模型。

在前面的例子中,相比于图1-2而言,图1-4所用到的模型更为简单,并且是更为合适的模型。但我们不能武断地得出越简单的模型就越行之有效这一结论。例如,假设我们选用比二次多项式更简单的模型——线性模型来进行拟合,结果如图1-5所示。我们可以非常直观地看到,模型没有展现出超过50岁的人工资水平将会下降这一趋势,在这次拟合中训练集的均方根误差为49 731美元,其效果远低于二次多项式模型。

图1-4 表1-1和图1-1中数据拟合的二次多项式结果(详细数据请参考Excel文件:Salary vs.Age)

图1-5 线性模型对训练集的拟合结果(详细数据请参考Excel文件:Salary vs.Age)

表1-3总结了我们之前用到的三个不同模型拟合的均方根误差的结果。其中相较五次多项式模型,线性模型和二次多项式模型的结果都比较理想,但如果从准确性来看,二次多项式模型更佳,五次多项式模型存在过度拟合的情况,而线性模型则存在欠拟合(under-fit)现象。

表1-3 不同模型拟合的均方根误差(见Excel文件)

如何平衡过度拟合或欠拟合的情况呢?在机器学习中这是一个很重要的问题,我们将在本书后续章节中详细讨论。我们将看到,一些机器学习的算法中包含了大量的参数,所以即使我们拥有足够大的训练集,过度拟合的情况仍会出现。基于我们之前列举的简单案例,我们得出经验法则如下:

模型的复杂性应不断增加,直到该模型在样本外测试的表现不佳为止。

在前面列举的工资水平预测案例中,我们使用了两种数据集:第一种为训练集,用以建立模型;第二种为测试集,用以测试模型应用到样本外数据的有效性。如果我们只需要建立一种模型并测试其对预测的有效性,那么使用上述两种数据集即可满足需求。然而,在实际运用中,我们往往需要建立一系列的模型来对比它们的预测效果(在工资预测的例子中,我们也有所涉及)。所以,我们通常会将数据分为以下三组:

·训练集;

·验证集;

·测试集。

训练集一般用于开发备选模型。验证集用于观测模型对于数据的拟合情况,从而选出较好的模型。在选取较好的模型之后,测试集则被用来对所选中模型的精确性进行样本外测试。在常规的做法中:将数据的60%作为训练集,30%作为验证集,10%作为测试集。当然,我们可根据选取模型的类型和数据量进行灵活分配。

最后需要声明一下,在本小节中我们列举的例子并不是真实的机器学习案例,因为样本量太少(利用10个观测值显然并不足以可靠地去研究学习两个变量之间的关系)。我们的目的仅仅是希望通过这个简单的例子向各位读者介绍过度拟合和欠拟合的具体含义。