【问题标题】:Get a feature importance from SHAP Values从 SHAP 值中获取特征重要性
【发布时间】:2021-04-08 13:30:39
【问题描述】:

我想获得一个包含重要特征的数据框。使用下面的代码,我得到了 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")

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

rf_resultX = pd.DataFrame(shap_values, columns = ['shap_values'])

但得到:ValueError:传递值的形状为 (18, 142),索引暗示 (18, 1)

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

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

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

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

【问题讨论】:

    标签: python random-forest feature-selection


    【解决方案1】:

    对于最新版本 0.40.0:

        feature_names = shap_values.feature_names
        shap_df = pd.DataFrame(shap_values.values, columns=feature_names)
        vals = np.abs(shap_df.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_values.feature_nmaes 我得到: AttributeError: 'numpy.ndarray' object has no attribute 'feature_names'
    【解决方案2】:

    来自https://github.com/slundberg/shap/issues/632

    vals = np.abs(shap_values.values).mean(0)
    feature_names = train_x.columns()
    
    feature_importance = pd.DataFrame(list(zip(feature_names, vals)),
                                     columns=['col_name','feature_importance_vals'])
    feature_importance.sort_values(by=['feature_importance_vals'],
                                  ascending=False, inplace=True)
    feature_importance.head()
    

    【讨论】:

    • 为了避免进一步的建议编辑尝试:a) 这是一个引用; b) GitHub 原 issue 不断更新,我们可以看到正确答案取决于 shap 包版本
    【解决方案3】:

    shap_values 具有(num_rows, num_features) 形状;如果要将其转换为数据框,则应将特征名称列表传递给columns 参数:rf_resultX = pd.DataFrame(shap_values, columns = feature_names)

    每个样本的每个特征都有自己的形状值; shap 值告诉您该特征对该特定样本的预测贡献了多少;这称为本地解释。您可以对每个特征的 shap 值进行平均,以获得全局特征重要性的感觉,但我建议您查看 documentation,因为 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()
    • api变了,欢迎更新答案
    【解决方案4】:

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

    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()
    

    【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 2020-04-10
      • 2021-05-23
      • 1970-01-01
      • 2019-03-09
      • 2020-08-20
      相关资源
      最近更新 更多