在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。那什么是特征数字化呢?例子如下:
??? 性别特征:["男","女"] =>[0,1]
??? 祖国特征:["中国","美国,"法国"] =>[0,1,2]
??? 运动特征:["足球","篮球","羽毛球","乒乓球"] =>[0,1,2,3]
假如某个样本,它的特征是这样的["男","中国","乒乓球"],我们可以用 [0,0,3] 来表示,但是这样的特征处理并不能直接放入机器学习算法中,因为类别之间是无序的。
独热编码是指将离散型的特征数据映射到一个高维空间中,每个可能的取值都对应于高维空间的一个点,在这些点上取值为1,其余均为0,因此独热编码也被称为“一位有效编码”或“One-of-K encoding”。
回到一开始的例子,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理:
??? 性别特征:["男","女"](这里N=2 二维数据)
??? 男 => 10
??? 女 => 01
??? 地区特征:["北京","上海,"深圳"](这里N=3,三维数据):
??? 北京 => 100
??? 上海 => 010
??? 深圳 => 001
??? 工作特征:["演员","厨师","公务员","工程师","律师"](这里N=5,五维数据):
??? 演员 => 10000
??? 老师 => 01000
??? 公务员 => 00100
??? 工程师 => 00010
??? 消防员 => 00001
?
独热编码的优点有以下几个:
当然,独热编码也存在一些缺点:
高维度特征会带来以下几个方面问题:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #这里一共有4个数据,3种特征
array = enc.transform([[0,1,3]]).toarray() #这里使用一个新的数据来测试
print array # [[ 1 0 0 1 0 0 0 0 1]]
参考: