在现实生活中获得的原始数据会包含非数值型特征,这些特征常常以字符串格式存储,但是数据分析模型需要的输入特征通常都是数值型的,因此我们需要对其进行数字编码,使用数字对离散型的取值进行表示。
数字编码
简单的数字编码:
从0开始赋予特征的每一个取值一个整数。
等级型特征:
可以按照特征取值从大到小进行整数编码来保证编码后的数据保留原有次序关系。如:{冠军,亚军,季军}可以表示为{0,1,2}。
名义型特征:
使用上述编码时可能会产生一些问题,比如按照{0,1,2,3,4}给五个特征值赋值,但是这样会给原数据添加次序关系,到底1赋值给哪个特征值较好?
为了避免上述误导性结果,我们可以使用下面的编码方式。
One-Hot 编码
One-Hot编码将包含K个取值的离散型特征转换成K个二元特征(取0或1),例如特征“汽车品牌”:{路虎,吉利,奥迪,大众,奔驰},一共包含5个不同的值,我们可以将其编码为5个特征 f 1 f_1 f1、 f 2 f_2 f2、 f 3 f_3 f3、 f 4 f_4 f4、 f 5 f_5 f5,这5个特征与原始特征的取值一一对应,当原始特征取不同值时,转换后的特征取值如下表所示:
原始特征取值 | f 1 f_1 f1 | f 2 f_2 f2 | f 3 f_3 f3 | f 4 f_4 f4 | f 5 f_5 f5 |
---|---|---|---|---|---|
路虎 | 1 | 0 | 0 | 0 | 0 |
吉利 | 0 | 1 | 0 | 0 | 0 |
奥迪 | 0 | 0 | 1 | 0 | 0 |
大众 | 0 | 0 | 0 | 1 | 0 |
奔驰 | 0 | 0 | 0 | 0 | 1 |
这样就不会给名义型特征的取值人为地引入次序关系,但是One-Hot编码也有缺点,首先它会使特征维度显著增多,其次,它会增加特征之间的相关性,我们会发现如下线性关系:
f
1
+
f
2
+
f
3
+
f
4
+
f
5
=
1
f_1+f_2+f_3+f_4+f_5=1
f1+f2+f3+f4+f5=1
特征之间存在线性关系,会影响线性回归等模型的效果,因此我们需要对One-Hot编码进行一些改变,对于包含K个取值的离散型特征,将其转换成K-1个二元特征,这种编码方式称为哑变量编码(dummy encoding)。将上述例子编码为4个二元特征,当原始特征取不同取值时,转换后的特征取值如下表所示:
原始特征取值 | f 1 f_1 f1 | f 2 f_2 f2 | f 3 f_3 f3 | f 4 f_4 f4 |
---|---|---|---|---|
路虎 | 1 | 0 | 0 | 0 |
吉利 | 0 | 1 | 0 | 0 |
奥迪 | 0 | 0 | 1 | 0 |
大众 | 0 | 0 | 0 | 1 |
奔驰 | 0 | 0 | 0 | 0 |