自动化机器学习中的数据特征化 (AutoML)

适用于:适用于 Python 的 Azure 机器学习 SDK v1

重要

本文提供有关使用 Azure 机器学习 SDK v1 的信息。 SDK v1 自 2025 年 3 月 31 日起弃用。 对它的支持将于 2026 年 6 月 30 日结束。 可以在该日期之前安装和使用 SDK v1。 使用 SDK v1 的现有工作流将在支持结束日期后继续运行。 但是,在产品发生体系结构更改时,可能会面临安全风险或中断性变更。

建议在 2026 年 6 月 30 日之前过渡到 SDK v2。 有关 SDK v2 的详细信息,请参阅 什么是 Azure 机器学习 CLI 和 Python SDK v2? 以及 SDK v2 参考

本文介绍如何为自动化机器学习 (AutoML) 试验自定义 Azure 机器学习中的数据特征化设置。

特征工程和特征化

训练数据由行和列构成。 每一行都是一条观测或记录,而每行的列则是用于描述每条记录的特征。 通常,选择最能描述数据中模式的特征以创建预测模型。

尽管可以直接使用许多原始数据字段来训练模型,但通常需要创建其他(工程)特征,以便更好地区分数据中的模式。 此过程称为 特征工程。 使用数据的域知识创建有助于机器学习算法更好地学习的功能。

在 Azure 机器学习中,应用了数据缩放和规范化技术来简化特征工程。 这些技术和此功能工程在 AutoML 试验中称为 特征化

先决条件

本文假定你已了解如何配置 AutoML 试验。

重要

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

有关配置的信息,请参阅以下文章:

配置特征化

每个 AutoML 试验都会自动对数据应用 自动缩放和规范化技术 。 某些算法对不同规模的特征敏感,这些技术是特征化方法,可以用来帮助这些算法。 可以启用更多的特征化,例如缺失值插补、编码和转换。

注意

AutoML 特征化(如特征规范化、处理缺失数据或将文本转换为数字)的步骤将成为基础模型的一部分。 使用模型进行预测时,将自动向输入数据应用在训练期间应用的相同特征化步骤。

对于使用 Python SDK 配置的试验,可以启用或禁用特征化设置,并进一步指定要用于试验的特征化步骤。 如果使用的是 Azure 机器学习工作室,请参阅启用特征化的步骤

下表列出了 featurizationAutoMLConfig 类 中的已接受设置:

特征化配置 说明
"featurization": 'auto' 指定在预处理过程中自动执行 数据防护特征化步骤 。 此设置为默认设置。
"featurization": 'off' 指明特征化步骤不会自动执行。
"featurization": 'FeaturizationConfig' 指定使用自定义特征化步骤。 若要了解详细信息,请参阅 “自定义特征化”。

自动特征化

下表汇总了系统自动应用于数据的技术。 这些技术适用于使用 SDK 或工作室 UI 配置的试验。 若要禁用此行为,请在 "featurization": 'off' 对象中设置 AutoMLConfig

特征化步骤 说明
删除高基数或是无差异的特征特性 从训练集和验证集中删除这些功能。 适用于所有值都缺失的特征、所有行使用同一值的特征,或者包含高基数(例如哈希、ID 或 GUID)的特征。
插补缺失值* 对于数值特征,用列中值的平均值进行填充。

对于分类特征,使用最频繁的值进行插补。
生成更多特征 对于日期/时间功能:年、月、日、星期、一年中的某一天、季度、一个月的某一周、小时、分钟、秒。

对于预测任务,将创建以下附加的日期/时间特征:ISO 年份、半年、字符串形式的日历月份、周、字符串形式的星期、一个季度中的某一天、一年中的某一天、AM/PM(0 表示 am、1 表示 pm)、字符串形式的 AM/PM、一天中的某一小时(12 小时制)。

对于文本功能:基于单元语法、双元语法和三元语法的字词频率。 若要了解详细信息,请参阅 BERT 集成
转换和编码 将很少有唯一值的数字特征转换为分类特征。

