从 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
被编码为 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}]
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}]
我正在使用 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
被编码为 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}]
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}]