创建训练数据的最佳做法

本页面介绍了为 AutoML Tables 数据集整理数据时需要考虑的一些基本概念,但并非详尽的解决方案。

简介

设计良好的数据集可提高生成的机器学习模型的质量。您可以使用本页面上的指南来提高数据集和模型的质量。

如果您在为机器学习模型创建训练数据方面经验丰富,请查看您可以轻松完成的任务列表。 AutoML Tables 会为您完成很多数据准备工作。

数据准备最佳做法

避免目标泄露

当您的训练数据包含请求预测时无从获得的预测信息时,会发生目标泄露。目标泄露可能会导致模型显示出色的评估指标,但在实际数据上却表现不佳。

例如,假设您想知道您的商店明天将销售多少冰淇淋。您不能在训练数据中包含目标日的温度,因为您不会知道温度(尚未发生)。但是,您可以使用前一天预报的温度,该温度可以包含在预测请求中。

避免训练-应用偏差 (training-serving skew)

如果您生成训练数据所用的方式不同于请求预测时生成数据所用的方式,即会发生训练-应用偏差。

例如,如果您要使用平均值,在进行训练时使用 10 天的平均值,但请求预测时却使用上个月的平均值。

一般来讲,您应该检查生成训练数据的方式与生成应用数据(用于生成预测的数据)的方式之间的差异,以避免出现训练-应用偏差。

训练-应用偏差和数据分布

训练、验证和测试数据拆分中的数据分布也可能会导致训练-应用偏差。在生产环境中部署模型时的数据分布与训练模型的数据集的数据分布之间通常存在差异。例如,在生产环境中,模型可能应用于完全不同于训练期间所看到的用户群,或者模型可能用于在记录最终训练数据 30 天后进行预测。

为获得最佳结果,请确保用于创建模型的数据拆分的分布准确反映了训练数据集与您将要在生产环境中进行预测的数据之间的差异。 AutoML Tables 可以生成非单调预测,如果生产数据的采样分布与训练数据之间存在非常大的差异,那么非单调预测不是很可靠。

此外,生产数据与训练数据之间的差异必须反映在验证数据拆分与训练数据拆分之间的差异上,以及测试数据拆分与验证数据拆分之间的差异上。

例如,如果您计划预测接下来 30 天的用户生命周期价值 (LTV),请确保验证数据拆分中的数据是训练数据拆分中 30 天后的数据,并且测试数据拆分中的数据是验证数据拆分中 30 天后的数据。

同样,如果您希望调整模型以针对新用户进行一般性预测,请确保来自特定用户的数据仅包含在训练数据的单个拆分中。例如,有关 user1 的所有行位于训练数据拆分中,有关 user2 的所有行位于验证数据拆分中,有关 user3 的所有行位于测试数据拆分中。

提供时间信号

如果数据中的底层模式有可能随时间变化(不是随时间随机分布),请确保将该信息提供给 AutoML Tables。您可以通过多种方式提供时间信号:

  • 如果每行数据都有时间戳,请确保该列被包括在内,数据类型为 Timestamp,并在创建数据集时设置为时间列。该排序用于拆分数据:将最新数据作为测试数据,最早的数据作为训练数据。 了解详情

  • 如果您的时间列没有很多不同值,则应使用手动拆分,而不是使用“时间”列来拆分数据。否则,您可能无法在每个数据集中获得足够的行数,从而导致训练失败。

  • 如果时间信息未包含在单个列中,您可以使用手动数据拆分将最新数据用作测试数据,并将最早的数据用作训练数据。

在必要情况下明确信息

通常,在使用 AutoML Tables 创建模型时,您无需执行特征工程。但是,对于某些数据原语,您可以通过进行特征工程处理来提高模型质量。

例如,如果您的数据包含经度和纬度,则这些列将被视为数值,而不进行特殊计算。如果位置或距离可为您的问题提供有用信息,则必须提取一个明确提供该信息的特征。

