x3 = pd.DataFrame({'Gender': ['F', 'M', 'M', 'F'], 'Income': ['High', 'Medium', 'High', 'Low']})
x3
- drop='if_binary’参数
from sklearn import preprocessing
drop_enc = preprocessing.OneHotEncoder(drop='if_binary') # 跳过二分类离散变量
drop_enc.fit_transform(x3).toarray()
drop_enc.categories_
不过需要注意的是,对于sklearn的独热编码转化器来说,尽管其使用过程会更加方便,但却无法自动创建转化后的列名称
- 功能实现
def cate_colName(Transformer, category_cols, drop='if_binary'):
"""
离散字段独热编码后字段名创建函数
:param Transformer: 独热编码转化器
:param category_cols: 输入转化器的离散变量
:param drop: 独热编码转化器的drop参数
"""
cate_cols_new = []
col_value = Transformer.categories_
for i, j in enumerate(category_cols):
# 判断这一列的取值是不是两个
# 参数if_binary 不需要两个分类变量设置的
if (drop == 'if_binary') & (len(col_value[i]) == 2):
cate_cols_new.append(j)
else:
for f in col_value[i]:
feature_name = j + '_' + f
cate_cols_new.append(feature_name)
return(cate_cols_new)
cate_colName(drop_enc, cate_cols)
[‘Gender’, ‘Income_High’, ‘Income_Low’, ‘Income_Medium’]
pd.DataFrame(drop_enc.fit_transform(x3).toarray(),columns=cate_colName(drop_enc, cate_cols))
- 参数if_binary
对于独热编码的使用,有一点是额外需要注意的,那就是对于二分类离散变量来说,独热编码往往是没有实际作用的。例如对于上述极简数据集而言,Gender的取值是能是M或者F,独热编码转化后,某行Gender_F取值为1、则Gender_M取值必然为0,反之亦然。
因此很多时候我们在进行独热编码转化的时候会考虑只对多分类离散变量进行转化,而保留二分类离散变量的原始取值。
此时就需要将OneHotEncoder中drop参数调整为’if_binary’,以表示跳过二分类离散变量列。