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

适用于:Python SDK azureml v1

在本文中,你将了解用于为自动化机器学习(自动化 ML)试验配置训练数据和验证数据拆分以及交叉验证设置的各种选项。

在 Azure 机器学习中,当使用自动化 ML 来生成多个 ML 模型时,每个子运行都需要通过计算该模型的质量指标(例如准确度或加权 AUC)来验证相关的模型。 这些指标的计算方法是将每个模型所做的预测与验证数据中过去观察到的实际标签进行比较。 详细了解如何根据验证类型来计算指标

自动化 ML 试验会自动执行模型验证。 下面的各个部分介绍了如何使用 Azure 机器学习 Python SDK 进一步自定义验证设置。

对于低代码或无代码体验,请参阅在 Azure 机器学习工作室中创建自动化机器学习试验

先决条件

在本文中,你需要:

重要

本文中的 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 参数还需要设置 training_datalabel_column_name 参数。 只能设置一个验证参数,即只能指定 validation_datan_cross_validations,而不能同时指定两者。

下面的代码示例显式定义了要将 dataset 中所提供数据的哪部分用于训练和验证。

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 参数来保存一部分用于验证的训练数据。 这意味着,验证集将由 AutoML 从提供的初始 training_data 中拆分出来。 此值的范围应为 0.0 到 1.0(不含,例如,0.2 表示保留 20% 的数据用作验证数据)。

注意

预测方案不支持 validation_size 参数。

请参阅以下代码示例:

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 参数并将其设置为某个值。 此参数基于相同的折数设置要执行的交叉验证次数。

注意

使用深度神经网络的分类方案不支持 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'
                            )

蒙特卡洛交叉验证

若要执行蒙特卡洛交叉验证,请在 AutoMLConfig 对象中同时包含 validation_sizen_cross_validations 参数。

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

注意

预测方案不支持蒙特卡洛交叉验证。

下面的代码定义了 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 交叉验证时,将针对每个验证折计算指标,然后对其进行聚合。 聚合操作是计算标量指标的平均值和图表的总和。 交叉验证期间计算得出的指标基于所有折,因此基于训练集中的所有示例。 详细了解自动化机器学习中的指标

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

提供测试数据(预览)

重要

此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

还可以提供测试数据来评估自动化 ML 在试验完成后为你生成的推荐模型。 如果提供测试数据,则会将其视为独立于训练和验证,这样就不会对推荐模型的测试运行结果产生偏差。 详细了解自动化 ML 中的训练、验证和测试数据。

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

使用 test_data 参数指定要传递到 AutoMLConfig 对象的现有数据集。

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 推荐的最佳模型。 详细了解如何从测试运行中获取预测

后续步骤