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

TensorFlow分类编码后出现额外列的逻辑原理是什么?

解答:TensorFlow分类编码出现额外列的原因

这个问题其实是旧版本TensorFlow预处理层的默认参数行为导致的,我来给你拆解清楚:

1. 额外列的来源:默认的特殊索引

在你使用的旧版教程对应的TensorFlow版本中,StringLookup层(用来把字符串类别转成整数索引)默认会自动添加两个特殊索引,加上你原有的2个类别,就构成了4列的编码结果:

  • 掩码(Mask)索引:对应空字符串(默认开启),用来处理数据中的缺失值或者需要掩码的场景;
  • OOV(词汇表外)索引:对应训练集中没出现过的未知类别(默认num_oov_indices=1),用来应对推理时遇到的新类别。

所以总索引数就是 2个实际类别 + 1个掩码 + 1个OOV = 4,这就是编码后输出4列的核心原因。

2. 输出列的具体含义

从你的输出结果能直接对应上:

  • 第1列:掩码索引(你的数据里没有空值,所以始终为0);
  • 第2列:OOV索引(你的数据里没有未知类别,所以始终为0);
  • 第3列:对应Cat类别(输入为Cat时这列是1);
  • 第4列:对应Dog类别(输入为Dog时这列是1)。

3. 为什么是2个额外列,不是其他数量?

这完全由StringLookup的默认参数决定:

  • 如果不需要OOV列,可以设置num_oov_indices=0;
  • 如果不需要掩码列,可以设置mask_token=None;
  • 同时设置这两个参数,编码后就只会输出2列,和你预期的独热编码一致。

比如修改你的StringLookup初始化代码:

index = preprocessing.StringLookup(max_tokens=max_tokens, num_oov_indices=0, mask_token=None)

此时index.vocab_size()就等于2,CategoryEncoding会直接生成2列的独热编码。

关于2024年教程更新的补充

你提到2024年默认行为更改,这是因为TensorFlow官方调整了预处理层的默认参数,让默认行为更贴近常规的独热编码需求,不再自动添加这两个特殊索引,所以现在的教程不会再出现这种额外列的情况了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:47:26