概述
在机器学习算法中,我们经常会遇到 分类(类别)特征,例如:人的性别,所在班级,籍贯、花卉的种类、狗的品种等。
将这些 文本特征 用 数字 表示,才能进行数学运算
案例
有以下数据集:
| 姓名 | 性别 | 年龄 |
|---|---|---|
| 李雷 | 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