项目展示

  • 首页Our Projects在 Amazon SageMaker 自动模型调优中使用预选算法实现自定义 AutoML 作业 机器

在 Amazon SageMaker 自动模型调优中使用预选算法实现自定义 AutoML 作业 机器

2026-01-27 13:30:38 23

在亚马逊SageMaker中实现自定义AutoML作业

关键要点

本文介绍如何在亚马逊SageMaker中使用预选算法创建自定义AutoML工作流。通过分析数据,可以快速获取模型开发的相应信息,以缩短模型开发、训练和部署的时间。结合模型调优HPO和特定数据预处理技术,提升模型的性能。

在机器学习项目生命周期的初期,AutoML能迅速从数据中获得整体见解。前期了解哪些预处理技术和算法类型能够提供最佳结果,有效降低开发、训练以及部署合适模型所需的时间。AutoML在每个模型开发过程中都至关重要,并让数据科学家能够专注于最有前景的机器学习技术。此外,AutoML为数据科学团队提供了基准模型性能,可以作为参考点。

AutoML工具通过将不同的算法和各种预处理技术应用于数据,提供多种解决方案。例如,它可以对数据进行缩放、执行单变量特征选择、在不同方差阈值下进行主成分分析PCA,并应用聚类。这些预处理技术可以单独应用,也可以组合在一个管道中。随后,AutoML工具将训练不同模型类型如线性回归、ElasticNet或随机森林,在您的预处理数据集的不同版本上执行超参数优化HPO。亚马逊SageMaker Autopilot简化了构建机器学习模型的复杂过程。一旦提供数据集,SageMaker Autopilot会自动探索不同解决方案以找到最佳模型。但如果您想部署个性化的AutoML工作流,该如何实现呢?

本文将演示如何使用亚马逊SageMaker自动模型调优创建定制的AutoML工作流,并提供示例代码,具体可见GitHub仓库。

解决方案概述

假设您是一支数据科学团队的一员,负责开发特定领域的模型。您已经开发了一套自定义预处理技术,并选择了一些通常能够很好地解决您的机器学习问题的算法。在处理新的机器学习用例时,您希望首先使用这些预处理技术和算法进行AutoML运行,以缩小潜在解决方案的范围。

在本示例中,我们不使用特定数据集,而是利用从亚马逊简单存储服务Amazon S3导入的加州住房数据集。重点是展示如何使用SageMaker HPO技术来实现解决方案,这一技术随时可以应用于任何数据集和领域。

以下图展示了整体解决方案的工作流程。

前提条件

完成本文中的演练需满足以下前提条件:

一个 AWS账户熟悉SageMaker概念,例如Estimator、训练作业和HPO作业了解亚马逊SageMaker Python SDK具备Python编程知识

实现解决方案

完整代码可在GitHub仓库中获取。

实现解决方案的步骤如下如工作流图所示:

创建一个笔记本实例并指定以下内容:对于笔记本实例类型 选择mlt3medium。对于弹性推理 选择无。对于平台标识符 选择Amazon Linux 2 Jupyter Lab 3。对于IAM角色 选择默认的 AmazonSageMakerExecutionRole。如果不存在,请创建一个新的Amazon身份与访问管理IAM角色,并附加AmazonSageMakerFullAccess IAM策略。

请注意,您应在生产环境中创建一个最小权限的执行角色和策略。

打开您的笔记本实例的JupyterLab界面并克隆GitHub仓库。

您可以通过启动新的终端会话并运行 git clone ltREPOgt 命令或通过使用UI功能进行克隆,如下图所示。

打开automlipynb笔记本文件,选择condapython3内核,并按照说明触发一系列HPO作业。

若要不更改代码运行,您需要提高mlm5large训练作业用法和所有训练作业的实例数量的服务配额。AWS默认只允许20个并行SageMaker训练作业。您需要请求配额增加到30。两个配额更改通常在几分钟内获得批准。有关更多信息,请参见请求配额增加。

如果您不想更改配额,可以简单调整脚本中的 MAXPARALLELJOBS变量值例如,设置为5。

每个HPO作业将完成一组训练作业实验,并指出具有最佳超参数的模型。分析结果并部署性能最佳的模型。

