《数据科学与分析:Python语言实现》 —3.11 训练和测试

举报
华章计算机 发表于 2020/02/15 21:49:37 2020/02/15
【摘要】 本节书摘来自华章计算机《数据科学与分析:Python语言实现》 一书中第3章,第3.11节,作者是[英]赫苏斯·罗格尔–萨拉查(Jesús Rogel-Salazar),白 皓 刘江一 上官明乔 刁 娟 译。

3.11 训练和测试

我们用于深入了解业务或研究问题的模型需要数据。以数据为资源,我们需要注意它的使用方式、时间和地点。假设我们的任务是运行上一节中提及的iris数据集的分类模型,可以考虑基于所提供的4个特征值,使用全部的150条记录来建立我们的模型。

根据所使用的4种测量(特征),建模结果可以对任何新鸢尾花进行分类。但是,如何知道我们的模型表现得有多好(或多么糟糕)?我们必须等到在模型训练阶段没有得到的新数据出现。这可能是一个问题,因为我们身边不一定有Mark Watney(火星植物学家)或任何其他(虚构的或真实的)植物学家来获得新的鸢尾花标本,无论它们是生长在地球、火星还是其他地方。

更重要的是,我们必须记住,建立一个模型,是因为我们希望能有效地使用它。这意味着我们应该关注其对于新的、之前未见的数据进行处理的性能,因此评估这种情况的标准是错误率。如果我们使用整个数据集来训练模型,则无法确定训练误差,更不用说该模型将被构建为仅考虑训练数据并因此可能过度拟合,即它不会推广到新的数据实例。

解决此问题的一种方法是从原始数据集中准备两个独立的数据集:

训练集:这是模型将看到的数据,用于确定模型的参数。

测试集:也称“保留集”,我们可以将其视为新数据。该模型尚未遇到它,它将使我们能够测量使用训练集构建的模型的性能。

在某些情况下,不是将数据分成两组,而是分为三组。第三组称为验证集,用于调整模型(有时用于验证模型)。这三个部分都需要代表将与模型一起使用的数据。重要的是要澄清测试数据不得用于训练模型,并且验证集不得用于测试。

我们可以在图3.4中看到这种情况的示意图。请注意,在建模中使用的训练集为我们提供了训练误差的度量。反过来,当应用测试数据集时,我们可以测量模型的执行情况,即获得了泛化误差的度量。最后,当使用新数据时,我们获得所谓的样本外误差的度量。

从对维度的诅咒的讨论中,我们得知用于建模的数据实例越多越好。另一方面,得到的测试数据越多,误差估计就越准确。将数据集拆分为训练集和测试集的常用方式是80%/20%,通常将1/10~1/3的数据用于测试。其他组合也是可能的,例如70%/30%。

 

图3.4 数据集分为训练集和测试集(训练集用于建模阶段,测试集用于验证模型)

如果直接拆分为无法代表数据的数据集,例如在数据中的特定类未在训练集中表示的情况下,可以考虑使用分层方法。分层旨在分割数据集,以便在测试集和训练集中表示每个类。

拆分数据可以通过将集合划分为两个(或三个)部分而不改变数据的顺序来完成。但是,如果定好了数据集,这种朴素的程序可能会导致训练集和测试集的不平衡。更好的方法是随机选择每个数据集的数据实例。因此,无论数据的顺序如何,都可以将随机化作为工作流程的一部分进行。

Scikit-learn能够使用model_selection模块及其train_test_split函数按照以下语法协助将数据集拆分为随机序列和测试子集:

 

其中*arrays是要拆分的数据集,test_size接受0~1之间的值,表示要包含在测试集中的数据集的比例,train_size可以省略,如果省略,其值会自动设置并填充。最后,random_state初始化随机数生成器以进行采样。

我们可以看到这如何应用于iris数据集。我们希望将这些特征存储在名为X_train和X_test的数组中,将对应的目标存储在Y_train和Y_test中。我们希望持有20%的数据用于测试。

下面让我们用Scikit-learn分割iris数据集。

 

可以检查新创建的集合的大小:

 

然后,将使用训练数据集X_train和Y_train完成建模任务。我们可以通过测量测试数据集X_test和Y_test的误差来评估模型的工作情况。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。