如何统计分类器预测1的次数并通过多数投票获取预测标签
实现方案
首先你的原始预测嵌套列表如下,注意实际编码时不建议用List作为变量名,会覆盖Python内置的列表类型,下文统一用preds指代该数据集:
preds = [[0,1,1,0],[1,1,1,0],[0,0,1,1]]
1. 统计指定实例预测为1的总次数
嵌套列表中每个子列表对应当前分类器对所有实例的预测结果,相同索引位置代表同一个实例的预测值。统计指定索引位置的1的次数,直接遍历所有分类器的对应位置求和即可,因为标签是0/1数值,求和结果就是1的出现次数。
示例:统计索引为1的第二个实例的1的预测次数
instance_index = 1 count_1 = sum(clf_pred[instance_index] for clf_pred in preds) print(count_1) # 输出:2,对应三个分类器在该位置的预测值为1、1、0,求和结果即为1的计数
如果需要一次性获取所有实例的1的预测次数,可以用zip(*preds)将列表转置,按位置分组后批量求和:
all_instance_count1 = [sum(pos_predictions) for pos_predictions in zip(*preds)] print(all_instance_count1) # 输出:[1, 2, 3, 1],依次对应4个实例被预测为1的总次数
2. 多数投票生成最终预测列表
你需要的结果是每个位置取获得半数以上分类器支持的标签,属于最基础的硬投票逻辑。因为总共有3个分类器,只要某个位置1的计数≥2(超过半数)就取1,否则取0即可,基于上一步得到的各位置1的计数,直接做阈值判断就能得到结果:
clf_total = len(preds) # 多数阈值为分类器总数的半数以上,3个分类器对应阈值为2 majority_thresh = clf_total // 2 + 1 final_result = [1 if cnt >= majority_thresh else 0 for cnt in all_instance_count1] print(final_result) # 输出:[0, 1, 1, 0],和你预期的List1完全一致
补充说明:如果分类器总数为偶数出现平票情况,可以根据业务需求调整平票时的取值规则,比如平票默认取1、取0或者引入额外判定逻辑,上述代码默认平票场景取0。
内容的提问来源于stack exchange,提问作者Tania_hussain
相关产品推荐
相关产品推荐

