在自动化机器学习试验中配置训练、验证、交叉验证和测试数据
在本文中,你将了解用于为自动化机器学习(自动化 ML)试验配置训练数据和验证数据拆分以及交叉验证设置的各种选项。
在 Azure 机器学习中,当使用自动化 ML 来生成多个 ML 模型时,每个子运行都需要通过计算该模型的质量指标(例如准确度或加权 AUC)来验证相关的模型。 这些指标的计算方法是将每个模型所做的预测与验证数据中过去观察到的实际标签进行比较。 详细了解如何根据验证类型来计算指标。
自动化 ML 试验会自动执行模型验证。 下面的各个部分介绍了如何使用 Azure 机器学习 Python SDK 进一步自定义验证设置。
对于低代码或无代码体验,请参阅在 Azure 机器学习工作室中创建自动化机器学习试验。
先决条件
在本文中,你需要:
Azure 机器学习工作区。 若要创建工作区,请参阅创建工作区资源。
熟悉如何使用 Azure 机器学习 SDK 设置自动化机器学习试验。 按照教程或操作方法操作,了解基本的自动化机器学习试验设计模式。
了解训练/验证数据拆分和交叉验证等机器学习概念。 有关概要说明,请参阅:
重要
本文中的 Python 命令需要最新的 azureml-train-automl
包版本。
- 将最新的
azureml-train-automl
包安装到本地环境。 - 有关最新
azureml-train-automl
包的详细信息,请参阅azureml-train-automl
。
机器学习中的默认数据拆分和交叉验证
使用 AutoMLConfig 对象定义试验和训练设置。 请注意,在下面的代码片段中,只定义了必需的参数,也就是说,未包括 n_cross_validations
或 validation_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_data
或 n_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_data
和 label_column_name
参数。 只能设置一个验证参数,即只能指定 validation_data
或 n_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_size
和 n_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_names
与 training_data
和 label_column_name
一起使用,请升级到 Azure 机器学习 Python SDK 1.6.0 或更高版本。 对于以前的 SDK 版本,请参阅 cv_splits_indices
使用方面的内容,但请注意,它仅可与 X
和 y
数据集输入一起使用。
机器学习中用于交叉验证的指标计算
当使用 k 折或 Monte Carlo 交叉验证时,将针对每个验证折计算指标,然后对其进行聚合。 聚合操作是计算标量指标的平均值和图表的总和。 交叉验证期间计算得出的指标基于所有折,因此基于训练集中的所有示例。 详细了解自动化机器学习中的指标。
当使用自定义验证集或自动选择的验证集时,只会基于该验证集计算模型评估指标,不会基于训练数据进行计算。
提供测试数据(预览)
重要
此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
还可以提供测试数据来评估自动化 ML 在试验完成后为你生成的推荐模型。 如果提供测试数据,则会将其视为独立于训练和验证,这样就不会对推荐模型的测试运行结果产生偏差。 详细了解自动化 ML 中的训练、验证和测试数据。
警告
此功能不可用于以下自动化 ML 方案
测试数据集必须采用 Azure 机器学习 TabularDataset 的形式。 可以在 AutoMLConfig
对象中使用 test_data
和 test_size
参数指定测试数据集。 这些参数是互斥的,不能同时指定或者与 cv_split_column_names
或 cv_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_data
或 test_size
参数传递到 AutoMLConfig
中,会在试验完成后自动触发远程测试运行。 此测试运行使用提供的测试数据来评估自动化 ML 推荐的最佳模型。 详细了解如何从测试运行中获取预测。