一些可能需要进行特征工程的数据类型有:

  • 经度/纬度
  • 网址
  • IP 地址
  • 电子邮件地址
  • 电话号码
  • 其他地理代码(例如邮政编码)

在一行中包含计算或汇总数据

AutoML Tables 仅使用单个行中的输入数据来预测该行的目标值。如果您计算或汇总了来自其他行或来源的数据,而这些数据在确定某个行的预测值时非常有用,请将这些数据包含在来源行中。请注意确保新列不会导致目标泄露训练-应用偏差

例如,如果您想要预测下周某种产品的需求,可以通过添加具有以下值的列来提高预测质量:

  • 与该产品属于同一类别的库存商品总数。
  • 与该产品属于同一类别的库存商品的平均价格。
  • 请求预测时距已知节假日的天数。
  • 等等…

另一个例子是,如果您想要预测某一特定用户是否会购买产品,则可以通过添加具有以下值的列来提高预测质量:

  • 该特定用户的平均历史转化率或点击率。
  • 当前该用户的购物车中有多少产品。

将 Null 值表示为空字符串

如果您的数据使用特殊字符或数字来表示 Null 值,则可能会给 AutoML Tables 带来问题,因为我们不知道它们代表着什么。如果从 CSV 导入数据,请使用空字符串表示 Null 值。如果从 BigQuery 导入则使用 Null 值。

尽可能避免缺失值

请检查您的数据是否存在缺失值。如果可能,请更正这些值。另外,如果列设置为可以为 Null,则可以将这些值留空。

使用空格分隔文本

AutoML Tables 对文本字符串进行分词,并可以从单个字词中获取训练信号。它使用空格来分隔字词;由其他字符分隔的字词被视为单个实体。

例如,如果您提供文本“红/绿/蓝”,该文本不会被标记化为“红”、“绿”和“蓝”。如果这些单独的字词对于训练模型可能很重要,则您应该在将文本加入训练数据之前将其转换为“红 绿 蓝”。

确保您的分类特征准确且干净

数据不一致可能导致类别被错误拆分。例如,如果您的数据包含“Brown”和“brown”,您可能将它们视为相同的值,但 AutoML Tables 会把它们作为两个单独的类别使用。拼写错误也会造成类似的后果。在创建训练数据之前,请确保从分类数据中消除这种不一致的现象。

特别注意不平衡的分类

如果您的分类不平衡(包含一个或多个罕见结果的分类问题),请查看以下提示。

为少数类提供充分的训练数据

若一个类别只有几行数据,则模型质量会降低。如果可能,您应为每个类提供至少 100 行数据。

考虑使用手动拆分

AutoML Tables 会随机(但确定性地)选择测试数据集的行。如果存在分类不平衡的情况,少数类在测试数据集中可能只有极小数量的(甚至完全没有)数据,从而导致训练失败。

如果您的类不平衡,您可能需要进行手动拆分,以确保每个拆分中的少数结果都有足够多的行。

避免偏见

确保您的训练数据能够代表您将要预测的潜在数据的整个范围。例如,如果您的客户遍布全球,则不应仅使用来自一个国家/地区的训练数据。

提供足够多的训练数据

如果您没有提供足够多的训练数据(行),生成的模型可能会性能不佳。用于训练模型的特征(列)越多,您需要提供的数据(行)就越多。对于分类模型,建议行数至少是列数的 10 倍。对于回归模型,您提供的行数至少应为列数的 50 倍。

您的数据集必须始终包含至少 1000 行。

让 AutoML Tables 执行所有其他预处理和转换工作

除非另有说明,否则请让 AutoML Tables 为您执行特征工程。AutoML Tables 有权访问您的底层数据时效果最佳。请参阅 AutoML Tables 为您进行的数据准备工作

AutoML Tables 为您进行的数据准备工作

本部分列出了 AutoML Tables 自动为您训练数据的一般要求。您无需在训练数据中包含这些计算。事实上,如果您自己进行这些转换并将其包含在训练数据中,则可能会降低生成模型的质量。

