问题的由来

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

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

["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等,基于参数的模型或基于距离的模型的,都需要进行特征的归一化。

数据预处理之独热编码(One-Hot Encoding)的更多相关文章

  1. 【转】数据预处理之独热编码(One-Hot Encoding)

    原文链接:http://blog.csdn.net/dulingtingzi/article/details/51374487 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. ...

  2. 机器学习实战:数据预处理之独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  3. 数据预处理:独热编码(One-Hot Encoding)

    python机器学习-sklearn挖掘乳腺癌细胞( 博主亲自录制) 网易云观看地址 https://study.163.com/course/introduction.htm?courseId=10 ...

  4. 数据预处理:独热编码(One-Hot Encoding)和 LabelEncoder标签编码

    一.问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 离散特征的编码分为两种情况: 1.离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one- ...

  5. 数据预处理之独热编码(One-Hot Encoding)(转载)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  6. 机器学习 数据预处理之独热编码(One-Hot Encoding)

    问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的三个特征: ["male", "female"] ["from ...

  7. 机器学习:数据预处理之独热编码(One-Hot)

    前言 ———————————————————————————————————————— 在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等.这些特征值并不是连续的 ...

  8. Scikit-learn库中的数据预处理:独热编码(二)

    在上一篇博客中介绍了数值型数据的预处理但是真实世界的数据集通常都含有分类型变量(categorical value)的特征.当我们讨论分类型数据时,我们不区分其取值是否有序.比如T恤尺寸是有序的,因为 ...

  9. 数据预处理之独热编码(One-Hot):为什么要使用one-hot编码?

    一.问题由来 最近在做ctr预估的实验时,还没思考过为何数据处理的时候要先进行one-hot编码,于是整理学习如下:  在很多机器学习任务如ctr预估任务中,特征不全是连续值,而有可能是分类值.如下: ...

随机推荐

  1. mysql5.6.31安装及配置

    1,下载安装包解压到安装位置.下载地址https://dev.mysql.com/downloads/mysql/5.6.html#downloads 2,修改默认配置文件 在根目录下面有my-def ...

  2. JavaScript 创建对象的七种方式

    转自:xxxgitone.github.io/2017/06/10/JavaScript创建对象的七种方式/ JavaScript创建对象的方式有很多,通过Object构造函数或对象字面量的方式也可以 ...

  3. jQuery事件绑定函数:on()与bind()的差别

    jQuery从1.7+版本开始,提供了on()和off()进行事件处理函数的绑定和取消.on()和bind()这两个方法有相同的地方也有不同的地方. bind(type,[data],fn); on( ...

  4. php 03

    php03 一.判断类型 is_bool()   判断是否是布尔型 is_int(),is_integer() 和is_long()  判断是否是整型 is_float(),is_double()和i ...

  5. Hibernate笔记3--多表操作-导航查询

    一.一对多操作 1.构造实体类及编写配置文件:     一方:  // 一个Customer对应多个linkman private Set<Linkman> linkmans = new ...

  6. UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

    [NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...

  7. linux 命令——37 date (转)

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便. 1.命令格式: date [参数 ...

  8. fiddle连接终端测试配置

    第一次做app,对app的数据要进行一些数据抓包和数据分析,知道客户端发送到服务器端的过程和逻辑,通过抓包了解和分析出错,前提要先连接fiddle

  9. geoNear查询 near查询的升级版

    geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...

  10. wu2198:难得的波段抄底机会

    很好的波段抄底机会 个人浅见看,目前染料股跌出的机会明显,养殖股波段机会明显,芯片.半导体.集成电路.北导.软件.国产操作系统等科技股短线机会不错.另外,大盘指数2856/2806区域的波段操作机会不 ...