Pandas按频次与置信度规则生成集成分类最终标签
Pandas 多规则集成标签最终结果生成方案
pd.mode()、pd.nunique() 仅能实现简单的频次统计,无法覆盖你需要的「频次优先、双高频比置信度总和、多高频取最大置信度」的多级判定规则,逐行自定义规则处理是最直接可靠的实现方式。
实现逻辑
逐行处理时按以下优先级判定:
- 首先提取每行所有成对的标签、置信度数据,统计每个标签的出现次数、置信度总和,同时记录整行最大置信度对应的标签
- 筛选出所有出现次数等于最高频次的候选标签集合
- 若候选标签仅1个,直接返回该标签
- 若候选标签共2个,比较二者的置信度总和,返回总和更大的标签,平局时取遍历到的第一个
- 若候选标签数量≥3,直接返回整行中最大置信度对应的标签,平局时取遍历到的第一个
完整代码
import pandas as pd def calc_final_label(row, label_num=4): """ 逐行计算最终标签 :param label_num: 单条样本包含的模型预测结果组数,默认对应Label1~Label4、Conf1~Conf4 """ label_stat = dict() max_conf_val = -1 max_conf_label = None # 遍历当前行所有预测结果 for idx in range(1, label_num+1): curr_label = row[f"Label{idx}"] curr_conf = row[f"Conf{idx}"] # 统计标签频次、置信度总和 if curr_label not in label_stat: label_stat[curr_label] = {"cnt": 0, "conf_sum": 0} label_stat[curr_label]["cnt"] += 1 label_stat[curr_label]["conf_sum"] += curr_conf # 记录全局最大置信度对应标签 if curr_conf > max_conf_val: max_conf_val = curr_conf max_conf_label = curr_label # 筛选最高频候选标签 max_freq = max(v["cnt"] for v in label_stat.values()) top_candidates = [l for l, stat in label_stat.items() if stat["cnt"] == max_freq] # 按规则返回结果 if len(top_candidates) == 1: return top_candidates[0] elif len(top_candidates) == 2: l1, l2 = top_candidates return l1 if label_stat[l1]["conf_sum"] >= label_stat[l2]["conf_sum"] else l2 else: return max_conf_label # 加载示例数据 df = pd.DataFrame({ "Label1":["Class1", "Class2", "Class1", "Class4"], "Conf1":[0.9,0.8,0.7,0.6], "Label2":["Class2", "Class2", "Class2", "Class4"], "Conf2":[0.8,0.2,0.5,0.2], "Label3":["Class2", "Class2", "Class3", "Class3"], "Conf3":[0.8,0.5,0.9,0.4], "Label4":["Class2", "Class2", "Class4", "Class3"], "Conf4":[0.8,0.5,0.8,0.2] }) # 生成最终标签列 df["Label_Final"] = df.apply(calc_final_label, axis=1)
结果校验
运行上述代码后,输出的Label_Final列与示例预期完全匹配:
| 行号 | Label_Final | 判定依据 |
|---|---|---|
| 0 | Class2 | Class2出现3次,为唯一最高频标签 |
| 1 | Class2 | Class2出现4次,为唯一最高频标签 |
| 2 | Class3 | 4个标签各出现1次,最大置信度0.9对应Class3 |
| 3 | Class4 | Class3、Class4各出现2次并列最高频,Class4置信度总和0.8大于Class3的0.6 |
如果你的预测组数不是4组,只需要修改calc_final_label函数的label_num参数即可适配。
内容的提问来源于stack exchange,提问作者Marco_CH
相关产品推荐
相关产品推荐

