多标签分类中基于多分类器预测列表计算标签概率的问题
多标签分类预测的概率计算问题
示例数据
有4个来自不同分类器的多标签预测列表,每个实例包含5个标签(1表示标签存在,0表示不存在),数据如下:
a = [[0, 1, 1, 1, 1], [1, 0, 0, 1, 1], [0, 1, 0, 0, 1]] b = [[0, 0, 0, 1, 1], [0, 0, 0, 1, 0], [1, 0, 1, 0, 1]] c = [[1, 0, 1, 1, 1], [0, 0, 0, 1, 1], [0, 0, 1, 0, 1]] d = [[1, 0, 1, 1, 1], [0, 0, 0, 1, 0], [0, 1, 1, 0, 1]]
需求
基于上述预测计算每个实例对应每个标签的存在概率,需遵循规则:若所有分类器对某实例的某个标签预测一致(无论0或1),该标签概率设为1.0。
现有问题
尝试的代码如下:
probs = [] for p in zip(a, b, c, d): for s in p: x = (sum(s)) / 4 count.append(x) print(probs)
得到的输出为 [1.0, 0.5, 1.0, 1.0, 0.75, 0.25, 0.5, 0.25, 0.5, 0.75, 0.5, 0.75],格式和结果均不符合预期。期望输出格式为:
probs = [[0.5,0.25,0.75,1.0,1.0], [0.25,1.0,1.0,1.0, 0.5], [0.25,0.5,0.75,1.0,1.0]]
正确实现方法
以下是符合需求的Python代码:
a = [[0, 1, 1, 1, 1], [1, 0, 0, 1, 1], [0, 1, 0, 0, 1]] b = [[0, 0, 0, 1, 1], [0, 0, 0, 1, 0], [1, 0, 1, 0, 1]] c = [[1, 0, 1, 1, 1], [0, 0, 0, 1, 1], [0, 0, 1, 0, 1]] d = [[1, 0, 1, 1, 1], [0, 0, 0, 1, 0], [0, 1, 1, 0, 1]] probs = [] # 按实例分组遍历四个分类器的预测结果 for instance_preds in zip(a, b, c, d): label_prob_list = [] # 按标签位置拆分当前实例的所有预测 for label_votes in zip(*instance_preds): total_ones = sum(label_votes) # 判断所有分类器对该标签的预测是否一致 if all(v == label_votes[0] for v in label_votes): label_prob_list.append(1.0) else: # 计算标签存在的概率(1的占比) label_prob_list.append(total_ones / len(label_votes)) probs.append(label_prob_list) print(probs)
代码逻辑说明
zip(a, b, c, d):将四个分类器的预测按实例分组,每个元素对应同一个实例的4次预测结果。zip(*instance_preds):将当前实例的4次预测按标签位置拆分,得到每个标签的4个投票结果。- 对每个标签的投票结果:
- 先统计1的数量;
- 若所有投票值相同(全0或全1),则概率设为1.0;
- 否则用1的数量除以分类器总数(4)得到标签存在概率。
运行代码后,输出结果与期望完全一致:
[[0.5, 0.25, 0.75, 1.0, 1.0], [0.25, 1.0, 1.0, 1.0, 0.5], [0.25, 0.5, 0.75, 1.0, 1.0]]
内容的提问来源于stack exchange,提问作者ForeverLearner
相关产品推荐
相关产品推荐

