# 保留数据和交叉验证

预测分析中最大的挑战之一是了解一个经过训练的模型将如何处理它从未见过的数据。换言之，模型学习真实模式的程度与简单记忆训练数据的程度。保持和交叉验证是有效的技术，可以确保您的模型不仅仅是记忆，而是学习通用模式。

在配置实验时，您可以选择是随机分割训练数据和保留数据，还是使用用于创建时间感知模型的特殊方法。

## 记忆与概括测试模型

问一个模型在现实世界中的表现如何，相当于问这个模型是记忆还是概括。记忆是完美地记住过去发生的事情的能力。虽然一个记忆的模型在最初训练时可能得分很高，但当应用于新数据时，预测精度会显著下降。相反，我们需要一个概括的模型。概括是学习和应用通用模式的能力。通过从训练数据中学习真正的更广泛的模式，广义模型将能够对新数据做出以前从未见过的同样质量的预测。

## 自动保持

保留数据是在训练时在模型中“隐藏”的数据，然后用于对模型进行评分。通过对未在训练中使用的数据生成准确度度量，该保持模拟了模型将如何对未来预测执行。就好像我们建立了一个模型，部署了它，并根据实际发生的情况监控它的预测，而不必等待以观察这些预测。

在 Qlik Predict 中，有两种选择保留数据的方法：默认方法和基于时间的方法。

### 选择保留数据的默认方法

除非您启用时间感知模型训练，否则在模型训练开始之前，会随机选择延迟数据。

默认情况下，数据集随机分为训练数据和保留数据

默认情况下，数据集随机分为训练数据和保留数据

默认情况下，数据集随机分为训练数据和保留数据 ![默认保留和交叉验证方法中训练数据和保留数据的比率](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/AutomatedMachineLearning/holdout-data-default.png)

### 选择保留数据的基于时间的方法

使用基于时间的方法，首先根据您选择的日期索引列对整个训练数据集进行排序。排序后，将保留数据与其余训练数据分离。此保留数据包含与所选索引相关的最新数据。

基于时间的方法用于训练时间感知模型和时间序列模型。有关这些模型选项的详细信息，请参阅[创建时间感知模型](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/time-aware-models.htm)和[使用时间序列实验](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/time-series-experiment.htm)。

在基于时间的方法中，数据集被分为训练数据和保留数据，其比例与默认方法相同。不过，在这种方法中，数据在拆分前还要进行排序。

在基于时间的方法中，数据集被分为训练数据和保留数据，其比例与默认方法相同。不过，在这种方法中，数据在拆分前还要进行排序。

在基于时间的方法中，数据集被分为训练数据和保留数据，其比例与默认方法相同。不过，在这种方法中，数据在拆分前还要进行排序。 ![默认保留和交叉验证方法中训练数据和保留数据的比率。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/AutomatedMachineLearning/holdout-data-time-based.png)

## 交叉验证

交叉验证是一个测试机器学习模型如何预测其尚未看到的数据的未来值的过程。在交叉验证中，模型的训练数据被分成多个段，称为折叠。在训练的每次迭代中，模型都在一个或多个折叠上进行训练，其中至少有一个折叠总是被阻止用于训练。每次迭代后，使用在训练中被阻止使用的折叠之一来评估表现。

交叉验证的结果是一组测试度量，这些度量可以合理预测经过训练的模型能够预测其从未见过的数据的准确程度。

在Qlik Predict 中，有两种交叉验证方法：默认方法和基于时间的方法。

## 默认交叉验证

除非将训练配置为使用基于时间的交叉验证，否则 Qlik Predict 将使用默认的交叉验证方法。交叉验证的默认方法适用于不依赖于时间序列维度的模型，也就是说，您不需要模型在考虑训练数据中特定基于时间的列的情况下进行预测。

在默认的交叉验证方法中，数据集被随机分割成多个偶数段，称为折叠。机器学习算法在除一个折叠之外的所有折叠训练模型。交叉验证然后对照在所有其他折叠上训练的模型测试每个折叠。这意味着每一个训练模型都要在一段它以前从未见过的数据上进行测试。重复该过程，在训练期间隐藏一个不同的折叠，然后进行测试，直到所有折叠都作为测试使用了一次，并在每一次迭代期间进行了训练。

### 自动保留和默认交叉验证

默认情况下，Qlik Predict 在模型训练期间使用五重交叉验证来模拟模型性能。然后，对模型进行单独的训练数据保持测试。这将生成评分度量，让您评估和比较不同算法的性能。

1. 在实验训练开始之前，数据集中具有非空目标的所有数据都会被随机打乱。20% 的数据集被提取为保留数据。数据集的剩余 80% 用于训练具有交叉验证的模型。

2. 为了准备交叉验证，数据集被随机分成五个部分。然后对模型进行五次训练，每次“隐藏”不同的五分之一的数据，以测试模型的性能。训练指标是在交叉验证过程中生成的，是计算值的平均值。

3. 训练后，将该模型应用于保持数据。因为与交叉验证数据不同，模型在训练期间没有看到保留数据，所以它是验证模型训练性能的理想选择。在最终模型评估期间生成搁置度量。

