统计学与统计机器学习2--离散型数据的相关性

一、数据预处理之独热编码

0、引入

在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。可将分类值转化为数字表示,但是,即使转化为数字表示后,此类数据也不能直接用在我们的分类器中。因为,分类器往往默认数据是连续的,并且是有序的。但是,单纯的将分类值转换为数字得到的数据并不是有序的,而是随机分配的。

为解决上述问题,其中一种可能的解决办法是采用独热编码

1、概念

独热编码:ONE-HOT Encoding

  • 又称为一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有他独立的寄存器位,并且在任意时候,其中只有一位有效。
  • 可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

这样做的好处主要有:

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

2、使用独热编码处理离散数据的原因

  1. 使用独热编码后,将离散特征的取值扩展到了欧氏空间,离散特征的某个取值就对应欧氏空间的某个点
  2. 将离散特征通过one-hot编码映射到欧氏空间,是因为,在回归、分类、聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧氏空间的相似度计算,计算余弦相似性,基于欧氏空间
  3. 将离散型特征使用ONE-HOT编码,确实会让特征之间的距离计算更加合理
    1. 比如, 有一个离散型特征,代表工作类型,该离散型特征,共有三个取值,不使用ONE-HOT编码,其表示分别是x1=(1),x2=(2),x3=(3)。两个工作之间的距离是,d(x1,x2)=1,d(x2,x3)=1,d(x1,x3)=2。那么x1和x3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理的。如果使用ONE-HOT编码,则得到x1=(1,0,0),x2=(0,1,0),x3=(0,0,1),那么两个工作之间的距离就都是sqrt(2),即每两个工作之间的距离是一样的,显得更合理。
  4. 对离散型特征进行ONE-HOT编码是为了让距离的计算显得更加合理
  5. 将离散型特征进行ONE-HOT编码,是为了让距离更加合理,但如果特征是离散的,并且不用ONE-HOT编码就可以很合理的计算出距离,那么就没必要进行ONE-HOT编码。
    1.比如,该离散特征共有1000个取值,我们分成两组,分别是400和600,两个小组之间的距离有合适的定义,组内的距离也有合适的定义,那么就没必要用ONE-HOT编码

离散特征进行ONE-HOT编码后,编码后的特征,其实每一维度的特征都可以看作是连续的特征。就可以像对连续型特征的归一方法一样,对每一维特征进行归一化。 比如归一化到[-1,1]或归一化到均值为0,方差为1.
基于树的方法是不需要进行特征的归一化,例如随机森林,bagging,boosting等。基于参数的模型或基于距离的模型,都要进行特征的归一化。

3、补充

  1. SVM中,原本线性不可分的特征,经过编码后到高维之后变得可分了;GBDT处理高维稀疏矩阵的时候效果并不好,即使是低维的稀疏矩阵也未必比SVM好
  2. 树模型不太需要ONE-HOT编码
    1. 对于决策树来说,ONE-HOT的本质是增加树的深度
    2. 树模型是在动态的过程中生成类似ONE-HOT+Feature Crossing的机制
      • 一个特征或者多个特征最终转换成一个叶子节点作为编码,one-hot可以理解为三个独立事件
      • 决策树是没有特征大小的概念的,只有特征处于它分布的哪一部分的概念
  3. one-hot可以解决线性可分问题,但是比不上label encoding
  4. one-hot降维后的缺点:降维前可以交叉的,降维后可能变得不能交叉
  5. 树模型的训练过程
    1. 从根节点到叶子节点整条路中有多少个节点相当于交叉了多少次,所以树的模型是自行交叉
    2. 使用树模型的叶子节点作为特征集交叉结果可以减少不必要的特征交叉的操作,或者减少维度和degree候选集 : degree → 8的特征向量 树 → 3个叶子节点
    3. 树模型:Ont-Hot + 高degree笛卡尔积 + lasso 要消耗更少的计算量和计算资源
      • nm的输入样本 → 决策树训练之后可以知道在哪一个叶子节点上 → 输出叶子节点的index → 变成一个n1的矩阵 → one-hot编码 → 可以得到一个n*o的矩阵(o是叶子节点的个数) → 训练一个线性模型
      • 典型的使用: GBDT + RF
      • 优点 : 节省做特征交叉的时间和空间

4、python实现

from sklearn import preprocessing
enc=preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transfrom([[0,1,3]]).toarray()

结果:

array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值