zoukankan      html  css  js  c++  java
  • 数据预处理之独热编码(One-Hot Encoding)

    问题的由来

    在很多机器学习任务中,特征并不总是连续值,而有可能是分类值。

    例如,考虑以下三个特征:

    ["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 Chrom"]表示为[1,2,1]

    但是,即使转化为数字表示之后,上述数据也不能直接用在我们的分类器中。因为,分类器往往默认数据是连续的,并且是有序的。但是,按照我们上述的表示,数组并不是有序的,而是随机分配的。

    独热编码

    为了解决上述问题,其中一种可能的解决方法是采用独热编码(One-Hot Encoding)

    独热编码即One-Hot编码,又称为有效编码,其方法是使用N位寄存器来对N个状态进行编码,每个状态都由他独立的寄存位,并且在任意时候,其中只有一位有效。

    例如上面的"性别"特征,有2个可能的分类:male,female。那么就可以用2位编码来表示:10,01,每次只有1个位激活

    “所属区域”,有3个可能的分类:即Europe,US,ASia。那么就用3位编码来表示:100,010,001,每次只有1个位激活。

    “使用浏览器”,有4个可能的分类:即Firefox,Chrome,Safari,IE,那么就用4位编码来表示:1000,0100,0010,0001,每次只有1个位激活。

    例如:

    ["male","Asia","Safari"],通过独热编码就成为:[1,0,0,0,1,0,0,1,0]

    可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就编程了m个儿园特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

    这样做的好处主要是:
    1.解决了分类器不好处理属性数据的问题

    2.在一定程度上也起到了扩充特征的作用

    举例

    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])

    处理离散型特征和连续型特征并存的情况,如何做归一化

    例如:拿到获取的原始特征,必须对每一个特征分别进行归一化,比如,特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1]

    如果使用logistic回归,w1*x1+w2*x2,因为x1的取值太大了,所以x2基本起不了作用。所以必须进行特征的归一化,每个特征都单独进行归一化。

    连续特征归一化的常用方法:
    1.线性缩放到[-1,1]

    2.放缩到均值为0,方差为1

    离散特征的处理方法:
    对于离散的特征基本都是按照One-Hot编码,该离散特征有多少取值,就用多少维来表示该特征。

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

    1、使用One-Hot编码,将离散特征的取值扩展到欧式空间,离散特征的某个取值就对应欧式空间的某个点

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

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

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

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

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

  • 相关阅读:
    linux内核模块的程序结构
    Vmware中RedHat命令行和图形界面切换
    Linux2.6内核启动流程学习
    关于mini2440u_boot的制作及烧录
    linux指令
    Arm-linux-gcc-4.3.2安装步骤
    JNDI 与 LDAP
    apicloud 自定义模块引用aar
    CSS canvas 捕捉视频video元素截图
    本地服务器搭建服务:ftp
  • 原文地址:https://www.cnblogs.com/zhibei/p/9578203.html
Copyright © 2011-2022 走看看