You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将SHAP值的大小作为异常值检测的阈值来过滤异常样本?

方案可行性说明

这个方案是可执行的。SHAP值反映的是单个特征对每个样本的孤立森林异常得分的贡献大小,针对特定特征设置SHAP阈值筛选样本的本质,是优先剔除「某几个指定特征的异常贡献占比足够高」的样本,相比直接用孤立森林整体异常得分剔除所有异常样本的方案,针对性更强,适合需要聚焦某几类特征异常场景的需求。
执行时需要注意几个核心前提:

  • SHAP值的尺度随特征不同存在差异,必须给每个特征单独设置阈值,不能所有特征共用同一个阈值
  • 不建议拍脑袋设置固定阈值,优先参考对应特征SHAP值的分布设置分位数阈值,比如取99分位数作为上限,筛选贡献最高的1%样本
  • 剔除前建议抽验阈值附近的样本,结合业务逻辑判断是否确实属于需要剔除的范围,避免误删正常样本
  • 如果仅需要剔除模型判定的异常样本,建议先筛选出孤立森林标记为异常的样本(模型输出为-1),再在异常样本范围内按SHAP阈值筛选,降低误删概率
Python实现代码

默认你已经完成孤立森林模型训练,特征数据集为pandas DataFrame格式,实现代码如下:

import pandas as pd
import shap
from sklearn.ensemble import IsolationForest

# --------------- 前置步骤(已完成可直接跳过)---------------
# X为你的特征数据集,75000行*60列,pandas DataFrame格式
# 训练孤立森林
iforest = IsolationForest(n_estimators=100, random_state=42)
iforest.fit(X)

# 计算SHAP值,转成DataFrame方便按特征筛选
explainer = shap.TreeExplainer(iforest)
shap_values = explainer.shap_values(X)
shap_df = pd.DataFrame(shap_values, columns=X.columns)

# --------------- 按SHAP阈值筛选待剔除样本 ---------------
# 示例1:针对单个特征设置分位数阈值
target_col = "你要指定的特征名"
# 取该特征SHAP值的99分位数作为阈值,也可以手动替换为固定阈值比如threshold=0.8
threshold = shap_df[target_col].quantile(0.99)
# 筛选符合剔除条件的样本索引,这里用大于阈值的条件,也可以根据需求改成小于
drop_idx = shap_df[shap_df[target_col] > threshold].index

# 示例2:同时设置多个特征的阈值条件
# drop_idx = shap_df[
#     (shap_df["特征A"] > shap_df["特征A"].quantile(0.99)) | 
#     (shap_df["特征B"] < shap_df["特征B"].quantile(0.01))
# ].index

# 示例3:仅在模型判定的异常样本中按SHAP阈值筛选
# anomaly_idx = X[iforest.predict(X) == -1].index
# drop_idx = shap_df.loc[anomaly_idx][shap_df.loc[anomaly_idx][target_col] > threshold].index

# --------------- 生成剔除后的数据集 ---------------
X_clean = X.drop(drop_idx, axis=0)
print(f"原始样本量:{len(X)},剔除样本量:{len(drop_idx)},剩余样本量:{len(X_clean)}")

如果需要辅助确定阈值,可以先查看对应特征的SHAP值分布:

# 查看分位数统计
print(shap_df[target_col].describe())
# 绘制分布直方图
shap_df[target_col].hist(bins=50)

内容的提问来源于stack exchange,提问作者Kath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:03:00