如何在 SHAP 汇总图上绘制特定特征?
Posted
技术标签:
【中文标题】如何在 SHAP 汇总图上绘制特定特征?【英文标题】:How to plot specific features on SHAP summary plots? 【发布时间】:2020-09-15 22:58:48 【问题描述】:我目前正在尝试在 SHAP 汇总图上绘制一组特定特征。但是,我正在努力寻找这样做所需的代码。
查看 Github 上的源代码时,summary_plot 函数似乎确实具有“特征”属性。但是,这似乎不能解决我的问题。
谁能帮我绘制一组特定的功能,或者这在当前的 SHAP 代码中不是一个可行的选项。
【问题讨论】:
IMO 这是一个不寻常但合理的问题,尽管它缺少一些有用的信息(特别是:您指的是哪个存储库?您的版本是最新的吗?)。此外,我说“不寻常”的部分原因是它不太适合 SO,但参考您使用的代码库,它可能更适合 Data Science 或 Cross Validated (stats) Stack Exchanges。 显然这是相关的,但 SO 更适合“我尝试过 X,但它没有达到我的预期,反而导致错误!”形式的问题。附有Minimal, Complete, and Verifiable example,因此重新表述您的问题将有助于它生存(不会因离题/需要更多信息而被标记为死亡)并查看更多评论 【参考方案1】:要仅绘制 1 个特征,请在特征列表中获取要检查的特征的索引
i = X.iloc[:,:].index.tolist().index('your_feature_name_here')
shap.summary_plot(shap_values[1][:,i:i+1], X.iloc[:, i:i+1])
要绘制您选择的特征,
your_feature_list = ['your_feature_1','your_feature_2','your_feature_3']
your_feature_indices = [X.iloc[:,:].index.tolist().index(x) for x in your_feature_list]
shap.summary_plot(shap_values[1][:,your_feature_indices], X.iloc[:, your_feature_indices])
随意将“your_feature_indices”更改为更短的变量名
如果您不进行二进制分类,请将 shap_values[1] 更改为 shap_values
【讨论】:
【参考方案2】:我使用下面的代码重建 shap_value 以将您想要的特征包含到图中。
shap_values = explainer.shap_values(samples)[1]
vals = np.abs(shap_values).mean(0)
feature_importance = pd.DataFrame(
list(zip(samples.columns, vals)),
columns=["col_name", "feature_importance_vals"],
)
feature_importance.sort_values(
by=["feature_importance_vals"], ascending=False, inplace=True
)
feature_importance['rank'] = feature_importance['feature_importance_vals'].rank(method='max',ascending=False)
missing_features = [
i
for i in columns_to_show
if i not in feature_importance["col_name"][:20].tolist()
]
missing_index = []
for i in missing_features:
missing_index.append(samples.columns.tolist().index(i))
missing_features_new = []
rename_col =
for i in missing_features:
rank = int(feature_importance[feature_importance['col_name']==i]['rank'].values)
missing_features_new.append('rank:'+str(rank)+' - '+i)
rename_col[i] = 'rank:'+str(rank)+' - '+i
column_names = feature_importance["col_name"][:20].values.tolist() + missing_features_new
feature_index = feature_importance.index[:20].tolist() + missing_index
shap.summary_plot(
shap_values[:, feature_index].reshape(
samples.shape[0], len(feature_index)
),
samples.rename(columns=rename_col)[column_names],
max_display=len(feature_index),
)
【讨论】:
【参考方案3】:一个可能的解决方案,虽然很老套,但可能如下所示,例如在第 5 列中为单个特征绘制摘要图
shap.summary_plot(shap_values[:,5:6], X.iloc[:, 5:6])
【讨论】:
以上是关于如何在 SHAP 汇总图上绘制特定特征?的主要内容,如果未能解决你的问题,请参考以下文章
R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放hclust包层次聚类(创建距离矩阵聚类绘制树状图dendrogram,在树状图上绘制红色矩形框)