如何使用 shap.utils.hclust 过滤冗余特征,而不仅仅是通过目视检查条形图?

How to filter redundant features using shap.utils.hclust not only by visual inspection barplot?

我正在使用 shap.utils.hclust 找出哪些功能是多余的,并遵循 documentation

可重现的例子:

import pandas as pd
import numpy as np
import shap

from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score

from lightgbm import LGBMClassifier

data = pd.read_csv("https://raw.githubusercontent.com/gdmarmerola/random-stuff/master/probability_calibration/UCI_Credit_Card.csv")

# getting design matrix and target
X = data.copy().drop(['ID','default.payment.next.month'], axis=1)
y = data.copy()['default.payment.next.month']

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = .2, random_state = 42)

model = LGBMClassifier(random_state = 42).fit(X_train, y_train)

# compute SHAP values
explainer = shap.Explainer(model, X_test)
shap_values = explainer(X_test)

clustering = shap.utils.hclust(X_test, y_test) # by default this trains (X.shape[1] choose 2) 2-feature XGBoost models
shap.plots.bar(shap_values, clustering=clustering)

它检索以下图:

我的问题是:

  1. 在实现中为什么 this 即使是分类任务也是 XGBRegressor

  2. 如何使用 clustering 删除冗余特征,超出条形图视觉检查?

更新:

我的主要问题是:

在这个玩具示例中,我如何使用 (22,4) 形状输出矩阵来检查同一簇中的哪些特征,从而能够降低维度?我有一个包含 10,000 多个特征的数据框,这就是为什么目视检查不可行的原因。

array([[15.        , 16.        ,  0.2877219 ,  2.        ],
       [12.        , 13.        ,  0.36595157,  2.        ],
       [11.        , 24.        ,  0.37372008,  3.        ],
       [14.        , 25.        ,  0.420607  ,  4.        ],
       [23.        , 26.        ,  0.43781072,  6.        ],
       [ 9.        , 10.        ,  0.45111704,  2.        ],
       [21.        , 27.        ,  0.50203449,  7.        ],
       [20.        , 29.        ,  0.51782125,  8.        ],
       [18.        , 30.        ,  0.52462131,  9.        ],
       [17.        , 31.        ,  0.52700263, 10.        ],
       [ 8.        , 28.        ,  0.52802497,  3.        ],
       [19.        , 32.        ,  0.54064447, 11.        ],
       [ 5.        ,  6.        ,  0.56145751,  2.        ],
       [ 7.        , 33.        ,  0.57828146,  4.        ],
       [35.        , 36.        ,  0.62561315,  6.        ],
       [34.        , 37.        ,  0.66345358, 17.        ],
       [22.        , 38.        ,  0.6892271 , 18.        ],
       [ 0.        , 39.        ,  0.76330948, 19.        ],
       [ 4.        , 40.        ,  0.91275334, 20.        ],
       [ 2.        , 41.        ,  0.94387454, 21.        ],
       [ 1.        , 42.        ,  0.98299891, 22.        ],
       [ 3.        , 43.        ,  0.98913395, 23.        ]])
  1. 在下面,即使是用于分类的树模型也是回归任务。 SHAP 将其称为“原始”特征输出 space,Tensorflow 将其称为 logits。将 raw 转换为 proba space 使用 sigmoid 或 softmax。所以,回答你的第一个问题:
Distances are measured by training univariate XGBoost models 
of y for all the features, and then predicting the output of these
models using univariate XGBoost models of other features. If one 
feature can effectively predict the output of another feature's 
univariate XGBoost model of y, then the second feature is 
redundant with the first with respect to y. A distance of 1 corresponds 
to no redundancy while a distance of 0 corresponds to perfect 
redundancy (measured using the proportion of variance explained). 
Note these distances are not symmetric.

用简单的英语,他们将特征 1 乘 1 添加,然后查看添加的特征是否增加了原始 space 的预测能力,由 R2 测量。如果是,他们说距离很大(不同的集群)。如果不是,他们说距离很小(同一个集群)。

  1. 您可以从聚类中推断出的唯一信息是,在给定样本的情况下,从模型的预测能力角度来看,特征非常接近。通常,省略附加特征将是有损的,除非它是 (i) 白噪声,(ii) 具有结构但在广义上与输出不相关,或 (iii) 模型记忆数据。不同的模型是否在同一个“集群”中可能会有不同的看法。

一般来说,我会使用 SHAP 来解释模型或数据(“符合模型”或“符合数据”),以及实验计划。我不希望它在使用已收集的数据调整模型时帮助我进行特征选择。但这可能取决于您的特定 objective,例如如果您怀疑过度拟合,请输出最简约的模型或调整您的数据。

更新

from scipy.cluster import hierarchy
hierarchy.dendrogram(clustering, labels=X_train.columns);

hierarchy.cut_tree(clustering, n_clusters=5)

hierarchy.cut_tree(clustering, height=.5)

输出是集群标签。选择“任何”。