One-Hot Encoding 独热编码 作者:马育民 • 2019-05-30 16:06 • 阅读:10406 # 概述 在机器学习算法中,我们经常会遇到 **分类(类别)特征**,例如:人的性别,所在班级,籍贯、花卉的种类、狗的品种等。 将这些 **文本特征** 用 **数字** 表示,才能进行数学运算 # 案例 有以下数据集: |姓名 |性别 |年龄 | | ------------ | ------------ | ------------ | |李雷 |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 原文出处:http://malaoshi.top/show_1EF3QPTxusan.html