One-Hot Encoding 独热编码

概述

在机器学习算法中,我们经常会遇到 分类(类别)特征,例如:人的性别,所在班级,籍贯、花卉的种类、狗的品种等。

将这些 文本特征 用 数字 表示,才能进行数学运算

案例

有以下数据集:

姓名 性别 年龄
李雷 male 20
韩梅梅 female 19
lucy female 19
lili female 19
王大锤 unknown 21

特征数字化

如果将上述 特征 用 数字 表示,我们一般会 按照 顺序进行编号,如下:

姓名 姓名编号 性别 性别编号 年龄
李雷 0 male 0 20
韩梅梅 1 female 1 19
lucy 2 female 1 19
lili 3 female 1 19
王大锤 4 unknown 0 21

注意:
由于 年龄 本身就是 数字,这里没有改动

将数据集用数字表示

["李雷", "male", 20] 表示为[0, 0, 20]

["lucy", "female", 19]表示为[2, 1, 19]

["lili", "female", 19]表示为[3, 1, 19]

["王大锤", "unknown", 21]表示为[4, 0, 21]

缺点1

像这种,通过 序号 对数据集 进行 数字表示,在人工智能算法中会有巨大问题:

有时会计算 平均值,用名字李雷和王大锤计算平均值:(0+4)/2=2,结果是名字lucy,这显然是不合理的

缺点2

特征数字从小到大,在算法中,可能会认为 数字越大 的 越重要,而事实上这些特征数字是 同等重要 的

解决问题

为了解决上述问题,采用独热编码(One-Hot Encoding)。

用 N位状态寄存器 来对 N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有 1位 有效

对特征用one-hot进行编码

姓名 姓名编号
李雷 0
韩梅梅 1
lucy 2
lili 3
王大锤 4

如上,由于 姓名编号 的 最大值是 4,即有 5种(从0开始算) 情况,那么 one-hot 编码有 5个数字,

  • 姓名编号是 0 的,one-hot 编码的第 1 个数字是 1,其他是 0,即: 1,0,0,0,0

  • 姓名编号是 1 的,one-hot 编码的第 2 个数字是 1,其他是 0,即: 0,1,0,0,0

  • 以此类推

将 名字 用 one-hot 进行编码,如下:

姓名 姓名编号 onehot编码
李雷 0 1,0,0,0,0
韩梅梅 1 0,1,0,0,0
lucy 2 0,0,1,0,0
lili 3 0,0,0,1,0
王大锤 4 0,0,0,0,1

转成二维数组如下:

       0  1  2  3  4
0 -> [[1, 0, 0, 0, 0 ]
1 ->  [0, 1, 0, 0, 0 ]
2 ->  [0, 0, 1, 0, 0 ]
3 ->  [0, 0, 0, 1, 0 ]
4 ->  [0, 0, 0, 0, 1 ]]

独热编码

上面这种就称为:独热编码,即 One-Hot 编码,又称 一位有效编码

其方法是:使用 N 位状态寄存器来对 N 个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。

独热编码的缺点

  • 如果原本的标签编码是 有序 的,那one hot编码就不合适了——会丢失顺序信息。
  • 如果特征的 特征值数目特别多,特征向量就会非常大,且非常稀疏。

tensorflow api

https://www.malaoshi.top/show_1EF5E6kX4Tmc.html

keras api

https://www.malaoshi.top/show_1EF4LIYD8wg3.html

感谢:

https://www.cnblogs.com/xyou/p/9197523.html
https://blog.csdn.net/czp_374/article/details/80503604
https://blog.csdn.net/moyu123456789/article/details/83444140
https://www.cnblogs.com/zongfa/p/9305657.html