我正在使用OrdinalEncoder
对Scikit学习中的分类数据进行编码,并且正在寻找一种获取有关编码细节的方法。即每个功能的基数,甚至数字和类别之间的精确映射。
inverse_transform
方法的简短内容我看不到这样做的方法。我想尽可能地做到这一点,即不事先知道类别。
我知道序数编码的问题(onehot对我来说不是一个选择)。我也看过DictVectorizer,但不确定是否合适。
答案 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
被编码为0
,Male
被编码为1
,然后前进到下一组功能1
编码为0
,2
编码为1
,依此类推。
因此,如果我想获取Female
和Male
的编码:
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}]