数据与特征
独热编码(one-hot encoding)
/ WUN-hot en-KOH-ding /
模型做的是算术,可许多特征却是词语:颜色是「红」「绿」或「蓝」;城市是「东京」或「利马」。如果你天真地把它们编成1、2、3,模型就会以为蓝(3)莫名其妙地是红(1)的三倍,或者红与蓝的平均数是绿——纯属胡来。独热编码用「给每个类别各配一个是/否开关」的办法来解决这个问题。
具体说来,一列有k个可能取值的类别列,会变成k个新列,每个取值各占一列。对任意一行,这些列里恰好有一个是1(「热」),其余都是0。于是「绿」就变成了(红=0, 绿=1, 蓝=0)。没有哪个类别被当作比另一个更大;它们只是不同而已。这样就能让无序的类别——称为名义类别(nominal)——如实地彼此分开,不会被偷偷塞进一个虚假的排序。
为何重要:它是把类别特征喂给「期望数字」的模型的标准做法,从线性回归到神经网络皆然。代价在于「变宽」:一列有成千上万个类别的特征(比如每个商品ID)会爆炸成成千上万列、且大多是零,既浪费又可能有害。对这种高基数情形,人们会转向学习得到的嵌入(embedding)等替代方案。此外,独热编码是给无序类别用的;若类别本有天然次序(小、中、大),把它们编成有序的数字反而可能更好。
一列取值为苹果、香蕉、樱桃的「水果」列,会变成三列。一行香蕉读作(苹果=0, 香蕉=1, 樱桃=0);一行苹果读作(苹果=1, 香蕉=0, 樱桃=0)。模型现在看到的是三个各自独立、地位平等的选项,而不是一个虚假的1-2-3排序。
一列类别变成几个0/1开关——平等、无排序、如实。
留意类别数量。对一个有成千上万个不同取值的特征做独热编码,会把你的数据胀成一片零的海洋;对这种高基数特征,学习得到的嵌入或目标编码通常是更明智的选择。
又称
另见