Azure Databricks AutoML 的工作原理
本文详细介绍了 Azure Databricks AutoML 的工作原理及其对缺失值插补和大型数据采样等概念的实现。
Databricks AutoML 执行以下操作:
为模型训练准备数据集。 例如,AutoML 在模型训练之前针对分类问题执行不均衡数据检测。
迭代训练和调优多个模型,其中每个模型都由开源组件构造,可以轻松编辑并集成到机器学习管道中。
- AutoML 自动在群集的工作器节点之间分配超参数优化试验。
- 对于 Databricks Runtime 9.1 LTS ML 或更高版本,如果数据集太大,无法放入单个工作器节点的内存,AutoML 会自动对数据集进行采样。 请参阅对大型数据集采样。
根据 scikit-learn、xgboost、LightGBM、Prophet 和 ARIMA 包中的算法评估模型。
它会显示结果,并提供一个 Python 笔记本,里面有每个试验运行的源代码,可供查看、重现和修改代码。 AutoML 还会计算数据集的汇总统计信息,并将此信息保存在稍后可查看的笔记本中。
AutoML 算法
Databricks AutoML 根据下表中的算法训练和评估模型。
注意
对于分类和回归模型,决策树、随机林、逻辑回归和具有随机梯度下降算法的线性回归基于 scikit-learn。
分类模型 | 回归模型 | 预测模型 |
---|---|---|
决策树 | 决策树 | Prophet |
随机林 | 随机林 | Auto-ARIMA(在 Databricks Runtime 10.3 ML 及更高版本中可用。) |
逻辑回归 | 随机梯度下降的线性回归 | |
XGBoost | XGBoost | |
LightGBM | LightGBM |
支持的数据特征类型
不支持以下未列出的特征类型。 例如,不支持图像。
支持以下特征类型:
- 数字(
ByteType
、ShortType
、IntegerType
、LongType
、FloatType
和DoubleType
) - Boolean
- 字符串(分类文本或英文文本)
- 时间戳(
TimestampType
、DateType
) - ArrayType[Numeric](Databricks Runtime 10.4 LTS ML 及更高版本)
- DecimalType(Databricks Runtime 11.3 LTS ML 及更高版本)
将数据拆分为训练/验证/测试集
使用 Databricks Runtime 10.1 ML 和更高版本时,可以指定用于针对分类和回归问题进行训练/验证/测试数据拆分的时间列。 如果你指定此列,数据集将按时间分为训练集、验证集和测试集。 最早的点用于训练,次早的用于验证,最新的点用作测试集。
在 Databricks Runtime 10.1 ML 中,时间列必须是时间戳或整数列。 在 Databricks Runtime 10.2 ML 及更高版本中,你还可以选择字符串列。
对大型数据集采样
注意
采样不适用于预测问题。
虽然 AutoML 在群集的工作器节点之间分配超参数优化试验,而每个模型都在单个工作器节点上进行训练。
AutoML 会自动估算加载和训练数据集所需的内存,并根据需要对数据集进行采样。
在 Databricks Runtime 9.1 LTS ML 到 Databricks Runtime 10.5 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.0 ML 和更高版本中,AutoML 可以通过为每个训练任务分配更多 CPU 核心来训练更大的数据集。 可以通过选择总内存更大的实例大小来增加样本大小。
在 Databricks Runtime 11.0 ML 和更高版本中,如果 AutoML 已对数据集采样,则采样分数会显示在 UI 的“概述”选项卡中。
对于分类问题,AutoML 使用 PySpark sampleBy
sampleBy
进行分层采样,以保留目标标签分布。
对于回归问题,AutoML 使用 PySpark sample
sample
。
对分类问题的不平衡数据集支持
在 Databricks Runtime 11.2 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 不会对指定了自定义插补方法的列执行语义类型检测。
对于 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
。
用于模型可解释性的 Shapley 值 (SHAP)
注意
对于 MLR 11.1 及更低版本,如果数据集包含 datetime
列,则不会生成 SHAP 图。
AutoML 回归和分类运行生成的笔记本包括用于计算 Shapley 值的代码。 Shapley 值基于博弈论,并估计每个特征对模型预测的重要性。
AutoML 笔记本使用 SHAP 包计算 Shapley 值。 由于这些计算大量占用内存,因此在默认情况下不会执行计算。
若要计算和显示 Shapley 值,请执行以下操作:
- 转到 AutoML 生成的试用笔记本中的“特征重要性”部分。
- 设置
shap_enabled = True
。 - 运行该笔记本。
时序聚合
对于预测问题,当时间序列中的时间戳有多个值时,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" })
特征存储集成
借助 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 生成的用于数据探索的笔记本和试验最佳试用版会自动导入工作区。 其他试验试用生成的笔记本都保存为 DBFS 上的 MLflow 项目,而不是自动导入工作区。 对于除最佳试用版之外的所有试用版,不会设置 TrialInfo
Python API 中的 notebook_path
和 notebook_url
。 如果需要使用这些笔记本,可使用 AutoML 试验 UI 或 databricks.automl.import_notebook
Python API 将其手动导入工作区。
如果仅使用 AutoML 生成的数据探索笔记本或最佳试用笔记本,AutoML 试验 UI 中的“源”列包含指向生成的最佳试用版笔记本的链接。
如果在 AutoML 试验 UI 中使用其他生成的笔记本,则这些笔记本不会自动导入工作区。 可以通过单击每个 MLflow 运行来查找笔记本。 IPython 笔记本保存在运行页的“项目”部分中。 如果工作区管理员启用了下载项目,则可以下载此笔记本并将其导入工作区。
笔记本示例:使用特征存储进行 AutoML 试验
以下笔记本演示如何使用 AutoML 特征表和“特征存储”特征表训练 ML 模型。