0. 前言
对于 One-Hot 编码 这个概念,经常被提及,但 One-Hot 编码 到底是什么?下面将对此进行总结。
1. 什么是 One-Hot 编码 ?
One-Hot编码:又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
上面算是官方的对于该术语的定义,但好像并不是特别清楚,还是举例说明吧!
2. One-Hot 编码示例
下面将会通过一些实际的例子来说明一下,对于上面的解释,其实 One-Hot 编码 也可称为 One of N encoding
-
假设对于学生的性别【男,女】进行编码
根据上面的官方概念,采用 N 位状态寄存器对 N 个状态进行编码,这里的特征有2个,也就是 N = 2,所以可以有下面的表示方式:
男 → \rightarrow → [1, 0] ;
女 → \rightarrow → [0, 1] ; -
假设对于学生的年级【小学,初中,高中】进行编码
如上,可以有如下表示:
小学 → \rightarrow → [1, 0, 0] ;
初中 → \rightarrow → [0, 1, 0] ;
高中 → \rightarrow → [0, 0, 1] ; -
假设对于学生的特长【钢琴,绘画,舞蹈,篮球】进行编码
如上,可以有如下表示:
钢琴 → \rightarrow → [1, 0, 0, 0,] ;
绘画 → \rightarrow → [0, 1, 0, 0] ;
舞蹈 → \rightarrow → [0, 0, 1, 0] ;
篮球 → \rightarrow → [0, 0, 0, 1] ;
那么,如果是这样的一个样本 【男,初中,篮球】,就可以这么表示:[1, 0, 0, 1, 0, 0, 0, 0, 1] 。
3. sklearn 中的 OneHotEncoder
from sklearn.preprocessing import OneHotEncoder
# 模拟的训练数据
X = [[0, 0, 2],
[1, 2, 3],
[1, 1, 0],
[0, 0, 1]
]
enc = OneHotEncoder(sparse=False)
enc.fit(X)
# 测试数据
x_test = [[1, 0, 2]]
result = enc.transform(x_test)
print(result)
输出结果:
[[0. 1. 1. 0. 0. 0. 0. 1. 0.]]
上述代码中的有4个训练数据,特征数为3,对应上边的例子,训练数据的第一列都为 0 1 1 0
,即对应学生的性别特征【男,女】;第二列 0 2 1 0
正好对应年级特征 【小学,初中,高中】;第三列 2 3 0 1
则正好对应特长这一特征【钢琴,绘画,舞蹈,篮球】;训练数据1:0, 0, 2
表示【男,小学,舞蹈】,其余类似;测试数据 1, 0, 2
表示【女,小学,舞蹈】,我们根据 2 中的示例,可以计算出 One-Hot 编码为:[0, 1, 1, 0, 0, 0, 0, 1, 0],跟代码运行出的编码也是一致的。