问题的由来

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

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

["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. BZOJ3693: 圆桌会议(Hall定理 线段树)

    题意 题目链接 Sol 好的又是神仙题... 我的思路:对于区间分两种情况讨论,一种是完全包含,另一种是部分包含.第一种情况非常好判断,至于计算对于一个区间[l, r]的$\sum a[i]$就可以了 ...

  2. js addEventListener调用传参函数

    先看这段代码 function abc(key){ console.log(key); } for(let i=0;i<oInput.length;i++){ oInput[i].addEven ...

  3. 【Linux/Ubuntu学习 11】git查看某个文件的修改历史

    有时候在比对代码时,看到某些改动,但不清楚这个改动的作者和原因,也不知道对应的BUG号,也就是说无从查到这些改动的具体原因了- [注]:某个文件的改动是有限次的,而且每次代码修改的提交都会有commi ...

  4. Mysql数据库操作语句总结(一)

    下面的内容来源于链接 https://www.cnblogs.com/bchjazh/p/5997728.html,  个人在此基础上进一步添加了一点东西. 个人操作数据库:  mysql 5.5.2 ...

  5. .Net创建Windows服务完成批量导出功能(错误速查)

    无法打开计算机“.”上的服务控制管理器.此操作可能需要其他特权. 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为 ...

  6. Android(java)学习笔记99:Java虚拟机和Dalvik虚拟机的区别

    Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野.它对内存的高效使用,和在低速CPU上表现出的高性能,确实令 ...

  7. 题解 P2626 【斐波那契数列(升级版)】

    这道题,大家一定要注意: 要对2^31取模 ! ( 本蒟蒻开始没注意到这一点,WA了 ) (不过大家在试样例的时候,试试47,出不了结果,就说明你没模2^31) 总体来说,这道题考查的知识点就两个: ...

  8. PAT (Advanced Level) Practise - 1094. The Largest Generation (25)

    http://www.patest.cn/contests/pat-a-practise/1094 A family hierarchy is usually presented by a pedig ...

  9. 干净的架构The Clean Architecture_软件架构系列

    本文转载自:https://www.jdon.com/artichect/the-clean-architecture.html ,这个博客站很有历史了,博主经常翻译Github大牛的文章,值得墙裂推 ...

  10. 如何从SqlDataReader中获取DataRow

    1.前言使用SqlDataReader较之SqlDataAdapter速度上快,因为读取记录是一行一行的来,但是往往也感觉那么蹩脚.例如经常用到的如何从SqlDataReader中获取DataRow呢 ...