从 SHAP 值中获取特征重要性

Par*_*syk 12 python feature-selection random-forest

我想获得一个包含重要功能的数据框。通过下面的代码,我得到了 shap_values,但我不确定这些值的含义是什么。在我的 df 中有 142 个特征和 67 个实验,但得到了一个带有 ca 的数组。2500 个值。

explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)

shap.summary_plot(shap_values, X_test, plot_type="bar")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我尝试将它们存储在 df 中:

rf_resultX = pd.DataFrame(shap_values, columns = ['shap_values'])
Run Code Online (Sandbox Code Playgroud)

但得到: ValueError: 传递值的形状是 (18, 142),索引意味着 (18, 1)

142 - 特征的数量。18 - 我不知道。

我相信它的工作原理如下:

  • shap_values 需要取平均值。
  • 并与功能名称配对: pd.DataFrame(feature_names, columns = ['feature_names'])

有人有经验,如何解释 shap_values 吗?起初我认为,值的数量是特征数 x 行数。

小智 12

像这样结合其他两个答案对我有用。

feature_names = X_train.columns


rf_resultX = pd.DataFrame(shap_values, columns = feature_names)

vals = np.abs(rf_resultX.values).mean(0)

shap_importance = pd.DataFrame(list(zip(feature_names, vals)),
                                  columns=['col_name','feature_importance_vals'])
shap_importance.sort_values(by=['feature_importance_vals'],
                               ascending=False, inplace=True)
shap_importance.head()
Run Code Online (Sandbox Code Playgroud)


Man*_*dés 4

shap_values 有(num_rows, num_features)形状;如果你想将其转换为数据帧,你应该将特征名称列表传递给参数columnsrf_resultX = pd.DataFrame(shap_values, columns = feature_names)

每个样本的每个特征都有自己的形状值;shap 值告诉您该特征对该特定样本的预测贡献了多少;这称为局部解释。您可以对每个特征的 shap 值进行平均,以获得全局特征重要性的感觉,但我建议您查看文档,因为shap 包本身提供了更强大的可视化/解释。

  • 这也是我原来问题的答案: vals= np.abs(shap_values).mean(0) feature_importance = pd.DataFrame(list(zip(X_train.columns,vals)),columns=['col_name','feature_importance_vals ']) feature_importance.sort_values(by=['feature_importance_vals'],ascending=False,inplace=True) feature_importance.head() (2认同)