为了防止将编号0到17的特征认为是连续型的特征,即认为1和2相似,4和10不同,但其实这是没有意义的,对于两个特征,要么它是一个特征,要么不同,没有中间状态。
为了消除这种和实际情况不一致 的现象,使用OneHotEncode编码把这些整数转化为二进制。每个特征用一个二进制数字来表示。例如,特征A分配的数值为7,那么one-hot编码为它分配的二进制数字的第七位就是1,其余位为0.
在实际的应用场景中,有非常多的特征不是连续的数值变量,而是某一些离散的类别。比如在广告系统中,用户的性别,用户的地址,用户的兴趣爱好等等一系列特征,都是一些分类值。这些特征一般都无法直接应用在需要进行数值型计算的算法里,比如CTR预估中最常用的LR。那针对这种情况最简单的处理方式是将不同的类别映射为一个整数,比如男性是0号特征,女性为1号特征。这种方式最大的优点就是简单粗暴,实现简单。那最大的问题就是在这种处理方式中,各种类别的特征都被看成是有序的,这显然是非常不符合实际场景的。
例如,考虑一下的三个特征:
["male",
"female"] ["from Europe",
"from US", "from Asia"] ["uses Firefox",
"uses Chrome", "uses Safari", "uses Internet Explorer"]
如果将上述特征用数字表示,效率会高很多。例如:
["male",
"from US", "uses Internet Explorer"] 表示为[0, 1, 3]
["female",
"from Asia", "uses Chrome"]表示为[1, 2, 1]
但是,即使转化为数字表示后,上述数据也不能直接用在我们的分类器中。因为,分类器往往默认数据数据是连续的,并且是有序的。但是,按照我们上述的表示,数字并不是有序的,而是随机分配的。
one hot编码的优点:
1.能够处理非连续型数值特征。
2.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。
注意:此处一定将训练特征和测试特征一起转化,因为转化之后数组的维度将会发生变化,有一个不转化,就会出错。