sklearn.preprocessing.OneHotEncoder

1.概要

sklearn.preprocessing.OneHotEncoder将类别变量、顺序变量转化为二值化的标志变量

 

2. 解析

格式:

OneHotEncoder(n_values=’auto’,  categorical_features=’all’,  dtype=<class ‘numpy.float64’>,  sparse=True,  handle_unknown=’error’)

实例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]]).toarray()  # 如果不加 toarray() 的话,输出的是稀疏的存储格式,即索引加值的形式,也可以通过参数指定 sparse = False 来达到同样的效果
print(ans) 


#
输出 [[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]

对于输入数组,每一行当做一个样本,每一列当做一个特征。

第一个特征,即第一列[0,1,0,1],也就是说它有两个取值0或者1,那么one-hot就会使用两位来表示这个特征,[1,0]表示0,[0,1]表示1。在上例的输出结果中[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]前两位表示该特征为0。

第二个特征,第二列[0,1,2,0],它有三种值,那么one-hot就会使用三位来表示这个特征,[1,0,0]表示0,[0,1,0]表示1,[0,0,1]表示2,在上例输出结果中[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]的第三位到第五位表示该特征为1。

第三个特征,第三例[3,0,1,2],它有四种值,那么one-hot就会使用四位来表示这个特征,[1,0,0,0]表示为0,[0,1,0,0]表示为1,[0,0,1,0]表示为2,[0,0,0,1]表示为3,在上例输出结果中[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]的最后四位表示该特征为3。

 

注意:虽然训练样本中的数值仅仅代表类别,但是也必须使用数值格式的数据,如果使用字符串格式的数据会报错。

参数:

n_values='auto'表示每个特征使用几维,由数据集自动推断,即几种类别就使用几位来表示

也可以自己指定。举例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(n_values = [2, 3, 4])   # 第一个特征:2维;第二个特征:3维;第三个特征:4维
enc.fit([[0, 0, 3],
         [1, 1, 0]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans)


# 输出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]

注意到训练样本中第二个特征列没有类别2,但是结果依然将类别2给编码了出来,这就是自己指定维数的作用(我们使用3位来表示第二个特征,自然包括了类别2),第三列特征同样如此。

这也告诫我们,如果训练样本中有丢失的分类特征值,我们就必须显示的设置参数n_value了,这样防止编码出错。

categorical_features='all':这个参数指定对哪些特征进行编码,默认对所有类别都进行编码。

也可以自己指定选择哪些特征,通过索引或者bool值来指定。举例:

from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder(categorical_features = [0,2]) # 等价于 [True, False, True]
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 输出 [[ 1. 0. 0. 0. 0. 1. 2.]]

输出结果中前两位[1,0]表示0,中间四位[0,0,0,1]表示对第三个特征3编码,第二个特征2没有进行编码,就放在最后一位。

dtype=<class 'numpy.float64'>:表示编码数值格式,默认为浮点型。

sparse=True:表示编码的格式,默认为True,稀疏的格式,指定False就不用toarray()了。

handle_unknown='error':其值可以为‘error’或'ignore',即如果碰到未知的类别,是返回一个错误还是忽略。

 

3. 热编码的意义

独热编码又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。

可以理解为对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征。并且,这些特征互斥,每次只有一个激活。因此,数据会变成稀疏的。

 

① 为什么进行 OneHotEncoding 编码:

  1. 许多机器学习算法不能直接操作类别变量,这些算法要求输入输出变量都是数值。
  2. 整数编码可以将类别变量转换为数值,但会让类别间存在次序关系
  3. 将类别变量转换为数值,可以提高计算效率。

② 进行 OneHotEncoding 的优点:

  1. 解决了分类器不好处理分类特征数据的问题。
  2. 在一定程度上也起到了扩充特征的作用

 

4. 自写代码实现OneHotEncoder

def to_categorical(x, n_col=None):
    if not n_col:
        n_col = np.amax(x) + 1
    one_hot = np.zeros((x.shape[0], n_col))
    print(one_hot)
    # one_hot[[0, 1], [1, 2]] = 5
    one_hot[np.arange(x.shape[0]), x] = 1
    return one_hot

x = np.array([[1, 2],
              [3, 4]])
print(to_categorical(x)

输出:

[[0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]
[[0. 1. 0. 1. 0.]
 [0. 0. 1. 0. 1.]]

 

 

来自:https://www.cnblogs.com/zhoukui/p/9159909.html

posted @ 2021-05-17 17:42  做梦当财神  阅读(1291)  评论(0编辑  收藏  举报