【问题标题】: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 字典?

【问题讨论】:

    标签: python python-3.x machine-learning scikit-learn


    【解决方案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}
      

      【讨论】:

        猜你喜欢
        • 2018-12-04
        • 2021-08-28
        • 2017-06-30
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 2021-09-03
        • 1970-01-01
        相关资源
        最近更新 更多