Tensorflow学习: one-hot编码

来源:互联网 发布:椰子油 知乎 编辑:程序博客网 时间:2024/05/19 13:14

问题源于Udacity深度学习视频13,14课不解之处。
https://classroom.udacity.com/courses/ud730/lessons/6370362152/concepts/63713510510923

一、One-Hot Encoding
One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
在实际的机器学习的应用任务中,特征有时候并不总是连续值,有可能是一些分类值,如性别可分为“male”和“female”。在机器学习任务中,对于这样的特征,通常我们需要对其进行特征数字化,如下面的例子:
有如下三个特征属性:
性别:[“male”,”female”]
地区:[“Europe”,”US”,”Asia”]
浏览器:[“Firefox”,”Chrome”,”Safari”,”Internet Explorer”]
对于某一个样本,如[“male”,”US”,”Internet Explorer”],我们需要将这个分类值的特征数字化,最直接的方法,我们可以采用序列化的方式:[0,1,3]。但是这样的特征处理并不能直接放入机器学习算法中。

二、One-Hot Encoding的处理方法
对于上述的问题,性别的属性是二维的,同理,地区是三维的,浏览器则是思维的,这样,我们可以采用One-Hot编码的方式对上述的样本“[“male”,”US”,”Internet Explorer”]”编码,“male”则对应着[1,0],同理“US”对应着[0,1,0],“Internet Explorer”对应着[0,0,0,1]。则完整的特征数字化的结果为:[1,0,0,1,0,0,0,0,1]。这样导致的一个结果就是数据会变得非常的稀疏。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。
这样做的好处主要有:
解决了分类器不好处理属性数据的问题
一定程度上也起到了扩充特征的作用

三、实际的Python代码

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

结果:[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]
我们将矩阵排起来看:
[[ 0 0 3];
[ 1 1 0];
[ 0 2 1];
[ 1 0 2]]

矩阵每一列代表一个特征:
第一列只有0或1出现,共两种情况,所以one-hot编码前两维代表第一个特征,也恰好说明了是性别的分类。
第二列有0,1,2出现,三种情况,所以one-hot编码中间三维代表第二个特征,恰好证明了地区所对应的特征。
第三列有0,1,2,3出现,四种情况,所以one-hot编码最后思维代表第三个特征也是最后一个特征,证明了浏览器的对应的特征。
这里也很好的解释了“一定程度上也起到了扩充特征的作用”这句话,其实就是将所有的特征都融入到一个向量里面构成one-hot意义下的特征,一下子变成了9维的向量(个人理解)。
我们进一步墨迹下:
特征列:
[[“male”,”female”,”Europe”,”US”,”Asia”,”Firefox”,”Chrome”,”Safari”,”Internet Explorer”]]
输出结果:
[[ 1. ,0. , 0. , 1., 0. , 0., 0., 0., 1.]]
参考文献链接:
http://www.cnblogs.com/lzh-cnblogs/p/3764749.html
http://blog.csdn.net/google19890102/article/details/44039761