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

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

手动计算结果

ReasonEffect
Average of population52.21%
hypertension = -0.5204541934529272-18.24%
bmi = -1.181043961181701-12.62%
avg_glucose_level = 0.185954225849785831.35%
sex = -1.1146465042123073-1.33%
Other features combined+0.0%
age = -1.12690698486281730.97%
heart_disease = -0.383068201314169960.87%
smoking_status = -0.9282866963312929-0.33%
ever_married = -1.85202001019479430.00%
Final prediction22.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:40:14