数据处理--One Hot Encoding

忘记从哪几位大神哪搜罗来的了

One Hot Encoding   又称为一位 有效编码, 主要采用N位状态寄存器来对N个状态进行编码, 每个状态都有独立的寄存位, 并且在任意时候都只有一位有效。

例如:

自然状态码为: 000, 001, 010, 100, 101 

One-Hot 编码为: 000001, 000010, 000100, 010000, 100000

对于每一个特征,如果它有m个可能值, 那么经过One—Hot编码后, 就变成了 m个二元特征(例如 成绩所有可能值为 好、中、差  — > 其 one-hot 编码后结果为 100, 010, 001); 这些特征互斥, 每次只有一个激活, 因此这样编码后数据会变的很稀疏。

但是这样做的好处是:

  1. 解决了分类器不好处理属性数据的问题
  2. 在一定程度上也起到了扩充特征的作用

例子:Scikit-learn 的例子

from sklearn.preprocessing import OneHotEncoder

def main():

    print('program start')

    enc = OneHotEncoder()

    enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])

    array = enc.transform([[0, 1, 3]]).toarray()

    print(array)  # [[1. 0. 0. 1. 0. 0. 0. 0. 1.]]

    print('program end')

if __name__ == '__main__':

    main()

Note: fit 了 4个数据的3个特征, transform了1个数据3个特征, 第一个特征两种值(0:10, 1:01),第二个特征三种值(0:100, 1: 010, 2:001) 第三个特征四种值(0:1000,1:0100,2:0010, 3:0001)。所以转换[0,1,3] 为[1.0.0,1,0,0,0,1]

在实际机器学习应用任务中, 有很多特征的的特征值(feature) 并不是连续的, 例如性别的取值为’male’ & ‘female’。所以对于这样的特征 ,通常我们需要对其进行特征数字化, 

如下面的例子:

性别:[‘male’, ‘female’]

地区:[‘Europe’, ‘US’, ‘Asia’]

浏览器:[‘Firefox’, ‘Chrome’, ‘Safari’, ‘Internet Explorer’]

对于某一个样本, 如[‘male’, ‘US’, ‘Internet Explorer’] , 我们需要将这个分类值的特征数字化, 最直接的方法是采用序列化的方式:[0,1,3] , 同理 [‘female’, ‘Asia’, ‘Chrome’]  序列化编码是[1,2,1]。 但是这样的特征不能直接放入机器学习的算法中。

因为, 分类器的默认数据是连续的,并且是有序的。 但是,按照上述表示, 数字并不是有序的,而是随机分配的。

为什么要求 数据是 连续的 ?和 要求是有序的,

One Hot Encoding 的处理方法

对于以上问题 , 性别的属性是二维的, 地区是三维的  , 同理 浏览器是四维的。这样,我们采用One-Hot编码的方式, 对上述的样本 [‘male’, ‘US’, ‘Internet Explorer’] 进行编码, 那么 ‘male’ 对应 [0,1] ;‘US’  —> [0,1,0]; ‘Internet Explorer’ —> [0,0,0,1] 最终 完整的特征数字化的结果为:[0,1,0,1,0,0,0,0,1] , 注意: ⚠️ 使用这样编码的后果是 数据会变得非常的稀疏。

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

1、Why do we binarize categorical features?

We binarize the categorical input so that they can be thought of as a vector from the Euclidean space (we call this as embedding the vector in the Euclidean space).使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。

2、Why do we embed the feature vectors in the Euclidean space?

Because many algorithms for classification/regression/clustering etc. requires computing distances between features or similarities between features. And many definitions of distances and similarities are defined over features in Euclidean space. So, we would like our features to lie in the Euclidean space as well.将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

3、Why does embedding the feature vector in Euclidean space require us to binarize categorical features?

Let us take an example of a dataset with just one feature (say job_type as per your example) and let us say it takes three values 1,2,3.

Now, let us take three feature vectors x_1 = (1), x_2 = (2), x_3 = (3). What is the euclidean distance between x_1 and x_2, x_2 and x_3 & x_1 and x_3? d(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2. This shows that distance between job type 1 and job type 2 is smaller than job type 1 and job type 3. Does this make sense? Can we even rationally define a proper distance between different job types? In many cases of categorical features, we can properly define distance between different values that the categorical feature takes. In such cases, isn't it fair to assume that all categorical features are equally far away from each other?

Now, let us see what happens when we binary the same feature vectors. Then, x_1 = (1, 0, 0), x_2 = (0, 1, 0), x_3 = (0, 0, 1). Now, what are the distances between them? They are sqrt(2). So, essentially, when we binarize the input, we implicitly state that all values of the categorical features are equally away from each other.

将离散型特征使用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).即每两个工作之间的距离是一样的,显得更合理。

