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

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

特征名称 类别数 类别示例
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. 每种颜色都与一个唯一的整数值相关联。例如,“红色”与整数 0 相关联,“橙色”与整数 1 相关联,依此类推。
图 2. 编入索引的特征。

将字符串转换为唯一的编号后,您需要进一步处理数据,以便以有助于模型学习值之间有意义的关系的方式表示数据。如果将分类特征数据保留为编入索引的整数并加载到模型中,模型会将编入索引的值视为连续浮点数。然后,模型会认为“紫色”比“橙色”的可能性高出 6 倍。

独热编码

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

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

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

功能 红色 Orange 蓝色 黄色 绿色 黑色 紫色 棕色
“Red” 1 0 0 0 0 0 0 0
“Orange” 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。因此,系统会将“黄色”“橙色”“蓝色”和“蓝色”映射到 3、1、2、2。然后,系统会将这些值转换为独热特征向量。例如,假设系统有 8 种可能的颜色,则 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”

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

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

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