在自动化机器学习试验中配置训练、验证、交叉验证和测试数据

适用于:Python SDK azureml v1

本文介绍了用于为自动化机器学习(自动化 ML)试验配置训练数据和验证数据拆分以及交叉验证设置的各种选项。 在 Azure 机器学习中,当使用自动化 ML 来生成多个机器学习模型时,每个子运行都需要通过计算该模型的质量指标(例如准确度或加权曲线下面积 (AUC))来验证相关的模型。 这些指标的计算方法是将每个模型所做的预测与验证数据中过去观察到的实际标签进行比较。 自动化 ML 试验会自动执行模型验证。

下面的各个部分介绍了如何使用 Azure 机器学习 Python SDK 自定义验证设置。 若要详细了解如何基于验证类型计算指标,请参阅设置用于交叉验证的指标计算部分。 如果对低代码或无代码体验感兴趣,请参阅在 Azure 机器学习工作室中创建自动化 ML 试验

先决条件

重要

本文中的 Python 命令需要最新的 azureml-train-automl 包版本。

在机器学习中设置默认数据拆分和交叉验证

若要在机器学习中设置默认数据拆分和交叉验证,请使用 AutoMLConfig 类对象来定义试验和训练设置。 以下示例仅定义所需的参数。 不包括 n_cross_validationsvalidation_data 参数。

注意

预测方案不支持默认的数据拆分和交叉验证。

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/creditcard.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = dataset,
                             label_column_name = 'Class'
                            )

如果未显式指定 validation_datan_cross_validations 参数,自动化 ML 会根据单个数据集 training_data 中提供的行数应用默认技术。

训练数据大小 验证技术
大于 20,000 行 将应用训练/验证数据拆分。 默认行为是将初始训练数据集的 10% 用作验证集。 然后,该验证集将用于指标计算。
小于 20,000 行 将应用交叉验证方法。 默认折数取决于行数。
- 如果数据集小于 1,000 行,则使用 10 折。
- 如果行数在 1,000 到 20,000 之间,则使用 3 折。

提供验证数据集

有两个选项可用于提供验证数据。 你可以从单个数据文件开始,将其拆分为训练数据集和验证数据集,也可以为验证集提供单独的数据文件。 无论采用哪种方式,AutoMLConfig 对象中的 validation_data 参数都将分配要用作验证集的数据。 此参数仅接受 Azure 机器学习数据集 或 pandas 数据帧格式的数据集。

下面是使用验证参数的其他一些注意事项:

  • 只能设置一个验证参数,要么是 validation_data 参数,要么是 n_cross_validations 参数,而不能同时设置两个参数。
  • 使用 validation_data 参数时,还必须指定 training_datalabel_column_name 参数。

下面的示例显式定义了要将 dataset 中的哪部分用于训练 (training_data) 和验证 (validation_data):

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/creditcard.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

training_data, validation_data = dataset.random_split(percentage=0.8, seed=1)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = training_data,
                             validation_data = validation_data,
                             label_column_name = 'Class'
                            )

提供验证数据集大小

提供验证集大小时,只需为试验提供单个数据集。 未指定 validation_data 参数,提供的数据集将分配给 training_data 参数。

AutoMLConfig 对象中,你可以设置 validation_size 参数来保存一部分用于验证的训练数据。 对于此策略,自动化 ML 作业将从提供的初始 training_data 拆分验证集。 值的范围应为 0.0 到 1.0(不含,例如,0.2 表示保留 20% 的数据用作验证数据)。

注意

预测方案不支持 validation_size 参数。

以下示例为试验提供单个 datasettraining_data 访问完整数据集,并分配 20% 的数据集用于验证 (validation_size = 0.2):

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/creditcard.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = dataset,
                             validation_size = 0.2,
                             label_column_name = 'Class'
                            )

执行 K-折交叉验证

若要执行 k-折交叉验证,请包括 n_cross_validations 参数并定义折数。 此参数基于相同的折数设置要执行的交叉验证次数。

注意

使用深度神经网络 (DNN) 的分类方案不支持 n_cross_validations 参数。

对于预测方案,请参阅设置 AutoML 以训练时序预测模型,了解如何应用交叉验证。

下面的示例定义了一种 5 折交叉验证。 该过程运行五种不同的训练,其中每种训练会用到 4/5 的数据。 每次验证时使用 1/5 的数据,每次都会使用不同的维持数据折。 因此,将使用五个验证指标的平均值来计算指标。

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/creditcard.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = dataset,
                             n_cross_validations = 5
                             label_column_name = 'Class'
                            )

执行 Monte Carlo 交叉验证

