最近在参与职业生涯的第一个机器学习算法大赛(腾讯广告算法大赛),在和队友们学习大神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社区,阿里云云栖社区,腾讯云云+社区也有很多知识点可以找到。