一、介绍 在数据处理和特征工程中,经常会遇到类型数据,如性别分为[男,女](暂不考虑其他。。。。),手机运营商分为[移动,联通,电信]等,我们通常将其转为数值带入模型,如[0,1], [-1,0,1]等,但模型往往默认为连续型数值进行处理,这样其实是违背我们最初设计的,也会影响模型效果。
独热编码便是解决这个问题,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。 如自然编码为:0,1 独热编码为:10,01
可以理解为对有m个取值的特征,经过独热编码处理后,转为m个二元特征,每次只有一个激活。
如数字字体识别0~9中,6的独热编码为: 0000001000
二、优点 独热编码的优点为: 1.能够处理非连续型数值特征。
2.在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征。
当然,当特征类别较多时,数据经过独热编码可能会变得过于稀疏。 ·
三、实现 我们可以自己根据实际问题实现独热编码,如0~9数字识别中 # labels 变成one-hot encoding, [2] -> [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # digit 0 , representedas 10 # labels 变成one-hot encoding, [10] -> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] labels =np.array([x[0] for x in labels]) one_hot_labels= [] for numin labels: one_hot= [0.0] * 10 ifnum == 10: one_hot[0]= 1.0 else: one_hot[num]= 1.0 one_hot_labels.append(one_hot)
在sklearn中也有现有的函数可以直接调用:
import numpy as np fromsklearn.preprocessing import OneHotEncoder enc = OneHotEncoder() enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]]) print"enc.n_values_is:",enc.n_values_ print"enc.feature_indices_is:",enc.feature_indices_ print enc.transform([[0, 1, 1]]).toarray()
代码运行结果 enc.n_values_ is: [234] enc.feature_indices_ is:[0259] [[ 1. 0. 0. 1. 0. 0. 1. 0. 0.]]
这里样本有三个维度,第一维有2个取值,第二维有3个取值,第三维有4个取值,也就是enc.n_values_ = [234], 而enc.feature_indices_为维度取值范围累加,则[0, 1, 1]经过编码为: [[ 1. 0. 0. 1. 0. 0. 1. 0. 0.]]
|