分类数据:词汇和独热编码

维度一词是特征向量中元素数的同义词。有些分类特征的维度较低。例如:

特征名称 类别数 类别示例
snowed_today 2 True、False
skill_level 3 新手、从业者、专家
season 4 冬季、春季、夏季、秋季
day_of_week 7 星期一、星期二、星期三
星球 8 水星、金星、地球

如果分类特征的可能类别数量较少,您可以将其编码为词汇。使用词汇表编码时,模型会将每个可能的分类值视为一个单独的特征。在训练过程中,模型会为每个类别学习不同的权重。

例如,假设您要创建一个模型来预测汽车的价格,在一定程度上根据名为 car_color 的分类特征预测汽车价格。也许红色汽车的价值高于绿色汽车。 由于制造商提供的外部颜色数量有限,因此 car_color 是一种低维分类特征。下图展示了 car_color 的词汇(可能值):

图 1. 调色板中的每种颜色都表示为一个单独的特征。也就是说,每个颜色都是特征矢量中的一项单独的特征。
      例如,“红色”是特征,“橙色”是单独的特征,依此类推。
图 1. 每个类别的独特功能。

练习:检查您的直觉

正确还是错误:机器学习模型可以直接基于原始字符串值(例如“红色”和“黑色”)进行训练,而无需将这些值转换为数值向量。
正确
在训练期间,模型只能处理浮点数。 字符串 "Red" 不是浮点数。您必须将 "Red" 等字符串转换为浮点数。
错误
机器学习模型只能使用具有浮点值的特征进行训练,因此您需要先将这些字符串转换为浮点值,然后才能进行训练。

编号

机器学习模型只能处理浮点数。因此,您必须将每个字符串转换为唯一的索引编号,如下图所示:

图 2. 每种颜色都与一个唯一的整数值相关联。例如,“Red”与整数 0 相关联,“Orange”与整数 1 相关联,依此类推。
图 2. 编入索引的特征。

练习:检查您的直觉

您的模型是否应直接针对图 2 中显示的编号进行训练?
如果模型使用索引编号进行训练,则会错误地将每个索引编号视为数值,并认为 "Black"(索引编号 5)对模型有意义的意义是 "Orange"(索引编号 1)的 5 倍。
您的模型不应基于索引编号进行训练。 如果匹配,则模型会将每个索引编号视为数值,并认为 "Black"(索引编号 5)对模型有意义的意义是 "Orange"(索引编号 1)的 5 倍。

独热编码

构建词汇的下一步是将每个索引编号转换为其独热编码。在独热编码中:

  • 每个类别都由一个包含 N 个元素的向量(数组)表示,其中 N 是类别的数量。例如,如果 car_color 有八个可能的类别,则表示 car_color 的独热向量将包含八个元素。
  • 独热矢量中只有一个元素的值为 1.0;其余所有元素的值均为 0.0。

例如,下表显示了 car_color 中的每个元素的独热编码:

功能 红色 Orange 蓝色 黄色 绿色 黑色 紫色 棕色
“Red” 1 0 0 0 0 0 0 0
“橙色” 0 1 0 0 0 0 0 0
"Blue" 0 0 1 0 0 0 0 0
“黄色” 0 0 0 1 0 0 0 0
“Green” 0 0 0 0 1 0 0 0
"Black" 0 0 0 0 0 1 0 0
“Purple” 0 0 0 0 0 0 1 0
“Brown” 0 0 0 0 0 0 0 1

是独热矢量(而非字符串或索引编号)会传递给特征向量。模型会为特征向量的每个元素学习单独的权重。

下图展示了词汇表征中的各种转换:

图 3. 将类别映射到特征向量的端到端流程图。在该图中,输入特征分别为“黄色”“橙色”“蓝色”和第二次出现的“蓝色”。系统使用存储的词汇(“红色”为 0、“橙色”为 1、“蓝色”为 2、“黄色”为 3 等)将输入值映射到 ID。因此,系统会将“Yellow”“Orange”“Blue”和“Blue”映射到 3、1、2、2。然后,系统会将这些值转换为独热特征向量。例如,假设某个系统有八种可能的颜色,则 3 会变为 0、0、0、1、0、0、0、0。
图 3. 将类别映射到特征向量的端到端流程。

稀疏表示法

值主要为零(或空)的特征称为稀疏特征。许多分类特征(如 car_color)往往是稀疏特征。稀疏表示法是指在稀疏矢量中存储 1.0 的位置。例如,"Blue" 的独热向量为:

[0, 0, 1, 0, 0, 0, 0, 0]

由于 1 位于第 2 个位置(从 0 开始计数),因此上述独热矢量的稀疏表示为:

2

请注意,与八元素的 one-hot 矢量相比,稀疏表示法占用的内存要少得多。重要的是,模型必须基于一对一向量进行训练,而不是基于稀疏表示进行训练。

分类数据中的离群值

与数值数据一样,分类数据也包含离群值。假设 car_color 不仅包含流行颜色,还包含一些鲜少使用的离群颜色,例如 "Mauve""Avocado"。您可以将这些离群颜色归入一个名为“不在词汇表中 (OOV)”的单个“万能”类别,而不是为每种离群颜色单独设置一个类别。换句话说,所有离群颜色都会归入到一个离群分桶中。系统会为该离群值存储桶学习单个权重。

对高维分类特征进行编码

一些分类特征具有大量维度,如下表所示:

特征名称 类别数 类别示例
words_in_english 约 500,000 “happy”“walking”
US_postal_codes 约 42,000 “02114”“90301”
last_names_in_Germany ~850,000 “Schmidt”“Schneider”

当类别数量较多时,独热编码通常不是一个好选择。嵌入(详见单独的嵌入模块)通常是更好的选择。嵌入可以显著减少维度数量,这对模型有两个重要好处:

  • 模型通常会更快地训练。
  • 构建的模型通常可以更快地推理出预测结果。也就是说,模型的延迟时间更短。

哈希(也称为哈希技巧)是一种不太常见的减少维度数量的方法。