Python中Explainer Dashboard特征贡献计算差异问题求助
Soft Voting模型LIME特征贡献计算与Explainer Dashboard结果不一致问题
我构建了一个Soft Voting模型,需要计算单个预测的特征贡献,但手动使用LIME计算的结果与Explainer Dashboard中的表格存在差异。已确保模型拟合和数据处理流程完全一致,尝试调整LIME配置仍无法消除差异。以下是手动计算的代码及结果,恳请提供解决方案。
手动计算代码
import numpy as np import pandas as pd import lime.lime_tabular custom_input = np.array([[-1.1146465042123073, -1.1269069848628173, -0.5204541934529272, -0.38306820131416996, -1.8520200101947943, 0.18595422584978583, -1.181043961181701, -0.9282866963312929]]) explainer = lime.lime_tabular.LimeTabularExplainer( training_data=risk_factors_test, # Scaled data feature_names=['sex', 'age', 'hypertension', 'heart_disease', 'ever_married', 'avg_glucose_level', 'bmi', 'smoking_status'], class_names=['No Stroke', 'Stroke'], mode='classification', # kernel_width=kernel_width, # feature_selection=feature_selection ) def predict_proba_fn(X): return soft_voting_model.predict_proba(X) # Explain the custom input prediction exp = explainer.explain_instance( custom_input[0], predict_proba_fn, num_features=8, # num_samples=num_samples ) # Get the explanation as a dataframe explanation_list = exp.as_list() explanation_df = pd.DataFrame(explanation_list, columns=['Reason', 'Effect']) try: explanation_df['Effect'] = explanation_df['Effect'].astype(float) except ValueError: # If 'Effect' values are percentages in string format, convert them to numerical values explanation_df['Effect'] = explanation_df['Effect'].str.rstrip('%').astype('float') / 100.0 # The average population average_population_effect = 52.21 # Updated value from the explainer dashboard # Calculate the final prediction effect_values = explanation_df['Effect'] contributions_sum = effect_values.sum() * 100 # Convert back to percentage points final_prediction = average_population_effect + contributions_sum
手动计算结果
| Reason | Effect |
|---|---|
| Average of population | 52.21% |
| hypertension = -0.5204541934529272 | -18.24% |
| bmi = -1.181043961181701 | -12.62% |
| avg_glucose_level = 0.18595422584978583 | 1.35% |
| sex = -1.1146465042123073 | -1.33% |
| Other features combined | +0.0% |
| age = -1.1269069848628173 | 0.97% |
| heart_disease = -0.38306820131416996 | 0.87% |
| smoking_status = -0.9282866963312929 | -0.33% |
| ever_married = -1.8520200101947943 | 0.00% |
| Final prediction | 22.88% |
解决方案建议
- 对齐解释目标类别:LIME默认解释预测概率最高的类别,确认Explainer Dashboard的解释目标是否为同一类别。可在
explain_instance中显式指定labels=[1](假设'Stroke'是索引1的类别),确保和Dashboard一致。 - 替换LIME训练数据集:LIME需要用模型训练时的数据集生成扰动样本,而非测试集。将
training_data=risk_factors_test替换为训练集数据,保证特征分布匹配。 - 统一特征处理细节:检查
custom_input的缩放、编码逻辑是否和模型预测时完全一致,比如是否使用了相同的标准化器,分类特征的编码方式是否统一。 - 匹配LIME参数配置:Explainer Dashboard内部的LIME可能使用了特定参数,尝试开启代码中注释的配置:
- 设置
kernel_width为Dashboard使用的数值(默认是训练集特征标准差的0.75倍) - 调整
num_samples(比如设为5000,和默认一致),增大样本量提升结果稳定性 - 指定
feature_selection='auto'或其他策略,和Dashboard保持同步
- 设置
- 验证概率输出维度:确认Soft Voting模型的
predict_proba输出顺序([负类概率, 正类概率]),确保LIME和Dashboard解释的是同一列的概率变化。 - 核对基准值准确性:手动计算训练集上模型的平均正类预测概率,验证
average_population_effect=52.21是否和Dashboard的基准值完全一致。 - 查看LIME原始权重:打印
exp.local_exp获取LIME拟合的原始特征权重,对比Dashboard的权重,定位差异特征,缩小问题范围。
内容的提问来源于stack exchange,提问作者Tky02
相关产品推荐
相关产品推荐

