01 举例引入
假设我们有一群学生,他们可以通过四个特征来形容,分别是:
- 性别:[“男”,“女”]
- 年级:[“初一”,“初二”,“初三”]
- 学校:[“一中”,“二中”,“三中”,“四中”]
举个例子,用上述四个特征来描述小明同学,即“男生,初一,来自二中”,用独热编码的形式来表示,我们用采用N位状态寄存器来对N个状态进行编码,拿上面的例子来说,就是:
性别 | [“男”,“女”] | N=2 | 男:1 0 女:0 1 |
---|---|---|---|
年级 | [“初一”,“初二”,“初三”] | N=3 | 初一:1 0 0 初二:0 1 0 初三:0 0 1 |
学校 | [“一中”,“二中”,“三中”,“四中”] | N=4 | 一中:1 0 0 0 二中:0 1 0 0 三中:0 0 1 0 四中:0 0 0 1 |
因此,当我们再来描述小明的时候,就可以采用 [ 1 0 1 0 0 0 1 0 0 ] 。
02 数字表示
(1)给出数字数据集如下:
0 | 0 | 3 |
1 | 1 | 0 |
0 | 2 | 1 |
1 | 0 | 2 |
这里一共有四个数据,三种特征。是哪四个呢,我们列出矩阵
第一种 | 第二种 | 第三种 | |
---|---|---|---|
第一个 | 0 | 0 | 3 |
第二个 | 1 | 1 | 0 |
第三个 | 0 | 2 | 1 |
第四个 | 1 | 0 | 2 |
那么,对于(0,1,3)这个特征向量如何进行独热编码呢?
我们竖着看数据集,可以看出第一种特征中只有0、1两类,第二组有0、1、2三类,第三种有0、1、2、3四类,因此分别可以用2、3、4个状态类来表示。
在(0,1,3)中,
第一个数为0,对应第一种特征则为 1 0;
第二个数为1,对应第二种特征则为 0 1 0;
第三个数为3,对应第三种特征则为 0 0 0 1。
注意:这里的3编码为 0 0 0 1,而非 1 0 0 0。
使用python编程验证 :
# 创建一个 OneHotEncoder 对象
encoder1 = preprocessing.OneHotEncoder()
# 拟合并进行编码
encoder1.fit([[0,0,3], [1,1,0], [0,2,1], [1,0,2]])
# 对指定数据进行编码
encoded_vector1 = encoder1.transform([[0,1,3]]).toarray()
# 打印编码后的向量
print ("\nEncoded vector1 =", encoded_vector1)
输出结果:
Encoded vector1 = [[1. 0. 0. 1. 0. 0. 0. 0. 1.]]
即:
(0,1,3) | 0 | 1 | 3 |
独热编码 | 10 | 010 | 0001 |
(2)再给出一组数据集:
0 | 2 | 1 | 12 |
1 | 3 | 5 | 3 |
2 | 3 | 2 | 12 |
1 | 2 | 4 | 3 |
我们进行(2,3,5,3)的独热编码。
使用python编程如下:
# 创建一个 OneHotEncoder 对象
encoder = preprocessing.OneHotEncoder()
# 拟合并进行编码
encoder.fit([[0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3]])
# 对指定数据进行编码
encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray()
# 打印编码后的向量
print ("\nEncoded vector =", encoded_vector)
运行后结果如下:
Encoded vector = [[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
即:
(2,3,5,3) | 2 | 3 | 5 | 3 |
独热编码 | 001 | 01 | 0001 | 10 |
这个结果又是如何得出的呢?
可以简单理解为对每组纵向数据先进行了排序,
如第三种中,本来的(1,5,2,4),换成(1,2,4,5),
所以,1对应1000,2对应0100,4对应0010,5对应0001。
同理,在第四种里,3对应10,12对应01。
至此,应该可以理解如何进行独热编码了。