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

Posted

技术标签:

【中文标题】从标签编码器获取标签映射【英文标题】:Get the label mappings from label encoder 【发布时间】:2018-11-22 21:26:30 【问题描述】:

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

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

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

即我需要这样的东西:

integerMapping = GetIntegerMapping(labelEncoder)

在哪里

integerMapping["blue"]

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

integerMapping["green"]

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

我怎样才能得到 integerMapping 字典?

【问题讨论】:

【参考方案1】:

您可以使用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

示例用法:

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

integerMapping['blue']  # Returns 0
integerMapping['green']  # Returns 1

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

更新:

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

%timeit get_integer_mapping(le)
1 loop, best of 3: 17.1 s per loop

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

【讨论】:

是的,对不起。 le 是 LabelEncoder 实例。我更新了答案和文档字符串。 我只是添加了示例用法来澄清。【参考方案2】:

一旦安装了标签编码器,就会有一个classes_ 属性。用于替换标签值的整数是该数组中标签的索引。所以你可以得到映射:

le = LabelEncoder()
le.fit(targets)
integer_mapping = l: i for i, l in enumerate(le.classes_)

【讨论】:

【参考方案3】:

您可以制作一个映射目标和编码整数的字典

integerMapping=dict(zip(targets,integerEncoded))

【讨论】:

以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review。【参考方案4】:

这是一个简单的答案:

# helper function to get the mapping between original label and encoded label
def get_label_map(df:pd.DataFrame, label:str):
    """get the mapping between original label and its encoded value
    df: a pandas dataframe with both feature variables and target variable
    label: the name of target variable
    Example:
      df0 = pd.DataFrame('fea1':[1,2,3,4], 'fea2':['a','b','b','c'], 'target':['cat', 'cat','dog','cat'])
      label = 'target'
      label_map = get_label_map(df=df0, label='target')
    """
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder() # init label encoder
    y_le = le.fit_transform(df[[label]]) # encode target variable
    label_map = dict(zip(df[label], y_le)) # get the mapping between the original labels and encoded labels
    return label_map
    Example:
      df0 = pd.DataFrame('fea1':[1,2,3,4], 'fea2':['a','b','b','c'], 'target':['cat', 'cat','dog','monkey'])

      label_map = get_label_map(df=df0, label='target') # 'cat': 0, 'dog': 1, 'monkey': 2

【讨论】:

以上是关于从标签编码器获取标签映射的主要内容,如果未能解决你的问题,请参考以下文章

反向标签编码给出错误

在fit_transform之后获取sklearn.LabelEncoder()映射

iOS 中 ID3 标签的正确编码

SciKit-Learn 标签编码器导致错误“参数必须是字符串或数字”

eclipse编码方式标签语言获取根目录

公司数据库编码规范