4、About the original question?

Note that our reason for why binarize the categorical features is independent of the number of the values the categorical features take, so yes, even if the categorical feature takes 1000 values, we still would prefer to do binarization.

5、Are there cases when we can avoid doing binarization?没必要用one-hot 编码的情形

Yes. As we figured out earlier, the reason we binarize is because we want some meaningful distance relationship between the different values. As long as there is some meaningful distance relationship, we can avoid binarizing the categorical feature. For example, if you are building a classifier to classify a webpage as important entity page (a page important to a particular entity) or not and let us say that you have the rank of the webpage in the search result for that entity as a feature, then 1] note that the rank feature is categorical, 2] rank 1 and rank 2 are clearly closer to each other than rank 1 and rank 3, so the rank feature defines a meaningful distance relationship and so, in this case, we don't have to binarize the categorical rank feature.

More generally, if you can cluster the categorical values into disjoint subsets such that the subsets have meaningful distance relationship amongst them, then you don't have binarize fully, instead you can split them only over these clusters. For example, if there is a categorical feature with 1000 values, but you can split these 1000 values into 2 groups of 400 and 600 (say) and within each group, the values have meaningful distance relationship, then instead of fully binarizing, you can just add 2 features, one for each cluster and that should be fine.

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

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

有些情况不需要进行特征的归一化:

     It depends on your ML algorithms, some methods requires almost no efforts to normalize features or handle both continuous and discrete features, like tree based methods: c4.5, Cart, random Forrest, bagging or boosting. But most of parametric models (generalized linear models, neural network, SVM,etc) or methods using distance metrics (KNN, kernels, etc) will require careful work to achieve good results. Standard approaches including binary all features, 0 mean unit variance all continuous features, etc。

      基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。基于参数的模型或基于距离的模型,都是要进行特征的归一化。

one-hot编码为什么可以解决类别型数据的离散值问题 

首先,one-hot编码是N位状态寄存器为N个状态进行编码的方式 

eg:高、中、低不可分,→ 用0 0 0 三位编码之后变得可分了,并且成为互相独立的事件 

→ 类似 SVM中,原本线性不可分的特征,经过project之后到高维之后变得可分了 GBDT处理高维稀疏矩阵的时候效果并不好,即使是低维的稀疏矩阵也未必比SVM好 

Tree Model不太需要one-hot编码

对于决策树来说,one-hot的本质是增加树的深度 

tree-model是在动态的过程中生成类似 One-Hot + Feature Crossing 的机制 

1. 一个特征或者多个特征最终转换成一个叶子节点作为编码 ,one-hot可以理解成三个独立事件 

2. 决策树是没有特征大小的概念的,只有特征处于他分布的哪一部分的概念 

one-hot可以解决线性可分问题 但是比不上label econding 

one-hot降维后的缺点: 

降维前可以交叉的降维后可能变得不能交叉 

树模型的训练过程: 

从根节点到叶子节点整条路中有多少个节点相当于交叉了多少次,所以树的模型是自行交叉 

eg:是否是长的 { 否(是→ 柚子,否 → 苹果) ,是 → 香蕉 } 园 cross 黄 → 形状 (圆,长) 颜色 (黄,红) one-hot度为4的样本 

使用树模型的叶子节点作为特征集交叉结果可以减少不必要的特征交叉的操作 或者减少维度和degree候选集 

eg 2 degree → 8的特征向量 树 → 3个叶子节点 

树模型:Ont-Hot + 高degree笛卡尔积 + lasso 要消耗更少的计算量和计算资源 

这就是为什么树模型之后可以stack线性模型 

n*m的输入样本 → 决策树训练之后可以知道在哪一个叶子节点上 → 输出叶子节点的index → 变成一个n*1的矩阵 → one-hot编码 → 可以得到一个n*o的矩阵(o是叶子节点的个数) → 训练一个线性模型 

典型的使用: GBDT + RF 

优点 : 节省做特征交叉的时间和空间 

如果只使用one-hot训练模型,特征之间是独立的 

对于现有模型的理解:(G(l(张量))): 

其中:l(·)为节点的模型 

G(·)为节点的拓扑方式 

神经网络:l(·)取逻辑回归模型 

G(·)取全连接的方式 

决策树: l(·)取LR 

G(·)取树形链接方式 

创新点: l(·)取 NB,SVM 单层NN ,等 

G(·)取怎样的信息传递方式

猜你喜欢

转载自my.oschina.net/u/2272631/blog/1648103