如何获取基于概率排序的MultiLabelBinarizer逆变换标签列表?
解决多标签分类中基于概率排序标签的问题
要实现按概率从高到低排序标签(不受0.5阈值限制),核心是把模型输出的类别概率和标签名称对应后排序,具体步骤和代码如下:
关键思路
- 拿到模型输出的每个类别独立概率(多标签分类模型最后一层建议用sigmoid激活,输出每个类别的0-1概率,而非softmax)
- 通过
MultiLabelBinarizer的classes_属性,获取概率矩阵列对应的类别名称顺序 - 对每个样本的概率与类别配对,按概率降序排序后提取标签列表
代码示例
from sklearn.preprocessing import MultiLabelBinarizer import numpy as np # 1. 初始化并拟合MultiLabelBinarizer raw_labels = [["cat", "dog"], ["bird"], ["cat", "bird", "fish"]] mlb = MultiLabelBinarizer() mlb.fit(raw_labels) # 查看类别与概率矩阵列的对应关系 print("类别顺序(对应概率矩阵列):", mlb.classes_) # 2. 模拟模型输出的概率矩阵(每行=1个样本,每列=对应类别的概率) pred_probs = np.array([ [0.3, 0.6, 0.7, 0.2], # 样本1:dog概率最高,其次cat [0.8, 0.1, 0.05, 0.01], # 样本2:bird概率远高于其他 [0.4, 0.55, 0.3, 0.45] # 样本3:cat > fish > bird > dog ]) # 3. 生成每个样本的概率排序标签列表 sorted_label_results = [] for sample_probs in pred_probs: # 配对类别与概率 class_prob_pairs = list(zip(mlb.classes_, sample_probs)) # 按概率降序排序 sorted_pairs = sorted(class_prob_pairs, key=lambda x: x[1], reverse=True) # 提取排序后的标签 sorted_labels = [pair[0] for pair in sorted_pairs] sorted_label_results.append(sorted_labels) # 输出结果 for i, labels in enumerate(sorted_label_results): print(f"样本{i+1}排序后标签: {labels}")
输出结果
类别顺序(对应概率矩阵列): ['bird' 'cat' 'dog' 'fish'] 样本1排序后标签: ['dog', 'cat', 'bird', 'fish'] 样本2排序后标签: ['bird', 'cat', 'dog', 'fish'] 样本3排序后标签: ['cat', 'fish', 'bird', 'dog']
补充说明
- 如果需要保留概率高于某阈值的标签(比如可选保留>0.2的),可以在提取时加过滤:
sorted_labels = [pair[0] for pair in sorted_pairs if pair[1] > 0.2] - 确保模型输出的是每个类别的独立概率:多标签分类任务中,模型最后一层用
sigmoid激活,而不是softmax(softmax会让概率和为1,适合单标签互斥场景)
内容的提问来源于stack exchange,提问作者sveer
相关产品推荐
相关产品推荐

