使用MultiLabelBinarizer解码时输出顺序错误的技术咨询
解决MultiLabelBinarizer解码后标签顺序不符的问题
我太懂你这个困扰了!之前用MultiLabelBinarizer的时候也踩过这个顺序的坑,咱们来一步步捋清楚:
问题根源
MultiLabelBinarizer默认会把所有标签按字典序排序后存到它的classes_属性里,不管你输入时的顺序是什么样的。解码的时候,它是按照这个排序后的classes数组来还原标签的,所以自然和你原始输入的顺序对不上。就像你举的官网例子,输入的['sci-fi', 'thriller', 'comedy']会被按字典序排为['comedy','sci-fi','thriller'],解码后自然就用这个顺序输出了。
解决方案
想要保留原始输入的标签顺序,有两种常用的办法:
1. 提前指定标签顺序(适合已知所有标签的场景)
如果你能提前知道所有可能出现的标签,直接在初始化MultiLabelBinarizer的时候用classes参数指定你想要的顺序就行,这样它就不会自动排序了。比如针对你给的官网示例:
from sklearn.preprocessing import MultiLabelBinarizer # 直接指定和原始输入一致的标签顺序 mlb = MultiLabelBinarizer(classes=['sci-fi', 'thriller', 'comedy']) encoded = mlb.fit_transform([['sci-fi', 'thriller', 'comedy']]) print(mlb.inverse_transform(encoded)) # 输出结果:[('sci-fi', 'thriller', 'comedy')]
2. 动态收集原始顺序的标签(适合未知所有标签的场景)
如果你的标签是动态生成的,没办法提前列全所有可能的标签,可以先遍历所有样本,收集所有唯一标签,并且保留它们第一次出现的顺序,再把这个顺序传给classes参数。比如处理你给出的DataFrame(修正了疑似打错的列名):
from sklearn.preprocessing import MultiLabelBinarizer import pandas as pd # 构造你的数据集 df = pd.DataFrame({ 'col1': ['Anton', 'Leila', 'Arjun'], 'col2': [230, 890, 688], 'col3': ['DR', 'DR', 'ENG'] }) # 假设每行的标签是col1和col3组成的列表(可根据你的实际需求调整) samples = df.apply(lambda row: [row['col1'], row['col3']], axis=1).tolist() # 收集所有唯一标签,保留首次出现的顺序 unique_labels = [] seen_labels = set() for sample in samples: for label in sample: if label not in seen_labels: seen_labels.add(label) unique_labels.append(label) # 用这个原始顺序初始化编码器 mlb = MultiLabelBinarizer(classes=unique_labels) encoded = mlb.fit_transform(samples) # 解码后就能得到和原始输入一致的顺序 decoded_samples = mlb.inverse_transform(encoded) print(decoded_samples)
这样处理后,解码出来的标签顺序就和你输入时的顺序完全一致啦~
内容的提问来源于stack exchange,提问作者Pro
相关产品推荐
相关产品推荐

