数据扰动不稳定的典型表现
在使用Python的LIME(local interpretable model-agnostic explanations)库时,get_perturbed_samples方法常出现扰动样本质量不稳定的情况。具体表现为:
- 连续运行产生的扰动样本分布差异过大
- 边界样本过度集中或离散
- 分类任务中出现标签翻转噪声
- 数值特征扰动超出合理范围
- 文本特征生成无意义字符序列
问题根源分析
通过分析LIME 0.2.0.1源码发现,扰动不稳定主要源于三个核心因素:
- 随机种子管理:默认使用系统时间作为种子源
- 高斯噪声参数:σ值采用经验性固定设置
- 特征相关性忽略:多维特征独立扰动
# 典型的问题代码片段
def get_perturbed_samples(self, num_samples):
np.random.seed(None) # 无固定种子
perturbations = np.random.normal(0, 1, (num_samples, self.num_features))
return perturbations
五种有效解决方案
1. 固定随机种子
在调用方法前显式设置随机种子:
import numpy as np
np.random.seed(42) # 固定种子值
explainer = lime.lime_tabular.LimeTabularExplainer(...)
2. 调整扰动分布参数
修改explainer初始化时的feature_distribution参数:
explainer = lime.lime_tabular.LimeTabularExplainer(
training_data,
feature_distribution=np.random.normal(0, 0.5, len(features)) # 减小σ值
)
3. 实现协方差感知扰动
自定义扰动函数考虑特征相关性:
from sklearn.covariance import EmpiricalCovariance
cov = EmpiricalCovariance().fit(X_train)
perturbations = np.random.multivariate_normal(
mean=np.zeros(X_train.shape[1]),
cov=cov.covariance_,
size=num_samples
)
4. 添加边界约束
对数值特征施加取值限制:
perturbations = np.clip(perturbations, -3, 3) # 三西格玛原则
5. 集成多扰动策略
组合多种扰动方法提升鲁棒性:
class RobustPerturber:
def __init__(self):
self.strategies = [
lambda x: x * 0.8 + np.random.uniform(-0.2, 0.2),
lambda x: x * np.random.lognormal(0, 0.1)
]
def perturb(self, x):
return np.mean([f(x) for f in self.strategies], axis=0)
数学原理补充
扰动稳定性可通过Jensen-Shannon散度衡量:
JSD(P||Q) = 1/2 * D(P||M) + 1/2 * D(Q||M)
其中M=1/2(P+Q),D为Kullback-Leibler散度。优化目标是最小化多次扰动间的JSD值。