Azure Databricks AutoML 数据准备和处理

本文介绍 Azure Databricks AutoML 如何为机器学习训练准备数据,并介绍可配置的数据设置。 可以在 AutoML UI 中的试验设置期间调整这些选项。 有关使用 AutoML API 配置这些设置的信息,请参阅 AutoML Python API 参考

支持的数据特征类型

不支持以下未列出的特征类型。 例如,不支持图像。

支持以下特征类型:

  • 数字(ByteTypeShortTypeIntegerTypeLongTypeFloatTypeDoubleType
  • Boolean
  • 字符串(分类文本或英文文本)
  • 时间戳(TimestampTypeDateType
  • ArrayType[Numeric](Databricks Runtime 10.4 LTS ML 及更高版本)
  • DecimalType(Databricks Runtime 11.3 LTS ML 及更高版本)

列选择

注意

此功能仅适用于分类和回归问题

在 Databricks Runtime 10.3 ML 及更高版本中,你可以指定 AutoML 应使用哪些列进行训练。 若要在 UI 中排除某列,请在“包括”列中取消选中它。 在 API 中,使用 exclude_cols 参数。 有关更多信息,请参阅 Azure Databricks AutoML Python API 参考

你不能删除选择作为预测目标或时间列的列来拆分数据。

默认情况下,包括所有列。

估算缺失值

在 Databricks Runtime 10.4 LTS ML 和更高版本中,可以指定如何插补 null 值。 在 UI 中,从表架构的“插补”列中的下拉列表内选择一种方法。 在 API 中,使用 imputers 参数。 有关更多信息,请参阅 Azure Databricks AutoML Python API 参考

默认情况下,AutoML 会根据列类型和内容选择一种插补方法。

注意

如果你指定了非默认插补方法,则 AutoML 不会执行语义类型检测

将数据拆分为训练、验证和测试集

AutoML 将数据拆分为三个部分,用于训练、验证和测试。 根据 ML 问题的类型,可以使用不同的选项来拆分数据。

拆分用于回归和分类的数据

使用以下方法将数据划分为回归和分类任务的训练、验证和测试集:

(默认)随机拆分:如果未指定数据拆分策略,数据集将随机拆分为 60% 训练集、20% 验证集和 20% 测试集。 对于分类,分层随机拆分可确保每个类在训练集、验证集和测试集中得到充分表示。

按时间顺序拆分:在 Databricks Runtime 10.4 LTS ML 及更高版本中,可以选择时间列来创建按时间顺序的训练、验证和测试拆分。 按时间顺序的拆分将最早的时间点用于训练,第二早的时间点用于验证,最近的数据点用作测试。 时间列可以是时间戳、整数或字符串列。

手动拆分:在 Databricks Runtime 15.3 ML 及更高版本中,可以使用 API 设置手动拆分。 指定拆分列并使用值 trainvalidatetest 来标识要用于训练、验证和测试数据集的行。 拆分列值不是 traintestvalidate 的任何行将会忽略,并引发相应的警报。

拆分用于预测的数据

对于预测任务,AutoML 使用时序交叉验证。 此方法以递增方式按时间顺序扩展训练数据集,并在后续时间点执行验证。 交叉验证可对模型在不同时间段的性能进行可靠的评估。 它可确保预测模型对看不见的未来数据进行严格测试,从而保持预测的相关性和准确性。

交叉验证的折叠数量取决于输入表特征,例如时序数、是否存在协变量和时序长度。

对大型数据集采样

注意

采样不适用于预测问题。

虽然 AutoML 在群集的工作器节点之间分配超参数优化试验,而每个模型都在单个工作器节点上进行训练。

AutoML 会自动估算加载和训练数据集所需的内存,并根据需要对数据集进行采样。

在 Databricks Runtime 9.1 LTS ML 到 Databricks Runtime 10.4 LTS ML 中,采样分数不取决于群集节点类型或每个节点上的内存量。

在 Databricks Runtime 11.x ML 中:

  • 对于每个内核具有更多内存的工作节点,采样分数会增加。 你可以通过选择内存优化实例类型来增加样本大小。
  • 可以通过在群集的 Spark 配置中为 spark.task.cpus 选择更大的值来增加样本量。 默认设置为 1;最大值为工作器节点中的 CPU 数量。 增加此值时,样本量会更大,但并行运行的试验会更少。 例如,在具有 4 个内核和 64GB 总 RAM 的计算机中,默认 spark.task.cpus=1 为每个工作器运行 4 次试验,每次试验限制为 16GB RAM。 如果设置 spark.task.cpus=4,则每个工作器仅运行一次试验,但该试验可以使用 64GB RAM。

在 Databricks Runtime 12.2 LTS ML 和更高版本中,AutoML 可以通过为每个训练任务分配更多 CPU 核心来训练更大的数据集。 可以通过选择总内存更大的实例大小来增加样本大小。

在 Databricks Runtime 11.3 LTS ML 和更高版本中,如果 AutoML 已对数据集采样,则采样分数会显示在 UI 的“概述”选项卡中

对于分类问题,AutoML 使用 PySpark sampleBy 方法进行分层采样,以保留目标标签分布。

对于回归问题,AutoML 使用 PySpark sample 方法

对分类问题的不平衡数据集支持

在 Databricks Runtime 11.3 LTS ML 及更高版本中,如果 AutoML 检测到数据集不平衡,它会尝试通过降低主要类的采样率并添加类权重来平衡训练数据集。 AutoML 仅平衡训练数据集,而不平衡测试和验证数据集。 这样做可确保始终在具有真实输入类分布的非扩充数据集上评估模型性能。

为了平衡不平衡的训练数据集,AutoML 使用与给定类的采样率降低度成反比的类权重。 例如,如果一个包含 100 个样本的训练数据集有 95 个样本属于 A 类,5 个样本属于 B 类,AutoML 通过将 A 类的采样率降低到 70 个样本来实现此平衡,即按 70/95 的比例 (0.736) 降低 A 类的采样率,同时将 B 类中的样本数保持在 5。 为确保正确校准最终模型,并且模型输出的概率分布与输入的概率分布相同,AutoML 按 1/0.736 的比例 (1.358) 提高 A 类的类权重,同时将 B 类的权重保持为 1。 然后,AutoML 在模型训练中使用这些类权重作为参数,以确保在训练模型时每个类的样本都得到适当的加权。

时序聚合

对于预测问题,当时间序列中的时间戳有多个值时,AutoML 会使用这些值的平均值。

若要改用总和,请编辑试运行生成的源代码笔记本。 在“聚合数据中...”单元格,将 .agg(y=(target_col, "avg")) 更改为 .agg(y=(target_col, "sum")),如下所示:

group_cols = [time_col] + id_cols
df_aggregation = df_loaded \
  .groupby(group_cols) \
  .agg(y=(target_col, "sum")) \
  .reset_index() \
  .rename(columns={ time_col : "ds" })

语义类型检测

注意

  • 语义类型检测不适用于预测问题。
  • AutoML 不会对指定了自定义插补方法的列执行语义类型检测。

对于 Databricks Runtime 9.1 LTS ML 及更高版本,AutoML 会尝试检测列的语义类型是否与表架构中的 Spark 或 pandas 数据类型不同。 AutoML 将这些列视为检测到的语义类型。 这些检测是尽力而为的,有时可能会忽略语义类型的存在。 还可以手动设置列的语义类型,或告知 AutoML 不要使用注释将语义类型检测应用于列。

具体而言,AutoML 进行以下调整:

  • 表示日期或时间戳数据的字符串列和整数列被视为时间戳类型。
  • 表示数值数据的字符串列被视为数值类型。

对于 Databricks Runtime 10.1 ML 及更高版本,AutoML 还会进行以下调整:

  • 包含分类 ID 的数字列被视为分类特征。
  • 包含英语文本的字符串列被视为文本特征。

语义类型注释

对于 Databricks Runtime 10.1 ML 及更高版本,可以通过在列上放置语义类型注释来手动控制分配的语义类型。 若要手动将列 <column-name> 的语义类型注释为 <semantic-type>,请使用以下语法:

metadata_dict = df.schema["<column-name>"].metadata
metadata_dict["spark.contentAnnotation.semanticType"] = "<semantic-type>"
df = df.withMetadata("<column-name>", metadata_dict)

<semantic-type> 可以是以下值之一:

  • categorical:列包含分类值(例如,应视为 ID 的数值)。
  • numeric:列包含数值(例如,可以解析为数字的字符串值)。
  • datetime:列包含时间戳值(可以转换为时间戳的字符串、数字或日期值)。
  • text:字符串列包含英语文本。

若要对列禁用语义类型检测,请使用特殊关键字注释 native

特征存储集成

借助 Databricks Runtime 11.3 LTS ML 及更高版本,可以使用特征存储中的现有特征表来扩充分类和回归问题的原始输入数据集。

借助 Databricks Runtime 12.2 LTS ML 及更高版本,可以使用特征存储中的现有特征表来扩充原始输入数据集,以解决所有 AutoML 问题:分类、回归和预测。

若要创建特征表,请参阅特征工程和服务

若要使用现有特征表,可以使用 AutoML UI 来选择特征表或在 AutoML 运行规范中设置 feature_store_lookups 参数。

feature_store_lookups = [
  {
     "table_name": "example.trip_pickup_features",
     "lookup_key": ["pickup_zip", "rounded_pickup_datetime"],
  },
  {
      "table_name": "example.trip_dropoff_features",
     "lookup_key": ["dropoff_zip", "rounded_dropoff_datetime"],
  }
]

笔记本示例:使用特征存储进行 AutoML 试验

以下笔记本演示如何使用 AutoML 特征表和“特征存储”特征表训练 ML 模型。

使用特征存储示例笔记本的 AutoML 试验

获取笔记本