有关用于分析模型性能的度量的更多信息，请参阅[检查模型](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/reviewing-experiments.htm)。

默认方法中，在五重交叉验证期间使用训练数据来生成模型。 训练后，使用保持数据对模型进行评估。

默认方法中，在五重交叉验证期间使用训练数据来生成模型。 训练后，使用保持数据对模型进行评估。

默认方法中，在五重交叉验证期间使用训练数据来生成模型。 训练后，使用保持数据对模型进行评估。 ![显示默认保留和交叉验证方法的图表，突出显示了一个五折叠过程。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/AutomatedMachineLearning/holdout-cross-validation-default.png)

## 基于时间的交叉验证

基于时间的交叉验证适用于训练模型以沿时间序列维度预测数据。例如，给定一个包含过去销售数据的数据集，您想预测公司下个月的销售额。要使用基于时间的交叉验证，训练数据中必须有一列包含日期或时间戳信息。

基于时间的交叉验证用于创建时间感知模型。您可以在实验配置面板的模型优化下激活时间感知训练。有关更多信息，请参阅[配置实验](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/configuring-experiments.htm)。

通过基于时间的交叉验证，模型经过训练，可以更好地理解它们是在预测未来日期的数据。

与默认方法一样，基于时间的交叉验证涉及将训练数据分成用于训练和测试的折叠。在这两种方法中，模型也要经过多次迭代以进行训练。但是，基于时间的方法与默认方法有几个不同之处：

* 训练数据按照您选择的日期索引进行排序和组织。相比之下，默认的交叉验证会随机选择任何给定折叠中要包含的行。

* 用作训练数据的折叠数量随着训练的每次迭代而逐渐增加。这意味着在第一次迭代中，可能只使用第一个（最旧的）折叠，后续迭代逐渐包含更多的训练数据，包括最近的数据。用作测试数据的折叠随着每次迭代而变化。

  这与默认的交叉验证方法形成鲜明对比，该方法在每次迭代中使用固定数量的数据进行训练和测试分割（即四个折叠用于训练，一个折叠用于测试）。

* 因为整个训练数据集都是按照您选择的索引排序，所以用于测试训练模型的数据总是比用于训练模型的资料更新 - 或者说新旧程度相同。用于对模型进行最终性能测试的自动保留数据总是比训练数据集的其他部分更新 - 或者新旧程度相同。

  相比之下，默认的交叉验证可能会导致模型在比训练数据更旧的数据上进行测试，从而导致数据泄漏。

### 自动保留和基于时间的交叉验证

此过程显示了如何训练时间感知模型。与[默认的交叉验证过程](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/holdout-crossvalidation.htm#Default)相比，该过程既有不同之处，也有相似之处。

1. 数据集中的所有数据都按照您选择的日期索引进行排序。这包括训练数据和保留数据。

2. 在实验训练开始之前，20% 的数据集被提取为保留数据。该保留数据是最新的，或者新旧程度与数据集的其他部分一样。数据集的剩余 80% 用于训练具有交叉验证的模型。

3. 为了准备交叉验证，将排序后的训练数据拆分为多个折叠。关于您选择的日期索引，第一个折叠将包含最旧的记录，最后一个折叠将存储最新的记录。

4. 然后，该模型会经过五次迭代以进行训练。在每次迭代中，训练数据量会逐渐增加。随着每次迭代，所包含的训练数据的新鲜度也会增加。训练指标是在交叉验证过程中生成的，是计算值的平均值。

5. 训练后，将该模型应用于保持数据。由于模型在训练过程中没有看到保留数据，因此它非常适合验证模型训练性能。在最终模型评估期间生成搁置度量。

在基于时间的方法中，排序后的训练数据用于生成和测试时间感知模型。 训练后，使用保持数据对模型进行评估。

在基于时间的方法中，排序后的训练数据用于生成和测试时间感知模型。 训练后，使用保持数据对模型进行评估。

在基于时间的方法中，排序后的训练数据用于生成和测试时间感知模型。 训练后，使用保持数据对模型进行评估。 ![显示默认保留和交叉验证方法的图表，突出显示了一个五折叠过程。](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Resources/Images/AutomatedMachineLearning/holdout-cross-validation-time-based.png)

## 用于时间序列模型的留出和交叉验证

时间序列模型是一种执行时间特定预测的特定类型模型。与其他模型相比，这些模型的训练过程有一些异同：

* 与其他模型一样，训练数据集仍分为 80%（训练）和 20%（测试）。使用[基于时间的拆分方法](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/holdout-crossvalidation.htm#TimeBasedSplit)。

  测试集用于评估模型性能。此数据集显示在实验的分析选项卡中，您可以在其中探索模型在其训练窗口之外的泛化能力。

* 五重交叉验证未使用。在训练过程本身中会执行一些验证，因为数据会通过神经网络运行。

有关使用Qlik Predict进行时间序列预测的详细信息，请参阅[使用时间序列实验](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/AutoML/time-series-experiment.htm)。