从Scikit学习中的序数编码获取基数

时间:2019-07-23 03:56:33

标签: encoding scikit-learn categorical-data

我正在使用OrdinalEncoder对Scikit学习中的分类数据进行编码,并且正在寻找一种获取有关编码细节的方法。即每个功能的基数,甚至数字和类别之间的精确映射。

inverse_transform方法的简短内容我看不到这样做的方法。我想尽可能地做到这一点,即不事先知道类别。

我知道序数编码的问题(onehot对我来说不是一个选择)。我也看过DictVectorizer,但不确定是否合适。

2 个答案:

答案 0 :(得分:1)

好的,所以我重新创建了官方文档示例

from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder()
X = [['Male', 1], ['Female', 3], ['Female', 2]]
enc.fit(X)

现在,如果要查看编码,只需调用categories_属性,所以在这种情况下:

print(enc.categories_)
#Output: [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]

现在,这仅返回编码的特征,而不返回其编码。但是,它们的索引本身就是编码。例如,在这种情况下,Female被编码为0Male被编码为1,然后前进到下一组功能1编码为02编码为1,依此类推。

因此,如果我想获取FemaleMale的编码:

encoding = enc.categories_
encoding_sex = dict(zip((encoding[0]), range(len(encoding[0]))))
print(encoding_sex)
# Output: {'Female': 0, 'Male': 1}

现在,如果您想针对所有功能概括上述方法并使其快速实现,请执行以下操作:

encoding = enc.categories_
encoding_feature = lambda x: dict(zip(x, range(len(x))))
encoding_full = [encoding_feature(feature_elem) for feature_elem in encoding]
print(encoding_full)
# Output: [{'Female': 0, 'Male': 1}, {1: 0, 2: 1, 3: 2}]

答案 1 :(得分:0)

categories_确实具有inverse_transform所需的映射。您可以查看inverse_transform代码here

也许您正在寻找数字和类别之间的显式词典,然后使用

>>> from sklearn.preprocessing import OrdinalEncoder
>>> enc = OrdinalEncoder()
>>> X = [['Male', 1], ['Female', 3], ['Female', 2]]
>>> enc.fit(X)
... 
OrdinalEncoder(categories='auto', dtype=<... 'numpy.float64'>)

>>> [dict(enumerate(mapping)) for mapping in enc.categories_]
# [{0: 'Female', 1: 'Male'}, {0: 1, 1: 2, 2: 3}]