You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TensorFlow/Keras categorical encoding:两类为何需4个dummy variables而非2个

分类编码维度差异的核心原因
  • 首先明确结论:教程中出现的4个dummy变量输出,不是为cat、dog两个类别分配了双倍维度,而是TensorFlow预处理层的维度计数从「未登录类别占位位」开始累加的结果。

4个维度的计算逻辑

教程示例中的编码层,特意设置了num_oov_indices=2参数——也就是预留2个固定位置,专门映射模型部署时遇到的、训练集里没有收录过的新类别。
总维度的计算非常直观:2个OOV占位位 + 训练集词汇表中收录的2个实际类别(cat、dog)= 刚好4个输出维度。

和传统编码工具的设计差异

  • 如果使用Sklearn、pandas自带的独热编码工具,默认不会为未登录类别预留空间:只要训练集里识别到2个类别,输出就是2个维度,遇到训练时没见过的类别会直接触发报错。
  • TensorFlow的设计优先保障生产部署的稳定性:预留固定数量的OOV占位位,可以让模型输出的张量shape永远保持固定,不会因为线上输入的类别变化,就出现维度不匹配的推理错误。

如何得到预期的2维度输出

如果不需要预留未登录类别占位位,可以直接把编码层的num_oov_indices参数设为0,输出维度会严格和传入的类别列表长度匹配:

# 配置示例:仅收录cat、dog两个类别,无OOV占位
cat_dog_encoder = tf.keras.layers.StringLookup(
    vocabulary=["cat", "dog"],
    num_oov_indices=0,
    output_mode="one_hot"
)
# 输入cat返回[1, 0],输入dog返回[0, 1],输出维度为2
cat_dog_encoder(tf.constant(["cat"]))

容易被忽略的教程细节

  • 很多人看教程时会跳过层初始化的参数设置,只盯着词汇表里的2个类别值,默认输出维度就应该和类别数完全相等。实际上教程里的示例是特意演示「多OOV位」的配置效果,不是生产环境的通用默认值。
  • 就算使用层的默认参数(num_oov_indices=1),对2个实际类别的列做独热编码,输出维度也会是3个(1个OOV位 + 2个类别位),不会刚好等于实际类别数。

内容的提问来源于stack exchange,提问作者Levin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 10:36:02