从标签编码器获取标签映射

use*_*212 3 python machine-learning python-3.x scikit-learn

我使用以下代码将字符串标签列表映射到单热编码值列表:

from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder  
labelEncoder = LabelEncoder()
targets = ["blue","green","blue","blue","green"]    
integerEncoded = labelEncoder.fit_transform(targets)
Run Code Online (Sandbox Code Playgroud)

在稍后的阶段,我需要确切地知道哪些字符串标签映射到哪些整数值。

即我需要这样的东西:

integerMapping = GetIntegerMapping(labelEncoder)
Run Code Online (Sandbox Code Playgroud)

在哪里

integerMapping["blue"]
Run Code Online (Sandbox Code Playgroud)

应该返回所有“蓝色”标签映射到的 int 值

integerMapping["green"]
Run Code Online (Sandbox Code Playgroud)

应该返回所有“绿色”标签映射到的 int 值。

我怎样才能得到那个integerMapping字典?

gaw*_*w89 6

您可以使用LabelEncoder.classes_LabelEncoder.transform()来获得您所要求的关系。下面的函数应该给你你所需要的。

def get_integer_mapping(le):
    '''
    Return a dict mapping labels to their integer values
    from an SKlearn LabelEncoder
    le = a fitted SKlearn LabelEncoder
    '''
    res = {}
    for cl in le.classes_:
        res.update({cl:le.transform([cl])[0]})

    return res
Run Code Online (Sandbox Code Playgroud)

示例用法:

classes = ['blue', 'green']
le = LabelEncoder()
le.fit(classes)
integerMapping = get_integer_mapping(le)

integerMapping['blue']  # Returns 0
integerMapping['green']  # Returns 1
Run Code Online (Sandbox Code Playgroud)

如果您有大量的类,由于for循环,这可能不会非常快,但它应该适用于少数类。

更新:

刚刚在适合 10,000 个类的 LabelEncoder 上对其进行计时。结果如下:

%timeit get_integer_mapping(le)
1 loop, best of 3: 17.1 s per loop
Run Code Online (Sandbox Code Playgroud)

它的性能实际上比我预期的要好。