从 Scikit-learn 中的序数编码获取基数

Getting cardinality from ordinal encoding in Scikit-learn

我正在使用 OrdinalEncoder 在 Scikit-learn 中对分类数据进行编码,我正在寻找一种方法来获取有关编码的详细信息。 IE。每个特征的基数,甚至数字和类别之间的精确映射。

缺少 inverse_transform 方法,我看不到这样做的方法。我想尽可能普遍地这样做,即事先不知道类别。

我知道序号编码的问题(onehot 不适合我)。我也看过 DictVectorizer 但我不确定它是否合适。

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

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)]

现在,这只是 returns 编码的特征,而不是它们的编码。但是,它们的索引本身就是编码。例如,在这种情况下,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}]

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}]