该解决方案将在您的AWS账户中产生费用。该解决方案的费用取决于HPO训练作业的数量和持续时间。随着这些参数的增加,费用也会增加。您可以通过限制训练时间和根据本文后面讨论的说明配置TuningJobCompletionCriteriaConfig来减少费用。有关定价信息,请参考亚马逊SageMaker定价。

在接下来的部分中,我们将更详细地讨论笔记本内容并提供代码示例,以及分析结果和选择最佳模型的步骤。

初始设置

让我们先运行customautomlipynb笔记本中的导入与设置部分。它安装并导入所需的所有依赖项,实例化SageMaker会话和客户端,并设置存储数据的默认区域和S3桶。

数据准备

下载加州住房数据集并通过运行笔记本的下载数据部分进行准备。数据集被划分成训练和测试数据框,并上传到SageMaker会话的默认S3桶中。

整个数据集共有20640条记录,9列数据包括目标。目标是预测房屋的中位数值medianHouseValue列。以下是数据集前几行的快照。

训练脚本模板

本文中的AutoML工作流基于scikitlearn的预处理管道和算法。目标是生成大量不同的预处理管道与算法组合,以找到最佳性能设置。让我们从创建一个通用的训练脚本开始,该脚本将保留在笔记本实例中。在此脚本中,有两个空的注释块:一个用于注入超参数,另一个用于预处理模型管道对象。动态注入它们的目的是使实现保持简洁DRY,不重复自己。

python

create base script

script = import argparseimport joblibimport osimport numpy as npimport pandas as pdfrom sklearnmetrics import meansquarederrorfrom sklearnpipeline import Pipeline FeatureUnionfrom sklearnpreprocessing import StandardScalerfrom sklearndecomposition import PCAfrom sklearnimpute import SimpleImputerfrom sklearncluster import KMeansfrom sklearnlinearmodel import ElasticNetfrom sklearnensemble import RandomForestRegressorfrom sklearnensemble import GradientBoostingRegressor

Inference functions

def modelfn(modeldir) clf = joblibload(ospathjoin(modeldir modeljoblib)) return clfif name == main print(Extracting arguments) parser = argparseArgumentParser() # Hyperparameters ##### WILL BE INSERTED DYNAMICALLY ##### {} ############################ # Data model and output directories parseraddargument(modeldir type=str default=osenvironget(SMMODELDIR)) parseraddargument(train type=str default=osenvironget(SMCHANNELTRAIN)) parseraddargument(test type=str default=osenvironget(SMCHANNELTEST)) parseraddargument(trainfile type=str default=trainparquet) parseraddargument(testfile type=str default=testparquet) parseraddargument(features type=str) parseraddargument(target type=str) args = parserparseknownargs() # Load and prepare data traindf = pdreadparquet(ospathjoin(argstrain argstrainfile)) testdf = pdreadparquet(ospathjoin(argstest argstestfile)) Xtrain = traindf[argsfeaturessplit()] Xtest = testdf[argsfeaturessplit()] ytrain = traindf[argstarget] ytest = testdf[argstarget] # Train model ##### WILL BE INSERTED DYNAMICALLY ##### {} {} ############################ pipeline = Pipeline([(preprocessor preprocessor) (model model)]) pipelinefit(Xtrain ytrain) # Validate model and print metrics rmse = meansquarederror(ytest pipelinepredict(Xtest) squared=False) print(RMSE str(rmse)) # Persist model path = ospathjoin(argsmodeldir modeljoblib) joblibdump(pipeline path)

write script to file just to have it in hand

with open(scriptdraftpy w) as f print(script file=f)

创建预处理和模型组合

preprocessors字典包含对所有输入特征应用的预处理技术的规范。每个食谱都使用 scikitlearn 的 Pipeline 或 FeatureUnion 对象定义,该对象将单个数据转换链在一起并叠加。例如,meanimpscale 是一种简单的食谱,它确保对缺失值使用相应列的均值进行插补,并且所有特征都使用StandardScaler进行缩放。相对而言,meanimpscalepca 记录则链式连接多种操作:

用均值插补列中的缺失值。应用使用均值和标准差的特征缩放。在给定的方差阈值上计算PCA,并将其与插补和缩放后的输入特征合并。