若要执行 Monte Carlo 交叉验证,请在 AutoMLConfig 对象中同时包含 validation_sizen_cross_validations 参数。

对于蒙特卡洛交叉验证,AutoML 会将 validation_size 参数指定的训练数据部分留出进行验证,然后将其余数据分配给训练。 然后,根据 n_cross_validations 参数中指定的值重复此过程,每次都随机生成新的训练和验证拆分。

注意

预测方案不支持 Monte Carlo 交叉验证。

下面的示例定义了一种 7 折交叉验证,其中会留出 20% 的训练数据进行验证。 该过程运行七种不同的训练,其中每种训练会用到 80% 的数据。 每次验证时使用 20% 的数据,每次都会使用不同的维持数据折。

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/creditcard.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = dataset,
                             n_cross_validations = 7
                             validation_size = 0.2,
                             label_column_name = 'Class'
                            )

指定自定义交叉验证数据折数

你还可以提供自己的交叉验证 (CV) 数据折数。 此方法被视为更高级的方案,因为你需要指定要将哪些列拆分出来用于验证。 请在训练数据中包括自定义 CV 拆分列,并通过在 cv_split_column_names 参数中填充列名来指定列。 每列表示一个交叉验证拆分,列中的值只能是整数 1 或 0。 值为 1 表示对应的行应用于训练。 值为 0 表示对应的行应用于验证。

注意

预测方案不支持 cv_split_column_names 参数。

下面的示例包含具有两个 CV 拆分列(“cv1”和“cv2”)的银行营销数据:

data = "https://automlsamplenotebookdata.blob.core.chinacloudapi.cn/automl-sample-notebook-data/bankmarketing_with_cv.csv"

dataset = Dataset.Tabular.from_delimited_files(data)

automl_config = AutoMLConfig(compute_target = aml_remote_compute,
                             task = 'classification',
                             primary_metric = 'AUC_weighted',
                             training_data = dataset,
                             label_column_name = 'y',
                             cv_split_column_names = ['cv1', 'cv2']
                            )

注意

若要将 cv_split_column_namestraining_datalabel_column_name 一起使用,请升级到 Azure 机器学习 Python SDK 1.6.0 或更高版本。 对于以前的 SDK 版本,请参阅 cv_splits_indices 使用方面的内容,但请注意,它仅可与 Xy 数据集输入一起使用。

设置用于交叉验证的指标计算

当使用 k 折或 Monte Carlo 交叉验证时,将针对每个验证折计算指标,然后对其进行聚合。 聚合操作是计算标量指标的平均值和图表的总和。 交叉验证期间计算得出的指标基于所有折,因此基于训练集中的所有示例。 有关详细信息,请参阅评估自动化 ML 试验结果

当使用自定义验证集或自动选择的验证集时,只会基于该验证集计算模型评估指标,不会基于训练数据进行计算。

提供测试数据集(预览)

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。

有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

还可以提供测试数据来评估自动化 ML 在试验完成后为你生成的推荐模型。 如果提供测试数据,则会将数据视为独立于训练和验证,以防止对推荐模型的测试运行结果产生任何偏差影响。 有关详细信息,请参阅训练、验证和测试数据

测试数据集必须采用 Azure 机器学习 TabularDataset 的形式。 可以在 AutoMLConfig 对象中使用 test_datatest_size 参数指定测试数据集。 这些参数是互斥的,不能同时指定或者与 cv_split_column_namescv_splits_indices 参数一起指定。

AutoMLConfig 对象中,使用 test_data 参数指定现有数据集:

automl_config = AutoMLConfig(task='forecasting',
                             ...
                             # Provide an existing test dataset
                             test_data=test_dataset,
                             ...
                             forecasting_parameters=forecasting_parameters)

若要使用训练/测试拆分而不是直接提供测试数据,请在创建 AutoMLConfig 时使用 test_size 参数。 此参数必须是介于 0.0 和 1.0 之间(不含)的浮点值。 它指定要用于测试数据集的训练数据集的百分比。

automl_config = AutoMLConfig(task = 'regression',
                             ...
                             # Specify train/test split
                             training_data=training_data,
                             test_size=0.2)

下面是使用测试数据集的其他一些注意事项:

  • 对于回归任务,使用随机采样。
  • 对于分类任务,使用分层采样,但当分层采样不可行时,则退而使用随机采样。

注意

在预测方案中,目前无法通过结合 test_size 参数使用训练/测试拆分来指定测试数据集。

test_datatest_size 参数传递到 AutoMLConfig 对象中,会在试验完成后自动触发远程测试运行。 此测试运行使用提供的测试数据来评估自动化 ML 推荐的最佳模型。 有关详细信息,请参阅获取测试作业结果