数据处理方法--OneHotEncoder独热编码

一般过程

对于独热编码的过程,我们可以通过pd.get_dummies函数实现,也可以通过sklearn中OneHotEncoder评估器(转化器)来实现。数据处理方法--OneHotEncoder独热编码_第1张图片
代码实现基本过程:

from sklearn import preprocessing

# 和所有的sklearn中转化器使用过程类似,需要先训练、后使用:
X1 = np.array([['F'], ['M'], ['M'], ['F']])

# 实例化转化器
enc = preprocessing.OneHotEncoder()

enc.fit_transform(X1).toarray()
# 训练结果
# array([[1., 0.],
#        [0., 1.],
#        [0., 1.],
#        [1., 0.]])

drop='if_binary’过程

对于独热编码的使用,有一点是额外需要注意的,那就是对于二分类离散变量来说,独热编码往往是没有实际作用的。例如对于上述极简数据集而言,Gender的取值是能是M或者F,独热编码转化后,某行Gender_F取值为1、则Gender_M取值必然为0,反之亦然。因此很多时候我们在进行独热编码转化的时候会考虑只对多分类离散变量进行转化,而保留二分类离散变量的原始取值。此时就需要将OneHotEncoder中drop参数调整为’if_binary’,以表示跳过二分类离散变量列。
  
只对多分类离散变量进行独热编码转化过程如下:
数据处理方法--OneHotEncoder独热编码_第2张图片
代码实现过程:

from sklearn import preprocessing

# 设置初始数据
X3 = pd.DataFrame({'Gender': ['F', 'M', 'M', 'F'], 'Income': ['High', 'Medium', 'High', 'Low']})

drop_enc = preprocessing.OneHotEncoder(drop='if_binary')

drop_enc.fit_transform(X3).toarray()
# 运行结果
# array([[0., 1., 0., 0.],
#        [1., 0., 0., 1.],
#        [1., 1., 0., 0.],
#        [0., 0., 1., 0.]])

不过需要注意的是,对于sklearn的独热编码转化器来说,尽管其使用过程会更加方便,但却无法自动创建转化后的列名称,而在需要考察字段业务背景含义的场景中,必然需要知道每一列的实际名称(就类似于极简示例中每一列的名字,通过“原列名_字段取值”来进行命名),因此我们需要定义一个函数来批量创建独热编码后新数据集各字段名称的函数。首先我们先尝试围绕上述极简数据集来提取(创建)独热编码后新数据集的字段名称:

# 提取原始列名称
cate_cols = X3.columns.tolist()

# 新编码字段名称存储
cate_cols_new = []

# 提取独热编码后所有特征的名称
for i, j in enumerate(cate_cols):
    if len(drop_enc.categories_[i]) == 2:
        cate_cols_new.append(j)
    else:
        for f in drop_enc.categories_[i]:
            feature_name = j + '_' + f
            cate_cols_new.append(feature_name)

# 查看新字段名称提取结果
cate_cols_new
# ['Gender', 'Income_High', 'Income_Low', 'Income_Medium']

# 组合成新的DataFrame
pd.DataFrame(drop_enc.fit_transform(X3).toarray(), columns=cate_cols_new)

数据处理方法--OneHotEncoder独热编码_第3张图片

你可能感兴趣的:(python,机器学习,开发语言)