独热编码(One-Hot Encoding)介绍及实现

一、介绍

在数据处理和特征工程中,经常会遇到类型数据,如性别分为[男,女](暂不考虑其他。。。。),手机运营商分为[移动,联通,电信]等,我们通常将其转为数值带入模型,如[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.]]

猜你喜欢

转载自blog.csdn.net/qq_26591517/article/details/80600374