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
相关产品推荐
相关产品推荐

