数据类型和转换

本页面介绍 Vertex AI 如何与 AutoML 模型的不同类型的表格数据搭配使用。

Vertex AI 中的转换简介

模型训练

必须先转换输入表格数据,然后才能用于模型训练。转换表示特定数据特征的函数。

支持以下转换:

如果您的数据源是 Cloud Storage 中的 CSV 文件,则必须使用英文逗号(“,”)作为分隔符。Vertex AI 使用 RFC 4180 CSV 格式。

如果您的数据源是 BigQuery,并且您要执行分类或回归,则可以添加由多个数据原语组成的数据。必须先预处理这些复合数据类型,然后才能应用转换。支持以下复合数据类型:

如果类型值缺失或为 null,则 Vertex AI 会根据您的模型目标和适用于该特征的转换来处理该值。如需了解详情,请参阅如何处理缺失值或 null 值

预测

用于预测的数据格式必须与用于训练的格式匹配。如需了解详情,请参阅预测的数据格式

Vertex AI 转换

分类

应用分类转换会导致该特征表示类别中的值。即一个无序分类值。 这些值的差别仅在于名称,没有顺序之分。您可以使用数字来表示分类值,但这些值之间没有数值上的关系。也就是说,分类值 1 并不比分类值 0 更大。

以下是分类值的一些示例:

  • 布尔值 - truefalse
  • 国家/地区 - "USA""Canada""China" 等等。
  • HTTP 状态代码 - "200""404""500" 等等。

分类值区分大小写;拼写变体被视为不同的类别(例如,“Color”和“Colour”不会被合并为一类)。

当您通过分类转换训练模型时,Vertex AI 会向特征应用以下数据转换,并使用提供训练的任何信号:

  • 分类字符串无任何更改 - 不更改大小写、标点、拼写、时态等。
  • 将类别名称转换为字典查找索引,并为每个索引生成嵌入。
  • 在训练数据集中的出现次数少于 5 次的类别会被视为“未知”类别。“未知”类别可获得自己的特殊查找索引和生成的嵌入。

分类转换可以应用于 CSV 文件中的 STRING 数据或以下 BigQuery 数据类型:

  • INT64
  • NUMERIC、BIGNUMERIC
  • FLOAT64
  • BOOL
  • STRING
  • DATE
  • DATETIME
  • TIME
  • 时间戳

文本

文本转换使特征可用作自由格式的文本,通常是文本标记。

以下是文本值的一些示例:

  • "The quick brown fox"
  • "This restaurant is the best! The food is delicious"

对于预测模型,协变量特征不支持文本转换。

当您通过文本转换训练模型时,Vertex AI 会向特征应用以下数据转换,并使用提供训练的任何信号:

  • 文本无任何更改 - 不更改大小写、标点、拼写、时态等。
  • 将文本令牌化为字词,并根据字词生成 1-gram 和 2-gram。将每个 n-gram 转换为字典查找索引,并为每个索引生成嵌入。使用平均值将所有元素的嵌入合并到单个嵌入中。

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

  • 缺失值可获得自己的查找索引和生成的嵌入。
  • 停用词不会受到任何特殊处理,也不会被移除。

文本转换可应用于 CSV 文件中的 STRING 数据或以下 BigQuery 数据类型:

  • STRING
  • DATETIME

数字

数值转换可将列用作序数或定数。这些数字可以比较。也就是说,两个不同的数字可以小于或大于彼此。

前导空格或尾随空格会被删除。

下表显示了数字转换的所有兼容格式:

格式 示例 备注
数字字符串 “101”、“101.5” 英文句点字符 (".") 是唯一有效的小数点分隔符。“101,5”和“100,000”不是有效的数字字符串。
科学记数法 “1.12345E+11”、“1.12345e+11” 有关数字字符串十进制分隔符的信息,请参见备注。
非数字 “NAN”、“nan”、“+NAN” 忽略大小写。忽略前缀加号(“+”)或减号(“-”)。解释为 NULL 值。
无穷大 “INF”、“+inf” 忽略大小写。忽略前缀加号(“+”)或减号(“-”)。解释为 NULL 值。