根据列类型,系统会对每个特征列应用以下自动转换:

列类型 转换
数值
  • 转换为 float32 的值。
  • 值的 z_score。
  • 基于分位数的值的存储分区索引。存储分区大小为 100。
  • 当值大于或等于 0 时,为 log(value+1)。 否则,系统不会应用此转换,该值会被视为缺失值。
  • 当值大于或等于 0 时,为 log(value+1) 的 z_score。否则,系统不会应用此转换,该值会被视为缺失值。
  • 一个布尔值,指示值是否为 null。
  • 对于训练和预测,不包括包含无效数值输入的行(例如无法解析为 float32 的字符串)。
  • 极值/离群值不会受到任何特殊处理。
数值数组
  • 数值类型的所有转换应用于最后 N 个项的平均值,其中 N = {1, 2, 4, 8, all}。因此,得到着重强调的项是接近数组末尾的项,而不是开头的项。
  • 空数组的平均值被视为零。
分类
  • 分类字符串无任何更改 - 不更改大小写、标点、拼写、时态等。
  • 将类别名称转换为字典查找索引,并为每个索引生成嵌入。
  • 在训练数据集中的出现次数少于 5 次的类别会被视为“未知”类别。“未知”类别可获得自己的特殊查找索引和生成的嵌入。
分类数组
  • 对于最后 N 个项的数组(其中 N = {1, 2, 4, 8, all})中的每个元素,将类别名称转换为字典查找索引,并为每个索引生成嵌入。使用平均值将所有元素的嵌入合并到单个嵌入中。
  • 空数组被视为嵌入零。
文本
  • 文本无任何更改 - 不更改大小写、标点、拼写、时态等。
  • 将文本令牌化为字词,并根据字词生成 1-gram 和 2-gram。将每个 n-gram 转换为字典查找索引,并为每个索引生成嵌入。使用平均值将所有元素的嵌入合并到单个嵌入中。

    令牌化是基于 Unicode 脚本边界进行的。

  • 缺失值可获得自己的查找索引和生成的嵌入。
  • 停用词不会受到任何特殊处理,也不会被移除。
文本数组
  • 使用空格 (" ") 作为分隔符将数组中的所有文本值连接为单个文本值,然后将结果视为单个文本值。应用文本列的转换。
  • 空数组被视为嵌入零。
时间戳
  • 应用数值列的转换。
  • 确定年、月、日和工作日。将时间戳中的每个值都视为一个分类列。
  • 无效数值(例如,超出典型时间戳范围的值或极值)不会受到任何特殊处理,也不会被移除。
  • 对于训练和预测,不包括包含无效时间戳输入的行(例如无效的时间戳字符串)。
时间戳数组
  • 数值列的转换应用到数组最后 N 个项的平均值。N = {1, 2, 4, 8, all}。 这意味着得到着重强调的项是接近数组末尾的项。
结构体
  • 结构体值会自动展平为字段。系统会根据展平字段的列类型来处理这些展平字段。

Null 或缺失值

可通过在数据集架构中将列设置成可为 null 或不可为 null,来选择如何处理训练数据的 null 值。如需了解详情,请参阅创建数据集

如果 null 值出现在不可为 null 的列中,则整行会从训练中排除。

可为 null 的列中的 null 值以特殊指标变量表示,该变量表示值为 null 值或缺失值。对于分类和文本转换,指标表示嵌入。

AutoML Tables 会将以下值视为 null 值:

  • BigQuery NULL 值

  • NaN 或无限数值。

  • 空白字符串。AutoML Tables 不会剪切字符串中的空格。 也就是说," " 不会被视为 null 值。

  • 可以转换为 NaN 或无限数值的字符串。

    • 对于“NAN”:忽略大小写,前面带有可选加号或减号。
    • 对于“INF”:忽略大小写,前面带有可选加号或减号。
  • 缺失值。

后续步骤