从标签编码器获取标签映射
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()映射