离群点检测中如何确定应当移除的输入特征
基于SHAP值筛选待移除对象的落地方案
以下方案分「移除无效输入特征」和「移除真实异常样本」两种场景,你可以根据自己的实际需求选择:
场景1:筛选需要移除的输入特征
核心逻辑是通过SHAP值量化每个特征对异常判定的贡献度,去掉贡献极低、对结果无影响的特征:
- 先计算全局特征重要性:对所有异常样本的每个特征SHAP值取绝对值的均值,得到每个特征对异常判定的全局贡献度,把贡献度排名靠后、累计贡献占比不足5%的特征列为待移除候选。
- 做稳定性校验:把数据集随机分成3份,分别跑孤立森林+SHAP计算,只保留3次实验里都排在贡献度后20%的特征执行移除,避免单次训练的波动影响筛选结果。
- 阈值判定技巧:用肘点法确定移除阈值,把特征按SHAP绝对值均值从高到低排序,绘制累计贡献曲线,曲线拐弯点之前的特征保留,之后的移除。比如你共60个特征,可能前15个就占了90%的贡献,剩下的45个都可以直接移除。
场景2:筛选需要移除的异常样本
核心逻辑是通过SHAP值区分「真实异常」和「模型误判的离群点」,只移除真实无效的异常样本:
- 单样本SHAP总和阈值过滤:对每个被孤立森林判定为异常的样本,计算它所有特征SHAP值的绝对值之和,如果总和低于所有异常样本SHAP总和的25%分位,说明这个样本被判定为异常是大量低贡献特征的微小波动共同导致的,大概率是误判,不需要移除;只有总和高于阈值的才是真实异常,列入待移除列表。
- 关键特征贡献判定:如果有业务上的核心特征,只要某个异常样本的核心特征SHAP值占比超过总贡献的60%,说明异常是核心特征异常导致的,不管总得分多少都直接移除;如果没有业务规则,就用全局top5贡献特征,只要异常样本的top5特征SHAP贡献占比低于30%,就判定为误判,予以保留。
- 附加校验逻辑:把筛选出来要移除的异常样本放回原始数据集,用箱线图查看这些样本在top3 SHAP特征上的分布,如果确实在1.5倍IQR之外,再执行移除,避免SHAP计算的误差。
简化版代码示例
import shap import numpy as np import pandas as pd from sklearn.ensemble import IsolationForest # 假设特征矩阵X是维度为(75000, 60)的DataFrame,已经完成预处理 iforest = IsolationForest(random_state=42) iforest.fit(X) # 计算SHAP值 explainer = shap.TreeExplainer(iforest) shap_values = explainer.shap_values(X) # ------------------- 特征筛选示例 ------------------- # 计算每个特征的全局SHAP重要性 feature_importance = np.mean(np.abs(shap_values), axis=0) # 按重要性从高到低排序 sorted_idx = np.argsort(feature_importance)[::-1] # 计算累计贡献占比,保留累计贡献到95%的特征 cum_importance = np.cumsum(feature_importance[sorted_idx]) / np.sum(feature_importance) keep_feature_num = np.argmax(cum_importance >= 0.95) + 1 keep_features = X.columns[sorted_idx[:keep_feature_num]] X_filtered = X[keep_features] # ------------------- 异常样本筛选示例 ------------------- # 拿到孤立森林判定的异常样本索引 anomaly_idx = np.where(iforest.predict(X) == -1)[0] # 计算每个异常样本的SHAP绝对值总和 anomaly_shap_sum = np.sum(np.abs(shap_values[anomaly_idx]), axis=1) # 取25%分位作为阈值,筛选需要移除的异常样本 threshold = np.percentile(anomaly_shap_sum, 25) to_remove_anomaly = anomaly_idx[anomaly_shap_sum > threshold] X_cleaned = X.drop(index=to_remove_anomaly)
注意事项
- 不要直接用单个SHAP值作为唯一判定标准,最好结合业务规则二次校验,比如某些特征的异常值是业务上正常的特殊场景,就算SHAP贡献高也不需要移除对应样本。
- 如果后续还要做监督学习任务,移除特征后可以跑一次baseline模型验证效果,只要效果下降不超过2%,说明特征移除是合理的。
内容的提问来源于stack exchange,提问作者Kath
相关产品推荐
相关产品推荐

