数据预处理之One_hot Encoding

最近在参与职业生涯的第一个机器学习算法大赛(腾讯广告算法大赛),在和队友们学习大神YouChouNoBB的github上公开的带你上0.73的代码https://github.com/YouChouNoBB/2018-tencent-ad-competition-baseline时遇到了从未听说过但是听起来很牛逼的One-hot编码。

其实One-hot编码又称为一位有效编码,就是用N位二进制编码来对N个状态进行记录,每个状态对应一个独立的位,并且在任意时候只会也只能有一位有效。

举个栗子:

我们遇到一个特征,西瓜的根蒂,有[蜷缩,硬挺,稍蜷]三种,这个特征是离散的。首先我们将之用数字1,2,3代替表示效率会高很多。

但是1,2,3是连续的,他们之间是有大小先后关系的,这可能会对我们要进行的操作比如分类造成一些不必要的影响。于是我们再进行一次改进,将这三个特征分别用[100,010,001]来表示,这样就解决了前面的先后大小关系的问题,同时每个类之间编码的距离(比如曼哈顿距离,欧氏距离或者其他明氏距离)也是相等的。而这个编码[100,010,001]就叫做One-hot编码。

当然在使用One-hot编码时,数据会变的非常稀疏。

摘抄一段sklearn包中写好的OneHotEncoder的使用:

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

结果:[[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

 

而对于稀疏向量的计算优化,可以参见博客https://blog.csdn.net/bitcarmanlee/article/details/51213390

对于稀疏矩阵的存储,可以参见博客https://www.cnblogs.com/xbinworld/p/4273506.html 不过应该不用了解的这么深入?

 

ps:github,kaggle社区,阿里云云栖社区,腾讯云云+社区也有很多知识点可以找到。

posted @ 2018-04-22 22:17  大胖子球花  阅读(471)  评论(0)    收藏  举报