one-hot编码

发布于 2019-08-27  85 次阅读


One-Hot Encoding介绍

one-hot 可以采用N位状态寄存器来对N个状态进行编码,,每个状态都有独立的寄存器位,并且在任意时候只有一位有效。

比如现在有以下状态:

  • Six ['male','female']
  • country['china','America','Japan']
  • city ['beijing','shanghai','nanjing','shandong']

就可以将分类值的特征进行数字化,比如采用序列化的方式:[3,2,4] 来表示,但是很显然,[3,2,4]这样的特征处理并不能直接放入机器学习算法当中。

One-Hot Encoding 的处理方法

对于上面的三个特征,可以看出,性别是二维的,比如说,我们将 Six ['male','female'] 改成 Six [1,2] 这里的 1 对应 male ,2 对应 female。同理, contry可以表示成 country[1,2,3],city表示成 city[1,2,3,4]。

现在有一个人 其身份可以用 [1,1,1]来表示,即 [男性,中国,北京]

假设有四个人组成一个二维矩阵
[[1,2,3],
[2,1,2],
[1,3,4],
[2,2,1]]

下面是python代码实现 one-hot:

# coding:utf-8

import pandas as pd

if __name__ == '__main__':
    from sklearn.preprocessing import OneHotEncoder
    ohe = OneHotEncoder(sparse=False)
    x = [[1,2,3],
         [2,1,2],
         [1,3,4],
        [2,2,1]]
    x_onehot = ohe.fit_transform(x)
    print(x_onehot)

输出:

[[1. 0. 0. 1. 0. 0. 0. 1. 0.]
 [0. 1. 1. 0. 0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 1. 0. 0. 0. 1.]
 [0. 1. 0. 1. 0. 1. 0. 0. 0.]]

我们首先看二维数组X的每行的第一个,别是 1,2,1,2 所以就用两位数字 10 表示 1 ,01表示 2,再看X的每行的第二个数,分别是 2,1,3,2 同理用三位数字表示 100 表示1 ,010 表示2,001表示3,同理X的每行第三个数,用1000表示1

即输出的二维数组的第一行 [1. 0. 0. 1. 0. 0. 0. 1. 0.] 一共是9位,前两位表示 1 ,接着三位表示 2,后四位表示 3.其他行同理。

为什么使用one-hot编码来处理离散型特征?

  • 使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。

  • 将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

  • 将离散型特征使用one-hot编码,确实会让特征之间的距离计算更加合理。比如,有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用one-hot编码,其表示分别是x_1 = (1), x_2 = (2), x_3 = (3)。两个工作之间的距离是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2。那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个工作之间的距离是一样的,显得更合理。

  • 对离散型特征进行one-hot编码是为了让距离的计算显得更加合理。

  • 将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码,比如,该离散特征共有1000个取值,我们分成两组,分别是400和600,两个小组之间的距离有合适的定义,组内的距离也有合适的定义,那就没必要用one-hot 编码

  • 离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1


像烟花也是过一生,像樱花也是一生,只要亮过和盛开不就好了么?