如果采用数值转换的列中的某个值不符合其中一种格式,则整个行都会被从训练中排除,或者该值被视为 null。选择数值转换时,您可以在这些结果之间进行选择。

当您通过数字转换训练模型时,Vertex AI 会向特征应用以下数据转换,并使用提供训练的任何信号:

  • 转换为 float32 的值。
  • 值的 z_score。
  • 基于分位数的值的存储分区索引。存储分区大小为 100。
  • 当值大于或等于 0 时,为 log(value+1)。 否则,系统不会应用此转换,该值会被视为缺失值。
  • 当值大于或等于 0 时,为 log(value+1) 的 z_score。否则,系统不会应用此转换,该值会被视为缺失值。
  • 一个布尔值,指示值是否为 null。
  • 对于训练和预测,不包括包含无效数值输入的行(例如无法解析为 float32 的字符串)。
  • 极值/离群值不会受到任何特殊处理。

数值转换可以应用于 CSV 文件中的 STRING 数据或以下 BigQuery 数据类型:

  • INT64
  • NUMERIC、BIGNUMERIC
  • FLOAT64
  • STRING
  • 时间戳

时间戳

时间戳转换会导致特征被用作时间点,表示为具有时区的民用时间或 Unix 时间戳。只有具有时间戳转换的功能才能用于时间列

如果未指定民用时间的时区,则默认为世界协调时间 (UTC)。

下表展示了所有兼容的时间戳字符串格式:

格式 示例 备注
%E4Y-%m-%d “2017-01-30” 有关此格式的说明,请参见 Abseil 文档
%E4Y/%m/%d “2017/01/30”
%Y/%m/%d %H:%M:%E*S “2017/01/30 23:59:58”
%d-%m-%E4Y “30-11-2018”
%d/%m/%E4Y “30/11/2018”
%d-%B-%E4Y “30-November-2018”
%Y-%m-%dT%H:%M:%E*S%Ez “2019-05-17T23:56:09.05Z” RFC 3339
Unix 时间戳字符串(秒) “1541194447” 仅适用于 1990 年 1 月 1 日至 2030年 1 月 1 日这一时间范围。
Unix 时间戳字符串(毫秒) “1541194447000”
Unix 时间戳字符串(微秒) “1541194447000000”
Unix 时间戳字符串(纳秒) “1541194447000000000”

如果采用时间戳转换的列中的某个值不符合其中一种格式,则整个行都会被从训练中排除,或者该值被视为 null。选择时间戳转换时,您可以在这些结果之间进行选择。

在使用时间戳转换训练模型时,Vertex AI 会向特征应用以下数据转换,并使用提供训练的任何信号:

  • 应用数值列的转换。
  • 确定年、月、日和工作日。将时间戳中的每个值都视为一个分类列。
  • 无效数值(例如,超出典型时间戳范围的值或极值)不会受到任何特殊处理,也不会被移除。
  • 对于训练和预测,不包括包含无效时间戳输入的行(例如无效的时间戳字符串)。

时间戳转换可以应用于 CSV 文件中的 STRING 数据或以下 BigQuery 数据类型:

  • INT64
  • STRING
  • DATE
  • DATETIME
  • 时间戳

复合数据类型

有时您需要包含由多个数据基元(如数组或结构体)组成的数据。只有使用 BigQuery 作为数据源时才能使用复合数据类型,并且预测模型不支持复合数据类型。

结构体

结构体可用于表示一组已添加标签的字段。结构体具有一系列字段名称,每个字段名称关联一个数据类型。对于同一列中的所有结构体值,字段列表及其数据类型必须相同。

以下是结构体的一些示例:

  • 血压 - {"timestamp": 1535761416, "systolic": 110, "diastolic": 70}
  • 产品 - {"name": "iPhone", price: 1000}

请使用 BigQuery STRUCT 数据类型来表示结构体。

结构体值会自动展平为字段。Vertex AI 会根据其转换类型将数据转换应用于 the 平字段。

数组

