在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。
例如,考虑一下的三个特征:
["male", "female"]
["from Europe", "from US", "from Asia"]
["uses Firefox", "uses Chrome", "Safari", "uses Internet Explorer"]
如果将上述特征用数字表示,效率会高很多。例如:
["male", "from US", "uses Internet Explorer"] 表示为[0, 1, 3]
["female", "from Asia", "uses Chrome"]表示为[1, 2, 1]
但是,即使转化为数字表示后,上述数据也不能直接用在我们的分类器中。因为,分类器往往默认数据数据是连续的,并且是有序的。但是,按照我们上述的表示,数字并不是有序的,而是随机分配的。
为了解决上述问题,其中一种可能的解决方法是采用One-Hot Encoding.
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
例如对六个状态进行编码:
自然顺序码为 000,001,010,011,100,101
独热编码则是 000001,000010,000100,001000,010000,100000
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
这样做的好处主要有:
1. 解决了分类器不好处理属性数据的问题
2. 在一定程度上也起到了扩充特征的作用
处理离散型特征和连续型特征并存的情况,如何做归一化。
连续型特征归一化的常用方法:
1:线性放缩到[-1,1]
x = (2x - max - min)/(max - min).
2:标准化,放缩到均值为0,方差为1:
x = (x - u)/s.
u:均值;s:标准差
离线型特征归一化的常用方法:
对于离散的特征基本就是按照one-hot编码,该离散特征有多少取值,就用多少维来表示该特征。
为什么使用one-hot编码来处理离散型特征
看下文解说。。.
1、为什么做二值化处理?
使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
2、为什么将特征向量嵌入到欧氏空间中?
将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
3、为什么在欧几里得空间中嵌入特征向量需要对分类特征进行二值化?
将离散型特征使用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、有没有可以避免二值化的情况?
将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码.
有些情况不需要进行特征的归一化
且听。。。
基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。基于参数的模型或基于距离的模型,都是要进行特征的归一化。
one-hot编码为什么可以解决类别型数据的离散值问题
吾曰。。。
例:高、中、低不可分,→ 用0 0 0 三位编码之后变得可分了,并且成为互相独立的事件 。
Tree Model不太需要one-hot编码
对于决策树来说,one-hot的本质是增加树的深度 。tree-model是在动态的过程中生成类似 One-Hot + Feature Crossing 的机制.
决策树没有特征大小的概念的,只有特征处于他分布的哪一部分的概念 .
one-hot降维后的缺点
one-hot可以解决线性可分问题但是比不上label econding 。降维前可以交叉的降维后可能变得不能交叉.
树模型的训练过程
从根节点到叶子节点整条路中有多少个节点相当于交叉了多少次,所以树的模型是自行交叉 。
eg:是否是长的 { 否(是→ 柚子,否 → 苹果) ,是 → 香蕉 } 园 cross 黄 → 形状 (圆,长) 颜色 (黄,红) one-hot度为4的样本.
使用树模型的叶子节点作为特征集交叉结果可以减少不必要的特征交叉的操作或者减少维度和degree候选集 .
树模型:Ont-Hot + 高degree笛卡尔积 + lasso 要消耗更少的计算量和计算资源 。这就是为什么树模型之后可以stack线性模型 .
n*m的输入样本 → 决策树训练之后可以知道在哪一个叶子节点上 → 输出叶子节点的index → 变成一个n*1的矩阵 → one-hot编码 → 可以得到一个n*o的矩阵(o是叶子节点的个数) → 训练一个线性模型
典型的使用: GBDT + RF
优点 : 节省做特征交叉的时间和空间
如果只使用one-hot训练模型,特征之间是独立的 。
参考:
https://www.quora.com/What-are-good-ways-to-handle-discrete-and-continuous-inputs-together
http://blog.csdn.net/dulingtingzi/article/details/51374487