分类的数据准备

了解如何使用 AutoML 为分类准备数据。

本文介绍 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.4 LTS ML 和更高版本中,可以指定如何插补 null 值。 在 UI 中,从表架构的“插补”列中的下拉列表内选择一种方法。 在 API 中,使用 imputers 参数。 有关详细信息,请参阅 AutoML Python API 参考

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

注意

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

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

在 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 在模型训练中使用这些类权重作为参数,以确保在训练模型时每个类的样本都得到适当的加权。

列选择

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

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

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

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

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

使用以下方法将数据划分为训练、验证和测试集:

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

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

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

对大型数据集采样

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

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

Databricks Runtime 版本 采样行为
9.1 LTS ML - 10.4 LTS ML 采样分数是恒定的, 依赖于群集的节点类型或每个节点的内存。
11.x ML 对于每个核心具有更多内存的辅助角色节点,采样分数 会增加 。 增加样本大小:

- 使用 内存优化 实例类型。
- 在 Spark 配置中调整 spark.task.cpus 。 默认值为 1,最大值是工作节点上的 CPU 数。 最大值是工作节点上的 CPU 数。 增加此值时,样本量会更大,但并行运行的试验会更少。

示例:在具有 4 核和 64GB RAM 的计算机上:

- 每个 spark.task.cpus=1辅助角色运行 4 个试用版,每个试验都使用 16GB RAM。
- 对于 spark.task.cpus=4每个辅助角色,使用所有 64GB RAM 运行一次试用。
11.3 LTS ML 及更高版本 如果 AutoML 对数据集进行采样,则采样分数显示在 UI 的“概述 ”选项卡中。
12.2 LTS ML 及更高版本 AutoML 可以通过为每个训练任务分配更多 CPU 核心来处理更大的数据集。 通过选择具有更多总内存的实例来增加样本大小。

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

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

语义类型检测

注意

对于 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