数组可用于表示值列表,包含的值必须接受相同的转换类型。您可以在数组中添加结构体;数组中的所有结构体都必须具有相同的结构。

Vertex AI 将数组视为具有相对权重。换句话说,数组中靠后的项具有的权重比靠前的项大。

以下是数组的一些示例:

  • 产品类别:

    ["Clothing", "Women", "Dress", ...]

  • 最近购买的商品:

    ["iPhone", "Laptop", "Suitcase", ...]

  • 用户记录:

    [{"name": "Joelle", ID: 4093}, {"name": "Chloe", ID: 2047}, {"name": "Neko", ID: 3432}, ...]

请使用 BigQuery ARRAY 数据类型来表示数组。

Vertex AI 数据转换取决于应用于数组的转换类型:

数组类型 转换
数值数组
  • 数值类型的所有转换应用于最后 N 个项的平均值,其中 N = {1, 2, 4, 8, all}。因此,得到着重强调的项是接近数组末尾的项,而不是开头的项。
  • 空数组的平均值被视为零。
分类数组
  • 对于最后 N 个项的数组(其中 N = {1, 2, 4, 8, all})中的每个元素,将类别名称转换为字典查找索引,并为每个索引生成嵌入。使用平均值将所有元素的嵌入合并到单个嵌入中。
  • 空数组被视为嵌入零。
文本数组
  • 使用空格 (" ") 作为分隔符将数组中的所有文本值连接为单个文本值,然后将结果视为单个文本值。应用文本列的转换。
  • 空数组被视为嵌入零。
时间戳数组
  • 数值列的转换应用到数组最后 N 个项的平均值。N = {1, 2, 4, 8, all}。 这意味着得到着重强调的项是接近数组末尾的项。
结构体数组
  • 数组中的结构体会展平为单个字段,并按字段组成数组。系统将根据该数组的字段类型应用数组转换(如下表中所述)。

如何处理缺失值或 null 值

缺失值的处理方式取决于模型目标和应用于该特征的转换。

分类和回归

在分类和回归模型中,对于分类和文本转换,null 值会导致嵌入;对于其他转换,null 值将被保留。

预测

对于预测模型,系统会根据周围的数据计算 null 值。(无法保留 null 值。)如果您希望控制 null 值的计算方式,可以明确计算这些值。要使用的最佳值可能取决于您的数据和业务问题。

允许缺失行(例如,在数据粒度为每日时,没有特定日期的行),但 Vertex AI 不会为缺失数据计算值。由于缺失行可能降低模型质量,应尽量避免缺失行。例如,如果由于某一天销售量为零而导致缺失一行,则为这一天添加一行,并将销售数据明确设置为 0。

哪些值被视为 null 值

在训练 AutoML 表格模型时,Vertex AI 会将以下值视为 null 值:

  • BigQuery NULL 值

  • NaN 或无限数值。

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

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

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

  • 列中具有数字转换或时间戳转换的值不是有效的列转换格式。在这种情况下,如果指定应在训练中使用无效值,则无效值将被视为 null。

预测的数据格式

用于预测的数据格式必须与用于训练的格式匹配。

如果您使用 Cloud Storage 中的 CSV 文件的数据训练模型,则数据的类型为 STRING。如果您使用 JSON 对象发送预测请求,请确保键值对中的所有值也都是 STRING 类型。

如果您已使用 BigQuery 中存储的数据训练模型,并且要使用 JSON 对象发送预测请求,则 JSON 键值对中值的数据类型必须遵循下表中的映射。

BigQuery 数据类型 JSON 数据类型
INT64 字符串
NUMERIC、BIGNUMERIC 数字
FLOAT64 数字
BOOL 布尔值
STRING 字符串
DATE 字符串
DATETIME 字符串
时间 字符串
时间戳 字符串
数组 数组
STRUCT 对象

例如,如果您的训练数据包含 FLOAT64 类型的 length 特征,则以下 JSON 键值对是正确的:

"length":3.6,

反之,以下 JSON 键值对会抛出错误:

"length":"3.6",

后续步骤