如何基于pandas多模型异常检测结果生成统一异常概率得分列
无标注多模型异常检测结果融合实现方案
基础实现:等权投票占比法
无需引入额外工具,直接使用pandas自带方法即可实现,本质是计算每个样本被判定为异常的模型占比,结果可直接对应异常可能性,可解释性极强。
假设你的DataFrame中所有异常检测模型输出列的前缀为model_,可根据实际列名规则调整筛选逻辑,示例代码如下:
import pandas as pd # 筛选所有模型输出列 model_cols = [col for col in df.columns if col.startswith('model_')] # 生成0-1区间的异常得分 df['anomaly_score'] = df[model_cols].mean(axis=1) # 如需百分比格式,可使用以下代码生成0-100的数值 df['anomaly_percent'] = (df[model_cols].mean(axis=1) * 100).round(1)
优化实现:加权投票法
如果已知不同模型在对应业务场景下的可信度差异,可给不同模型配置不同权重计算融合得分,权重可根据先验经验自定义,示例代码如下:
# 权重顺序与model_cols的列顺序对应,权重总和可自行调整 weights = [0.15, 0.25, 0.3, 0.3] df['weighted_anomaly_score'] = df[model_cols].mul(weights, axis=1).sum(axis=1)
高阶实现:无监督集成算法
若需更专业的融合结果,可使用异常检测专用工具库pyod的集成方法,适配不同业务的漏检、误检容忍需求:
from pyod.models.combination import average, maximization, median model_outputs = df[model_cols].values # 平均融合:效果与等权投票法一致 df['avg_ensemble_score'] = average(model_outputs) # 最大化融合:只要有一个模型判定异常就拉高得分,适合对漏检容忍度低的场景 df['max_ensemble_score'] = maximization(model_outputs) # 中位数融合:降低少数极端模型输出的干扰,结果更稳定 df['median_ensemble_score'] = median(model_outputs)
选型建议
- 普通业务场景优先使用等权投票占比法,实现简单、可读性最高
- 有模型效果先验知识的场景使用加权投票法,融合结果更贴合业务需求
- 科研或精度要求极高的场景可选用pyod的集成算法
内容的提问来源于stack exchange,提问作者Kami
相关产品推荐
相关产品推荐