在这篇文章中,所有输入特征均为数值型。如果您的输入数据集中有更多数据类型,则应指定更复杂的管道,用于不同特征类型集的不同预处理分支。

pythonpreprocessors = { meanimpscale preprocessor = Pipeline([(imputer SimpleImputer(strategy=mean)) (scaler StandardScaler())])n

meanimpscaleknn preprocessor = FeatureUnion([(basefeatures Pipeline([(imputer SimpleImputer(strategy=mean)) (scaler StandardScaler())])) (knn Pipeline([(imputer SimpleImputer(strategy=mean)) (scaler StandardScaler()) (knn KMeans(nclusters=10))]))])nmeanimpscalepca preprocessor = FeatureUnion([(basefeatures Pipeline([(imputer SimpleImputer(strategy=mean)) (scaler StandardScaler())])) (pca Pipeline([(imputer SimpleImputer(strategy=mean)) (scaler StandardScaler()) (pca PCA(ncomponents=09))]))])n

}

models字典包含您将数据集拟合到的不同算法的规范。每个模型类型具有如下的规范:

scriptoutput:指向估算器使用的训练脚本的位置。该字段在模型字典与预处理字典结合时动态填充。insertions:定义将插入到scriptdraftpy中的代码,并随后保存在scriptoutput中。关键“preprocessor”故意留空,因为该位置将填入不同的预处理器,以创建多个模型预处理器组合。hyperparameters:HPO作业优化的一组超参数。includeclsmetadata:SageMaker Tuner类所需的更多配置详细信息。

models字典的完整示例在GitHub仓库中提供。

pythonmodels = { rf { scriptoutput None insertions { # Arguments arguments parseraddargument(nestimators type=int default=100)n parseraddargument(maxdepth type=int default=None)n parseraddargument(minsamplesleaf type=int default=1)n parseraddargument(minsamplessplit type=int default=2)n parseraddargument(maxfeatures type=str default=auto)n # Model call preprocessor None modelcall model = RandomForestRegressor(nestimators=argsnestimators maxdepth=argsmaxdepth minsamplesleaf=argsminsamplesleaf minsamplessplit=argsminsamplessplit maxfeatures=argsmaxfeatures)n } hyperparameters { nestimators IntegerParameter(100 2000 Linear) maxdepth IntegerParameter(1 100 Logarithmic) minsamplesleaf IntegerParameter(1 6 Linear) minsamplessplit IntegerParameter(2 20 Linear) maxfeatures CategoricalParameter([auto sqrt log2]) } includeclsmetadata False }}

一元机场手机

在 Amazon SageMaker 自动模型调优中使用预选算法实现自定义 AutoML 作业 机器

接下来,让我们迭代preprocessors和models字典并创建所有可能的组合。例如,如果您的preprocessors字典包含10个食谱,您在models字典中有5个模型定义,生成的pipelines字典将包含50个预处理模型管道,这些管道将在HPO期间进行评估。请注意,此时尚未创建单个管道脚本。下面的代码块笔记本的第9个单元格迭代所有预处理模型对象,并插入所有相关代码片段,随后在笔记本中本地保存特定于管道版本的脚本。这些脚本将在下一步中创建单个估算器,以便插入到HPO作业中。

pythonpipelines = {}for modelname modelspec in modelsitems() pipelines[modelname] = {} for preprocessorname preprocessorspec in preprocessorsitems() pipelinename = f{modelname}{preprocessorname} pipelines[modelname][pipelinename] = {} pipelines[modelname][pipelinename][insertions] = {} pipelines[modelname][pipelinename][insertions][preprocessor] = preprocessorspec pipelines[modelname][pipelinename][hyperparameters] = modelspec[hyperparameters] pipelines[modelname][pipelinename][includeclsmetadata] = modelspec[includeclsmetadata] pipelines[modelname][pipelinename][insertions][arguments] = modelspec[insertions][arguments] pipelines[modelname][pipelinename][insertions][modelcall] = modelspec[insertions][modelcall] pipelines[modelname][pipelinename][scriptoutput] = fscripts/{modelname}/script{pipelinename}py

定义估算器

您现在可以创建用于HPO作业的SageMaker估算器,首先创建一个封装类来定义所有估算器的一些共同属性。它继承

订阅我们的时事通讯

获取更多更新