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

Encoding 从Scikit学习中的顺序编码获取基数,encoding,scikit-learn,categorical-data,Encoding,Scikit Learn,Categorical Data,我正在使用OrdinalEncoder对Scikit learn中的分类数据进行编码,我正在寻找一种方法来获取编码的详细信息。即每个特征的基数,甚至是数字和类别之间的精确映射 除了逆变换方法,我看不出有什么方法可以做到这一点。我希望尽可能地做到这一点,即在事先不知道类别的情况下 我知道顺序编码的问题(onehot不是我的选择)。我也看过DictVectorizer,但我不确定它是否合适。好的,所以我重新创建了官方文档示例 from sklearn.preprocessing import Ord

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

除了
逆变换
方法,我看不出有什么方法可以做到这一点。我希望尽可能地做到这一点,即在事先不知道类别的情况下


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

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

from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder()
X = [['Male', 1], ['Female', 3], ['Female', 2]]
enc.fit(X)
现在,如果您想查看编码,只需调用
categories\uu
属性,因此在本例中:

print(enc.categories_)
#Output: [array(['Female', 'Male'], dtype=object), array([1, 2, 3], dtype=object)]
现在,这只返回编码的特征,而不是它们的编码。然而,它们的索引本身就是编码。例如,在这种情况下,
女性
被编码为
0
男性
被编码为
1
,然后向前移动到下一组特征,
1
被编码为
0
2
被编码为
1
,依此类推

所以,如果我想得到
女性
男性
的编码:

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\u
具有映射,这是
逆变换所需的映射。您可以查看
逆变换
代码

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

>>> 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}]
来自sklearn.preprocessing导入序号编码器的
>>
>>>enc=普通编码器()
>>>X=[['男性',1],'女性',3],'女性',2]]
>>>附件尺寸(X)
... 
序号编码器(categories='auto',dtype=)
>>>[dict(枚举(映射))用于在enc.categories_u2;中映射]
#[{0:'女性',1:'男性'},{0:1,1:2,2:3}]

我认为您在这里误用了基数这个词。基数意味着一个特定对象的计数。可以举一些例子来解释你想要达到的目标,这正是我想要的,谢谢。事实证明,我遇到问题的原因是我使用列转换器只对少数列应用编码。当我查询属性时,我一直得到“OrdinalCoder”对象没有属性“categories”
。让我知道这是否属于一个单独的问题。@robtherobot101是的,我认为这确实需要一个单独的问题,包括您正在使用的代码,以及完整的堆栈跟踪(如果可能的话),因为如果不看代码,我无法准确地说出解决方案:-)我很乐意帮助您回答这个新问题。如果你觉得这个答案有用,你能投票并把它标为正确答案吗?