将为低基数分类特征使用 One-hot 编码单热哈希编码 用于高基数分类特征。
单词嵌入 文本特征化器使用预先训练的模型将文本标记的向量转换为句子向量。 每个单词在文档中的嵌入矢量与其余矢量聚合在一起,以生成文档特征矢量。
群集距离 基于所有数字列训练 k-平均聚类模型。 生成 k 个新特征(每个聚类一个新数字特征),这些特征包含每个样本与每个聚类质心之间的距离。

注意

*如果计划将 AutoML 创建的模型导出到 ONNX 模型,则 ONNX 格式仅支持使用星号指示的特征化选项。 若要了解详细信息,请参阅 使用 AutoML ONNX 模型进行预测

在每个 AutoML 试验中,系统会自动缩放或规范化数据,以帮助算法性能良好。 在模型训练期间,系统将以下缩放或规范化技术之一应用于每个模型。

缩放和处理 说明
StandardScaler 通过删除平均值并缩放到单位方差来标准化特征。
MinMaxScaler 通过按该列的最小值和最大值缩放每个特征来转换特征。
MaxAbsScaler 按其最大绝对值缩放每个功能。
RobustScaler 使用分位数范围缩放特征。
PCA 主体组件分析。 使用数据的奇异值分解进行线性降维,以将其投影到低维空间。
TruncatedSVD 此转换器通过截断的奇异值分解 (SVD) 执行线性降维。 与 PCA 相反,在计算奇数值分解之前,此估算器不会将数据居中,这意味着它可以有效地处理 scipy.sparse 矩阵。
Normalizer 至少包含一个非零成分的每个样本(即数据矩阵的每一行)都会被独立重新缩放,使得其范数(l1 或 l2)等于 1,而不受其他样本的影响。

数据控制措施

数据防护有助于 识别数据的潜在问题,例如缺失值或 不平衡的数据。 它们还有助于采取纠正措施,以便获得更好的结果。

通过以下方式应用数据防护:

  • 对于 SDK 试验:在 "featurization": 'auto' 对象中指定 validation=autoAutoMLConfig 参数。
  • 对于实验室实验:启用自动特征化。

可通过以下方式查看试验的数据护栏:

  • 使用 SDK 提交试验时,请设置 show_output=True
  • 访问工作室中 AutoML 运行的“数据护栏”选项卡。

数据护栏状态

数据护栏显示以下三种状态之一:

状态 说明
已通过 未检测到任何数据问题,无需执行任何作。
已完成 已对数据应用更改。 查看 AutoML 采取的纠正措施,以确保更改与预期结果保持一致。
出现警告 检测到数据问题,但无法修复。 修改并解决问题。

支持的数据护栏

下表描述了当前支持的数据护栏,以及你在提交试验时可能会看到的相关状态:

护栏 状态 触发器的条件
填补缺失特征值 通过


完成
在训练数据中未检测到缺失特征值。 若要了解详细信息,请参阅 “配置特征化设置”。

在训练数据中检测到缺失特征值并进行了插补。
高基数特征检测 通过


完成
已对您的输入进行了分析,但未检测到任何高基数特征。

在输入中检测到了高基数特征,并进行了处理。
验证拆分处理 完成 验证配置已设置为 'auto',训练数据的行数少于 20,000。
已使用交叉验证来验证经过训练的模型的每个迭代。 详细了解验证数据

已将验证配置设置为 'auto',并且训练数据包含超过 20,000 行。
输入数据拆分为训练数据集和用于验证模型的验证数据集。
类均衡检测 通过




收到警报



完成
您的输入已经过分析,训练数据中的所有类都是均衡的。 如果每个类在数据集中具有良好的表示形式(按样本的数量和比率度量),则数据集被视为均衡的。

在输入中检测到了不均衡的类别。 若要修复模型偏差,请解决均衡问题。 详细了解不均衡数据

在输入中检测到不均衡类,并且扫描逻辑已确定要应用均衡。
内存问题检测 通过



完成
已分析了选定的值(范围、滞后、滚动窗口),但未检测到潜在的内存不足问题。 详细了解时序预测配置

已分析了选定的值(范围、滞后、滚动窗口),可能会导致你的试验遇到内存不足问题。 滞后或滚动窗口配置已禁用。
频率检测 通过


