

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 拆分和数据泄露
<a name="splits-leakage"></a>

当您的模型在推理期间（模型投入生产并收到预测请求的那一刻）获得它不应该访问的数据时，就会发生数据泄露，例如用于训练的数据样本，或者在生产中部署模型时不可用的信息。

如果您的模型无意中在训练数据上进行了测试，则数据泄露可能会导致过度拟合。过度拟合意味着您的模型无法很好地推广到看不见的数据。本节提供了避免数据泄露和过度拟合的最佳实践。

## 将您的数据分成至少三组
<a name="splits"></a>

数据泄露的一个常见来源是在训练期间不正确地划分（拆分）数据。例如，数据科学家可能有意或无意地根据用于测试的数据对模型进行了训练。在这种情况下，您可能会观察到由过度拟合导致的成功指标非常高。要解决这个问题，你应该将数据分成至少三组：`training``validation`、和`testing`。

通过以这种方式拆分数据，您可以使用`validation`集合来选择和调整用于控制学习过程的参数（*超参数*）。当您达到预期的结果或达到改善的稳定状态时，请对`testing`现场进行评估。该`testing`集合的性能指标应与其他集合的指标相似。这表明集合之间没有分布不匹配，并且您的模型有望在生产中很好地进行概化。

## 使用分层拆分算法
<a name="stratified-algorithm"></a>

当您将数据拆分为`training``validation`、和`testing`对于小型数据集，或者处理高度不平衡的数据时，请务必使用分层拆分算法。分层可确保每个拆分包含的类别数量或分布大致相同。[scikit-learn 机器学习库](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html)[已经实现了分层，Apache Spark 也是如此。](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrame.sampleBy.html)

对于样本量，请确保验证集和测试集有足够的评估数据，这样您就可以得出具有统计学意义的结论。例如，相对较小的数据集（少于 100 万个样本）的常见拆分大小为 70%、15% 和 15%，对于`training``validation`、和`testing`。对于非常大的数据集（超过 100 万个样本），您可以使用 90%、5% 和 5% 来最大限度地利用可用的训练数据。

在某些用例中，将数据拆分为其他集合很有用，因为在收集生产数据期间，生产数据的分布可能发生了剧烈的突然变化。例如，考虑使用数据收集流程来构建杂货店商品的需求预测模型。如果数据科学团队在2019年收集`training`数据，收集2020年1月至2020年3月`testing`的数据，那么模型可能会在现场得分不错。`testing`但是，当该模型在生产中部署时，由于 COVID-19 疫情，某些物品的消费模式已经发生了重大变化，并且该模型将产生糟糕的结果。在这种情况下，添加另一组（例如`recent_testing`）作为模型批准的额外保障措施是有意义的。此添加可能会使您无法批准因分布不匹配而立即表现不佳的模型投入生产。

在某些情况下，您可能需要创建包含特定类型样本的额外`validation`或`testing`集合，例如与少数族裔群体相关的数据。这些数据样本对于正确处理很重要，但在整个数据集中可能无法很好地呈现。这些数据子集称为*切片*。

以用于信用分析的机器学习模型为例，该模型是根据整个国家的数据进行训练的，并且经过平衡以均衡地考虑目标变量的整个域。此外，请考虑此模型可能具有`City`特征。如果使用这种模式的银行将其业务扩展到特定城市，它可能会对该模型在该地区的表现感兴趣。因此，批准渠道不仅应根据整个国家的测试数据评估模型的质量，还应评估给定城市的测试数据。

当数据科学家研究新模型时，他们可以通过在模型的验证阶段整合代表性不足的切片来轻松评估模型的能力并考虑边缘情况。

## 进行随机拆分时要考虑重复的样本
<a name="duplicates"></a>

另一个不太常见的泄漏源是可能包含过多重复样本的数据集。在这种情况下，即使将数据拆分为子集，不同的子集也可能有共同的样本。根据重复项的数量，过度拟合可能会被误认为是泛化。

## 考虑在生产环境中接收推论时可能不可用的功能
<a name="availability"></a>

当模型使用生产中不可用的功能进行训练时，在调用推论的那一刻，也会发生数据泄露。由于模型通常基于历史数据构建，因此可能会使用在某个时间点不存在的其他列或值来丰富这些数据。以信用审批模式为例，该模型具有跟踪客户在过去六个月中向银行发放了多少贷款的功能。如果部署此模型并用于银行没有六个月历史记录的新客户的信贷审批，则存在数据泄露的风险。

[Amazon SageMaker AI Feature Store](https://aws.amazon.com/sagemaker/feature-store/) 可以帮助解决这个问题。您可以使用时空旅行查询来更准确地测试模型，这些查询可用于查看特定时间点的数据。