完成
已分析了时序,所有数据点都与检测到的频率保持一致。

已分析时序,检测到了与已检测到的频率不一致的数据点。 这些数据点已从数据集中删除。
交叉验证 完成 若要准确评估 AutoML 训练的模型,请使用未对模型进行训练的数据集。 如果未提供显式验证数据集,则训练数据集的一部分用于实现此目的。 对于较小的数据集(少于 20,000 个示例),AutoML 使用交叉验证。 对于较大的数据集,AutoML 从训练数据中分割出一个保留集,以用作验证数据集。 对于输入数据,如果训练样本数少于 1,000,则 AutoML 使用 10 折交叉验证,在所有其他情况下使用三折。
训练测试数据拆分 完成 若要准确评估 AutoML 训练的模型,请使用未对模型进行训练的数据集。 如果未提供显式验证数据集,则训练数据集的一部分用于实现此目的。 对于较小的数据集(少于 20,000 个示例),AutoML 使用交叉验证。 对于较大的数据集,AutoML 从训练数据中分割出一个保留集,以用作验证数据集。 因此,输入数据将拆分为训练数据集和留出验证数据集。
时序 ID 检测 通过


固定
已分析数据集,未检测到重复的时间索引。

在数据集中找到多个时序,并自动为数据集创建了时序标识符。
时序聚合 通过


固定
数据集频率与用户指定的频率一致。 未执行聚合。

数据已聚合,以便与用户提供的频率保持一致。
短时序处理 通过


固定
AutoML 检测到输入数据中的每个系列有足够的数据点,以便继续训练。

AutoML 检测到某些系列不包含足够的数据点来训练模型。 若要继续训练,AutoML 会去除或填充这些短序列。

自定义特征化

自定义您的特征化设置,以确保用于训练机器学习模型的数据和特征能够实现相关的预测。

若要自定义特征化,请在 "featurization": FeaturizationConfig 对象中指定 AutoMLConfig。 如果使用 Azure 机器学习工作室进行试验,请参阅 “配置特征化设置”。 若要自定义预测任务类型的特征化,请参阅 “自定义特征化”。

支持的自定义项包括:

自定义 定义
列用途更新 覆盖指定列自动检测的特征类型。
转换器参数更新 更新指定转换器的参数。 当前支持Imputer(均值、最常出现值和中值)和HashOneHotEncoder
删除列* 指定要从特征处理中删除的列。
块体变压器 指定要在特征化过程中使用的块转换器。

注意

从 SDK 版本1.19 开始,“删除列”功能已弃用。 在 AutoML 试验中使用数据集之前,请将数据集中的列删除,这是数据清理过程的一部分。

FeaturizationConfig使用 API 调用创建对象:

featurization_config = FeaturizationConfig()
featurization_config.blocked_transformers = ['LabelEncoder']
featurization_config.drop_columns = ['aspiration', 'stroke']
featurization_config.add_column_purpose('engine-size', 'Numeric')
featurization_config.add_column_purpose('body-style', 'CategoricalHash')
#default strategy mean, add transformer param for 3 columns
featurization_config.add_transformer_params('Imputer', ['engine-size'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['city-mpg'], {"strategy": "median"})
featurization_config.add_transformer_params('Imputer', ['bore'], {"strategy": "most_frequent"})
featurization_config.add_transformer_params('HashOneHotEncoder', [], {"number_of_bits": 3})

特征化透明度

每个 AutoML 模型都会自动应用特征化。 特征化包括自动化特征工程(when "featurization": 'auto'),以及缩放和标准化。 这些步骤会影响所选算法及其超参数值。 AutoML 提供了不同的方法来帮助你查看它应用于模型的特征化。

请考虑此预测示例:

  • 数据集有四个输入特征:A(数字)、B(数字)、C(数字)和 D(DateTime)。
  • 进程删除数值特征 C,因为它是具有所有唯一值的 ID 列。
  • 该过程使用平均值将数值特征 A 和 B 中的缺失值进行插补。
  • 该过程将 DateTime 功能 D 特征化为 11 个不同的工程特征。

若要获取此信息,请使用 AutoML 试验运行的 fitted_model 输出。

automl_config = AutoMLConfig(…)
automl_run = experiment.submit(automl_config …)
best_run, fitted_model = automl_run.get_output()

自动化特征工程

get_engineered_feature_names() 函数返回工程特征名称的列表。

注意

使用 'timeseriestransformer' 代替 task='forecasting'. 对于 'regression''classification' 任务,请使用 'datatransformer'

fitted_model.named_steps['timeseriestransformer']. get_engineered_feature_names ()

此列表包括所有工程特征的名称。

['A', 'B', 'A_WASNULL', 'B_WASNULL', 'year', 'half', 'quarter', 'month', 'day', 'hour', 'am_pm', 'hour12', 'wday', 'qday', 'week']

get_featurization_summary() 函数获取所有输入特征的特征化摘要。

fitted_model.named_steps['timeseriestransformer'].get_featurization_summary()

输出

[{'RawFeatureName': 'A',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'B',
  'TypeDetected': 'Numeric',
  'Dropped': 'No',
  'EngineeredFeatureCount': 2,
  'Tranformations': ['MeanImputer', 'ImputationMarker']},
 {'RawFeatureName': 'C',
  'TypeDetected': 'Numeric',
  'Dropped': 'Yes',
  'EngineeredFeatureCount': 0,
  'Tranformations': []},
 {'RawFeatureName': 'D',
  'TypeDetected': 'DateTime',
  'Dropped': 'No',
  'EngineeredFeatureCount': 11,
  'Tranformations': ['DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime','DateTime']}]
输出 定义
原始特征名称 提供的数据集中的输入特征或列名。
类型检测 检测到的输入特征的数据类型。
丢失 指示输入特征是否被放弃或使用。
工程特征计数 通过自动化特征工程转换生成的特征数。
转换 应用于输入特征以生成工程特征的转换列表。

缩放和归一化

若要了解缩放和规范化,并使用其超参数值查看所选算法,请使用 fitted_model.steps

以下示例输出来自所选运行的 fitted_model.steps 运行:

[('RobustScaler', 
  RobustScaler(copy=True, 
  quantile_range=[10, 90], 
  with_centering=True, 
  with_scaling=True)), 

  ('LogisticRegression', 
  LogisticRegression(C=0.18420699693267145, class_weight='balanced', 
  dual=False, 
  fit_intercept=True, 
  intercept_scaling=1, 
  max_iter=100, 
  multi_class='multinomial', 
  n_jobs=1, penalty='l2', 
  random_state=None, 
  solver='newton-cg', 
  tol=0.0001, 
  verbose=0, 
  warm_start=False))]

若要获取更多详细信息,请使用此帮助程序函数:

from pprint import pprint

def print_model(model, prefix=""):
    for step in model.steps:
        print(prefix + step[0])
        if hasattr(step[1], 'estimators') and hasattr(step[1], 'weights'):
            pprint({'estimators': list(e[0] for e in step[1].estimators), 'weights': step[1].weights})
            print()
            for estimator in step[1].estimators:
                print_model(estimator[1], estimator[0]+ ' - ')
        elif hasattr(step[1], '_base_learners') and hasattr(step[1], '_meta_learner'):
            print("\nMeta Learner")
            pprint(step[1]._meta_learner)
            print()
            for estimator in step[1]._base_learners:
                print_model(estimator[1], estimator[0]+ ' - ')
        else:
            pprint(step[1].get_params())
            print()   

此辅助函数针对使用LogisticRegression with RobustScalar作为特定算法的某次运行返回以下输出。

RobustScaler
{'copy': True,
'quantile_range': [10, 90],
'with_centering': True,
'with_scaling': True}

LogisticRegression
{'C': 0.18420699693267145,
'class_weight': 'balanced',
'dual': False,
'fit_intercept': True,
'intercept_scaling': 1,
'max_iter': 100,
'multi_class': 'multinomial',
'n_jobs': 1,
'penalty': 'l2',
'random_state': None,
'solver': 'newton-cg',
'tol': 0.0001,
'verbose': 0,
'warm_start': False}

预测类概率

AutoML 创建的所有模型都有一个包装对象,其反映了开源源类的功能。 AutoML 返回的大多数分类模型包装器对象实现函数 predict_proba() 。 此函数接受特征(X 值)的类似数组或稀疏矩阵数据样本,并返回每个样本及其各自的类概率的 n 维数组。

如果使用相同的调用检索最佳运行和拟合模型,可以直接从拟合模型调用 predict_proba() 。 请根据模型类型,提供采用适当格式的示例。

best_run, fitted_model = automl_run.get_output()
class_prob = fitted_model.predict_proba(X_test)

如果基础模型不支持 predict_proba() 函数或格式不正确,则代码将引发模型类特定的异常。 有关如何为不同模型类型实现此函数的示例,请参阅 RandomForestClassifierXGBoost 参考文档。

AutoML 中的 BERT 集成

基于变换器的双向编码器表示技术 (BERT) 用于 AutoML 的特征化层。 在此层中,如果列包含自由文本或其他类型的数据(如时间戳或简单数字),则会相应地应用特征化。

对于 BERT,模型使用您提供的标签进行微调和训练。 模型输出文档嵌入功能以及其他功能,如基于时间戳的功能和一周中的一天。

了解如何设置 AutoML 以使用 Python 训练自然语言处理模型

调用 BERT 的步骤

若要调用 BERT,请在enable_dnn: True中设置automl_settings,并使用 GPU 进行计算(使用vm_size = "STANDARD_NC6"或更高配置的 GPU)。 如果使用 CPU 计算,AutoML 将启用 BiLSTM DNN 特征化器,而不是 BERT。

AutoML 针对 BERT 执行以下步骤:

  1. 预处理并标记所有文本列。 例如,可以在最终模型的特征化摘要中找到 StringCast 转换器。 可以在此 Jupyter 笔记本中找到有关如何生成模型特征化摘要的示例。

  2. 将所有文本列串联成单个文本列,因此在最终模型中会有StringConcatTransformer

    我们实现的 BERT 将训练示例的总文本长度限制为 128 个标记。 这意味着,当已连接时,所有文本列在理想情况下的长度最多应为 128 个标记。 如果存在多个列,则应修剪每个列,使此条件得到满足。 否则,对于长度超过 128 个标记的串联列,BERT 的 tokenizer 层将此输入截断为 128 个标记。

  3. 在特征扫描过程中,AutoML 在数据样本上将 BERT 与基线(词袋特征)进行比较。 这一比较确定了 BERT 是否可以提高准确性。 如果 BERT 的性能优于基线,AutoML 会使用 BERT 对整个数据进行文本特征化。 在这种情况下,你将在最终模型中看到 PretrainedTextDNNTransformer

BERT 的运行时间通常比其他的特征化器更长。 为了获得更好的性能,请使用 STANDARD_NC24rSTANDARD_NC24rs_V3 以利用其 RDMA 功能。

如有多个节点可用(最多可以使用 8 个节点),则 AutoML 会在多个节点之间分配 BERT 训练。 可以通过在AutoMLConfig对象中将max_concurrent_iterations参数设置为大于 1 来执行此操作。

BERT 支持的语言

AutoML 目前支持大约 100 种语言。 根据数据集的语言,AutoML 选择适当的 BERT 模型。 对于德国数据,它使用德国 BERT 模型。 对于英语,它使用英语 BERT 模型。 对于所有其他语言,它使用多语言 BERT 模型。

在以下代码中,将触发德语 BERT 模型,因为数据集语言被指定为 deu,这是根据 ISO 分类为德语的三字母语言代码:

from azureml.automl.core.featurization import FeaturizationConfig

featurization_config = FeaturizationConfig(dataset_language='deu')

automl_settings = {
    "experiment_timeout_minutes": 120,
    "primary_metric": 'accuracy',
# All other settings you want to use
    "featurization": featurization_config,
    
    "enable_dnn": True, # This enables BERT DNN featurizer
    "enable_voting_ensemble": False,
    "enable_stack_ensemble": False
}