精华内容
下载资源
问答
  • 2022-03-10 09:30:21

    突然发现这篇文章居然被百度文库给盗了, 举报侵权还要我自己打印保证函, 最逗的是, 上传保证函图片还要求开启flash, 其心昭然若揭.

    目录

    安装

    使用示例

    shap.kmeans

    shap_values()

    KernelExplainer返回值使用

    KernelExplainer源码注释

    Parameters参数

    summary_plot

    函数说明

    核心代码

    可视化

    SHAP医学解释相关论文


    Python包:

    https://github.com/slundberg/shap

    该包的文档:

    https://shap.readthedocs.io/en/latest/?badge=latest

    SHAP(SHapley Additive exPlanations)是一种归因方法attribution method, 一种描述特征影响模型平均行为的全局解释方法. 基于解释单个预测的局部解释方法Shapley 值, 通过组合Shapley 值得到.

    SHAP包的介绍参考:

    https://blog.csdn.net/weixin_34355360/article/details/112737643

    SHAP多分类参考:

    https://www.pythonheidong.com/blog/article/535295/a1230a74909938a8f058/

    安装

    pip install shap

    or

    conda install -c conda-forge shap

    activate Liver

    pip install shap

    使用示例

    Kernel SHAP的实现, 核 SHAP 是一种与模型无关的方法,用于估计任何模型的 SHAP 值。因为它不对模型类型做出假设,所以 KernelExplainer 比其他特定于模型类型的算法慢。

    该例子解释iris数据集上的多分类 SVM

    完整的notebook代码(解释scikit-learn中的6种模型):

    https://slundberg.github.io/shap/notebooks/Iris%20classification%20with%20scikit-learn.html

    import sklearn

    import shap

    from sklearn.model_selection import train_test_split

    # print the JS visualization code to the notebook

    shap.initjs()

    # train a SVM classifier

    X_train,X_test,Y_train,Y_test = train_test_split(*shap.datasets.iris(), test_size=0.2, random_state=0)

    svm = sklearn.svm.SVC(kernel='rbf', probability=True)

    svm.fit(X_train, Y_train)

    # 用 Kernel SHAP解释测试集的预测

    explainer = shap.KernelExplainer(svm.predict_proba, X_train, link="logit")

    shap_values = explainer.shap_values(X_test, nsamples=100)

    其中explainer.shap_values(X_test, nsamples=100)代表解释每个预测(单个测试样本)时重新评估模型的次数(见下方)

    分别解释4个特征贡献, 从平均输出0.3206推向0.01

    shap.kmeans

    shap.kmeans聚类简化计算过程, 参考:

    https://zhuanlan.zhihu.com/p/484529670

        # 0.聚类,为了使计算过程简化,加快速度

        X_train_summary = shap.kmeans(x_train, 100)

        # 1.创建解释器对象

        explainer = shap.KernelExplainer(svm_model.predict_proba, data=X_train_summary, link="logit")

    shap_values()

    进入shap_values函数仔细看下:

    作用: 估计一组采样的Shap值

    输入参数

    X : numpy.array or pandas.DataFrame or any scipy.sparse 矩阵

    用于解释模型输出的样本矩阵

    nsamples : "auto" or int

    Number of times to re-evaluate the model when explaining each prediction. More samples lead to lower variance estimates of the SHAP values. The "auto" setting uses `nsamples = 2 * X.shape[1] + 2048`.

    解释每个预测(单个测试样本)时重新评估模型的次数。样本越多,Shap值的方差估计越低。设为"auto"代表使用`nSamples=2*X.Shape[1]+2048`。

    返回值

    array or list

    For models with a single output this returns a matrix of SHAP values (# samples x # features). Each row sums to the difference between the model output for that sample and the expected value of the model output (which is stored as expected_value attribute of the explainer). For models with vector outputs this returns a list of such matrices, one for each output.

    对于具有单一输出的模型,这将返回Shap值矩阵(#Samples x#Feature)。每行的总和(sums)为该样本的模型输出与其期望值之间的差值(存储为解释器的expected_value属性)。

    对于具有矢量输出的模型,这将返回此类矩阵的列表,每个输出对应一个矩阵。

    (查看文档例子后可以理解), shap_values矩阵中, 每一行是一个样本:

    shap_values常用来绘制全局摘要

    shap_values[0]则用来绘制单个实例(其中的0改成其他也是一样)

    KernelExplainer返回值使用

    例子参考:

    https://shap.readthedocs.io/en/latest/example_notebooks/tabular_examples/model_agnostic/Multioutput%20Regression%20SHAP.html#Get-SHAP-Values-and-Plots

    使用Kernel Explainer(模型不可知解释器方法形式为 SHAP)设置解释器

    Set the explainer using the Kernel Explainer (Model agnostic explainer method form SHAP)

    explainer = shap.KernelExplainer(model = model.predict, data = X.head(50), link = "identity")

    获取单个示例的 Shapley 值(即只输入一个样本用于解释)

    # Set the index of the specific example to explain

    X_idx = 0

    shap_value_single = explainer.shap_values(X = X.iloc[X_idx:X_idx+1,:], nsamples = 100)

    显示单个样本的详细信息(即输入值)

    X.iloc[X_idx:X_idx+1,:]

    单个样本-单个标签的热力图:

    # print the JS visualization code to the notebook

    shap.initjs()

    print(f'Current label Shown: {list_of_labels[current_label.value]}')

    shap.force_plot(base_value = explainer.expected_value[current_label.value],

                    shap_values = shap_value_single[current_label.value],

                    features = X.iloc[X_idx:X_idx+1,:]

                    )

    可以看出, 这个热力图是可以直接接受对输入参数喂入Kernel解释器返回的shap_value

    为特定输出/标签/目标创建汇总图:

    # Note: 限制前50个训练样本是因为计算所有样本时间太长

    shap_values = explainer.shap_values(X = X.iloc[0:50,:], nsamples = 100)

    # print the JS visualization code to the notebook

    shap.initjs()

    print(f'Current Label Shown: {list_of_labels[current_label.value]}\n')

    shap.summary_plot(shap_values = shap_values[current_label.value],

                      features = X.iloc[0:50,:]

                      )

    shap.initjs()

    shap.force_plot(base_value = explainer.expected_value[current_label.value],

                    shap_values = shap_values[current_label.value],

                    features = X.iloc[0:50,:]

                    )

    可以看出这个summary_plot和force_plot一样可以接收Kernel Explainer的shap_values作为参数

    基于上面的汇总图,我们可以看到特征 01、03 和 07 是对模型没有影响的特征,可以被删除

    KernelExplainer源码注释

    """Uses the Kernel SHAP method to explain the output of any function.

    Kernel SHAP方法来解释任何函数的输出

        Kernel SHAP is a method that uses a special weighted linear regression to compute the importance of each feature. The computed importance values are Shapley values from game theory and also coefficents from a local linear regression.

    Kernel SHAP 是一种使用特殊的加权线性回归来计算每个特征的重要性的方法。计算得到重要性值是来自博弈论的 Shapley 值,也是来自局部线性回归(local linear regression)的系数(coefficents)。

    Parameters参数

        ----------

        model : function or iml.Model

            User supplied function that takes a matrix of samples (# samples x # features) and     computes the output of the model for those samples.

    The output can be a vector (# samples) or a matrix (# samples x # model outputs).

    输入的model是用户提供的函数(function),这个function的输入是样本矩阵(# 样本数 x # 特征数), 且function为这些样本计算模型的输出。输出可以是向量(#样本数)或矩阵(# 样本数 x # 模型输出数)。

    自定义包装函数的办法, 参考:

    https://shap.readthedocs.io/en/latest/example_notebooks/tabular_examples/neural_networks/Census%20income%20classification%20with%20Keras.html

    # Here we take the Keras model trained above and explain why it makes different predictions

    # for different individuals. SHAP expects model functions to take a 2D numpy array

    # as input, so we define a wrapper function around the original Keras predict function.

    #在这里,我们采用上面训练的Keras模型,并解释为什么它对不同的个体做出不同的预测。SHAP 希望模型函数采用 2D numpy 数组作为输入,因此我们围绕原始 Keras 预测函数定义了一个包装函数

    def f(X):

        return regression.predict([X[:,i] for i in range(X.shape[1])]).flatten()

        data : numpy.array or pandas.DataFrame or shap.common.DenseData or any scipy.sparse matrix

            The background dataset to use for integrating out features.

    用于整合(类似于从联合分布对一个变量的所有情况求和得到另一个变量的边缘分布)特征的背景数据集(background dataset)。

    integrating out参考:

    https://www.physicsforums.com/threads/integrating-out.504853/

    To determine the impact of a feature, that feature is set to "missing" and the change in the model output is observed.

    为了确定一个特征的影响,将该特征设置为“缺失”并观察模型输出的变化。

    Since most models aren't designed to handle arbitrary missing data at test time, we simulate "missing" by replacing the feature with the values it takes in the background dataset.

    由于大多数模型的设计目的不是在测试时处理任意(arbitrary)缺失的数据,因此我们通过将特征替换为背景数据集(background dataset)中的值来模拟“缺失”。

    So if the background dataset is a simple sample of all zeros, then we would approximate a feature being missing by setting it to zero.

    因此,如果背景数据集是一个全零的简单样本,那么我们将通过将其设置为零来近似缺失的特征。

    For small problems this background dataset can be the whole training set, but for larger problems consider using a single reference value or using the kmeans function to summarize the dataset.

    对于小问题,此背景数据集可以是整个训练集,但对于较大的问题,请考虑使用单个参考值或使用 kmeans 函数来汇总数据集。

            Note: for sparse case we accept any sparse matrix but convert to lil format for performance.

        link : "identity" or "logit"

           

           

    A generalized linear model link to connect the feature importance values to the model output.

    广义线性模型link, 将特征重要性值与模型输出关联。

    Since the feature importance values, phi, sum up to the model output, it often makes sense to connect them to the output with a link function where link(output) = sum(phi).

    由于(各个)特征重要性值 phi 求和等于模型输出,因此使用链接函数link function(link(output) = sum(phi))将它们连接到输出通常是有意义的。

    If the model output is a probability then the LogitLink link function makes the feature importance values have log-odds units.

    如果模型输出是概率,则 LogitLink 链接函数(link function)使特征重要性值具有对数几率的单位。

        Examples

        --------

    See :ref:`Kernel Explainer Examples <kernel_explainer_examples>`

    summary_plot

    找shap.summary_plot文档和看源码

    summary plot

    概括图,即 summary plot,该图是对全部样本全部特征的shaple值进行求和,可以反映出特征重要性及每个特征对样本正负预测的贡献。

    shap.summary_plot(shap_values, data[use_cols])

    summary plot与bar_plot区别

    bar_plot为单个样本shapley值的查看, 输入的为一行样本的所以特征列, 而概括图还进行了汇总运算

    源码对应函数summary_legacy

    函数说明

    Create a SHAP beeswarm plot, colored by feature values when they are provided.

    创建一个 SHAP 蜂群图,按特征值着色

    参数

        ----------

    shap_values : numpy.array

    对于单输出解释,这是一个 SHAP 值矩阵

    For single output explanations this is a matrix of SHAP values (# samples样本数 x # features特征数).

    对于多输出解释,这是这些 SHAP 值矩阵的列表。

        For multi-output explanations this is a list of such matrices of SHAP values.

    features : numpy.array or pandas.DataFrame or list

    feature值矩阵 (# samples x # features) 或 feature_names 列表作为简写

        Matrix of feature values (# samples x # features) or a feature_names list as shorthand

    feature_names : list

    特征的名称

        Names of the features (length # features)

    max_display : int

    图中要包含多少个值最大特征(默认为 20,或交互图为 7)

            How many top features to include in the plot (default is 20, or 7 for interaction plots)

        plot_type : "dot" (default for single output), "bar" (default for multi-output), "violin",

            or "compact_dot".

            What type of summary plot to produce. Note that "compact_dot" is only used for         SHAP interaction values.

    要生成什么类型​​的摘要图。

    “dot”(默认为单输出)、“bar”(默认为多输出)、“violin”或“compact_dot”。请注意,“compact_dot”仅用于 SHAP 交互值。

    plot_size : "auto" (default), float, (float, float), or None

    绘图的大小

            What size to make the plot. By default the size is auto-scaled based on the number of features that are being displayed. Passing a single float will cause each row to be that many inches high. Passing a pair of floats will scale the plot by that number of inches. If None is passed then the size of the current figure will be left unchanged.

    def summary_legacy(shap_values, features=None, feature_names=None, max_display=None, plot_type=None,

                     color=None, axis_color="#333333", title=None, alpha=1, show=True, sort=True,

                     color_bar=True, plot_size="auto", layered_violin_max_num_bins=20, class_names=None,

                     class_inds=None,

                     color_bar_label=labels["FEATURE_VALUE"],

                     cmap=colors.red_blue,

                     # depreciated

                     auto_size_plot=None,

                     use_log_scale=False):

    feature_names赋默认值:

            if feature_names is None:

                feature_names = features.columns

    核心代码

    单一输出预测任务

        elif not multi_class and plot_type == "bar":

            feature_inds = feature_order[:max_display]#最好的几个特征下标

            y_pos = np.arange(len(feature_inds))#各个y的坐标通过等差数组计算

            global_shap_values = np.abs(shap_values).mean(0)

            pl.barh(y_pos, global_shap_values[feature_inds], 0.7, align='center', color=color)

            pl.yticks(y_pos, fontsize=13)#坐标刻度

            pl.gca().set_yticklabels([feature_names[i] for i in feature_inds])#坐标轴

    二分类/多分类

        elif multi_class and plot_type == "bar":

            if class_names is None:

                class_names = ["Class "+str(i) for i in range(len(shap_values))]

            feature_inds = feature_order[:max_display]

            y_pos = np.arange(len(feature_inds))

            left_pos = np.zeros(len(feature_inds))#多了堆叠条形图的堆叠起始位置

            if class_inds is None:

                class_inds = np.argsort([-np.abs(shap_values[i]).mean() for i in range(len(shap_values))])# 默认设置根据绝对值大小排类别显示顺序

            elif class_inds == "original":

                class_inds = range(len(shap_values))

    #开始画图

            for i, ind in enumerate(class_inds):

                global_shap_values = np.abs(shap_values[ind]).mean(0) #对每一个小数组(类别)分别求均值

                pl.barh(

                    y_pos, global_shap_values[feature_inds], 0.7, left=left_pos, align='center',

                    color=color(i), label=class_names[ind]

                )

                left_pos += global_shap_values[feature_inds]

            pl.yticks(y_pos, fontsize=13)

            pl.gca().set_yticklabels([feature_names[i] for i in feature_inds])

            pl.legend(frameon=False, fontsize=12)

    其中, barh在y轴绘制横向条形图

    gca(get current axes)控制坐标轴

    mean(0), axis = 0:压缩行,对各列求均值(一列是一个特征嘛),返回 1* n 矩阵

    全局shap值global_shap_values的计算也就是:

    $$ I_j=\frac{1}{n}\sum_{i=1}^n{}|\phi_j^{(i)}| $$

    可视化

    参考这个示例, 有非常多的图种类, 不过也是针对explainer的

    https://shap.readthedocs.io/en/latest/example_notebooks/overviews/An%20introduction%20to%20explainable%20AI%20with%20Shapley%20values.html?highlight=Kernel%20Explainer%20Examples

    可视化第一个prediction的解释   如果不想用JS,传入matplotlib=True

    # plot the SHAP values for the Setosa output of the first instance

    shap.force_plot(explainer.expected_value[0], shap_values[0][0,:], X_test.iloc[0,:], link="logit")

    堆叠热力图

    force_plot

    堆叠整个数据集(测试集)各样本解释:

    # plot the SHAP values for the Setosa output of all instances

    shap.force_plot(explainer.expected_value[0], shap_values[0], X_test, link="logit")

    我们还可以只取每个特征的 SHAP 值的平均绝对值来获得标准条形图(为多类输出生成堆叠条形图)

    shap.plots.bar(shap_values)

    画图例子参考:

    https://zhuanlan.zhihu.com/p/441302127

    Summary Plot

    将 SHAP 值矩阵传递给条形图函数会创建一个全局特征重要性图,其中每个特征的全局重要性被视为该特征在所有给定样本中的平均绝对值

    shap.summary_plot(shap_values, X_display,

                      plot_type="bar")

    同一个shap_values,不同的计算

    summary_plot中的shap_values是numpy.array数组

    plots.bar中的shap_values是shap.Explanation对象

    嗷嗷嗷终于找到不用对象的了

    上面使用Summary Plot方法并设置参数plot_type="bar"绘制典型的特征重要性条形图

    如果不设置, 他默认绘制Summary_plot图,他是结合了特征重要性和特征效果,取代了条形图。

    SHAP医学解释相关论文

    预防手术期间的低氧血症:

    https://www.nature.com/articles/s41551-018-0304-0

    更多相关内容
  • 1. 同名博客:手把手教你使用SHAP 2. 实例讲解,包括(数据+代码+注释) 3. 可自定义图的标签、字体大小等设置 4. 基于jupyter,python代码,可直接运行 5. 若有疑问,可在同名博客...
  • SHAP(SHapley Additive exPlanations)是一种游戏理论方法,用于解释任何机器学习模型的输出。 它使用博弈论中的经典Shapley值及其相关扩展将最佳信用分配与本地解释联系起来(详细信息和引文,请参见)。 安装 ...
  • python库。 资源全名:shap-0.27.0-cp37-cp37m-win_amd64.whl
  • 基于对高 SHapley 加性解释 (SHAP) 值特征的分析,我们发现新考虑的网络和公司关系特征具有很高的重要性(22 个关键特征中的 10 个)。 我们还通过解释 SHAP 值阐明了这些新特征如何有助于预测收购发生。
  • 2019年全国行政区划区县级shap文件最新包括全国2019年全国行政区划区县级shap文件最新包括全国2019年全国行政区划区县级shap文件最新包括全国
  • 全国地图SHAP文件.rar

    2020-03-09 17:53:54
    全国地图shp文件,包括地级城市、县级统计数据、省会城市、省级行政区、县城驻地、中国湖泊、主要铁路公路等
  • 主要介绍了Android布局自定义Shap圆形ImageView可以单独设置背景与图片 的相关资料,需要的朋友可以参考下
  • shap数据转3Dtiles格式

    2020-11-30 22:01:05
    本资源为专业的shapefile文件转3Dtiles格式数据转换工具: 1)支持跨平台,转换速度快 2)支持添加设置材质、纹理贴图等功能 3)支持生成属性文件(点击模型显示相关属性) 4)支持静态调用 5)附带源代码
  • 在A Unified Approach to Interpreting ModelPredictions论文中的第三个分析模型评估标准:SHAP分析Mnist数据集遮掩实验复现实验结果图片
  • Demo-C-Shap

    2021-02-13 05:55:53
    Demo-C-Shap
  • SHAP(Shapley附加属性)值是根据随机“细分”配置文件的平均值计算得出的。 该软件包适用于二进制分类器以及回归模型。 iBreakDown是软件包的后继产品。 它更快(复杂度为O(p)而不是O(p^2) )。 它支持使用D3.js...
  • python库。 资源全名:shap-0.40.0-cp36-cp36m-manylinux2010_x86_64.whl
  • 在A Unified Approach to Interpreting ModelPredictions论文中的第三个分析模型评估标准:SHAP分析Mnist数据集遮掩实验复现代码(new)
  • shap字段重要性
  • SHAP可视化

    2022-04-26 21:52:27
    安装 pip install shap 我的win10在安装之后出现了一些冲突 numpy为1.21.6,但是无法使用,我尝试升级到最新版本之后


    备注:每个条目如果没有遇到问题就可以直接跳过啦

    安装

    pip install shap 装完没问题可以直接进下一步
    以下运行基于的环境及版本如下:
    在这里插入图片描述

    问题1:numpy版本冲突

    问题大概是:安装SHAP之后numpy变成1.21.6,结果其他就没法使用了,升级numpy,不用SHAP,其原代码可以运行,但SHAP不行,以下是探索过程

    我的win10在安装之后出现了一些报错,
    numpy为1.21.6,但是无法使用,我尝试升级到最新版本之后
    在这里插入图片描述
    这里出现了两个版本冲突,之前的scikit-learn是用xgb还是什么出现报错,在github官网上找到了相关问题之后发现不能用1.0,所以降低了版本,我注意到其实并没有使用imbalanced-learn这个包,所以打算把这个卸载了
    在这里插入图片描述
    numpy版本问题,按提示限定一下pip install "numpy>=1.18, <1.22"
    在这里插入图片描述
    额,又装回来了1.21.6,然后还是运行报错
    在这里插入图片描述
    我注释掉SHAP之后还是这样报错,记得在下载SHAP之前它也给我重新安装了numpy,所以可能这个版本符合SHAP但不符合其它包
    用依赖树查看一下, 有点无语,这个imblearn
    在这里插入图片描述
    我卸载了imblearn,结果还是没有用,虽然显示没有冲突了
    再看一下那些依赖numpy的包,要哪些版本
    pipdeptree -p numpy -r

    从结果来看1.21.6应该是符合要求的,真的不解了
    在这里插入图片描述

    麻了,我上官网看了下numpy版本https://pypi.org/simple/numpy/ 1.21.6不支持python310,而我用的3.10,哈哈哈哈,绝了绝了,居然是跟python版本冲突,忽略了这茬
    在这里插入图片描述

    然后发现自己很久没试过安装老版本的python了,官网选择对应的操作系统
    在这里插入图片描述
    在这里插入图片描述
    记得注意勾选添加环境变量,这样就不用自己添加了
    在这里插入图片描述

    多个python版本所以重命名一下避免冲突
    在这里插入图片描述
    发现没法运行,查看环境变量发现,跟系统的一个变量冲突了(很久以前用过一个python,后来卸载了)
    这也告诉我们不要随便把添加系统环境变量,而是写到用户环境变量
    在这里插入图片描述
    删掉之后在echo看一下发现没有改变,也就是环境变量没有生效,重启系统试试看
    ok, 解决了,接下来就可以用3.8了
    在这里插入图片描述
    然后包也要重新装,我真的会流泪,一个非常惨痛的教训,少用最新版,真的很多问题以及其他依赖包跟不上
    另外,我这里安装包时直接改下载源还是慢,有时候就是这么无语

    python38 -m pip install pandas xgboost matplotlib shap -i https://pypi.tuna.tsinghua.edu.cn/simple

    解释器

    SHAP官方文档,有啥问题,细细看
    反正我现在挺爱官方文档的,详细,好用,就是得耐心,看英文

    现在很多机器学习模型都是黑盒,所以需要一些手段来对模型进行解释,SHAP就是其中一种手段,其来源是SHapley Additive exPlanation 夏普利加法解释算法(自己翻译的,术语不知),对于不同的模型,SHAP有不同的解释器: 各解释器用法可见文档

    1. Explainer:适用于任何机器模型
    2. linear:适用于特征独立不相关的线性模型
    3. tree:适用于树模型和基于树模型的集成算法
    4. deep:用于计算深度学习模型,基于DeepLIFT算法
    5. gradient:用于深度学习模型,综合了SHAP、集成梯度、和SmoothGrad等思想,形成单一期望值方程
    6. kernel:模型无关,适用于任何模型
    7. sampling :基于特征独立性假设,当你想使用的后台数据集很大时,kernel的一个很好的替代方案

    大致了解之后就可以愉快地开始画图了

    shap_values = explainer(X_train) #输出shap.Explanation对象
    shap_values2 = explainer.shap_values(X_train) #输出numpy.array数组
    

    条形图

    model.fit(X_train, y_train)
    explainer = shap.Explainer(model)
    shap_values = explainer(X_train)
    shap.plots.bar(shap_values, max_display=20)
    

    这个画出来如下,但是是红色的,没找到设置颜色的参数,看起来有点,额,太亮了
    在这里插入图片描述

    另一个官方文档,感觉接口有简化
    在这里插入图片描述

    蜂群图

    shap.plots.beeswarm(shap_values) 总感觉我的这个图没有渲染完,中间都断掉了,旁边的high low也没显示完全(画依赖图降级matplotlib之后该问题也解决了)

    在这里插入图片描述

    依赖图

    依赖图接口说明
    shap.dependence_plot('age', shap_values2, X_train)
    这个年龄图怎么看起来丝毫没有用的样子,都是对半开,在0附近
    在这里插入图片描述

    问题1:绘图错误

    ValueError: Passing parameters norm and vmin/vmax simultaneously is not supported. Please pass vmin/vmax directly to the norm when creating it.
    解决方案
    我把matplotlib从3.5.1降级到3.4.0解决了此问题

    参考文章

    用 SHAP 可视化解释机器学习模型的输出实用指南
    可解释性算法总结文档

    展开全文
  • 因为最近SHAP版本与之前的调用方式有蛮多差异,就从新版本出发,进行解读。 不会过多解读SHAP值理论部分,相关理论可参考: 关于SHAP值加速可参考以下几位大佬的文章: 文章目录1 介绍2 可解释图2.1 单样本特征影响...


    最近在系统性的学习AUTOML一些细节,本篇单纯从实现与解读的角度入手,
    因为最近SHAP版本与之前的调用方式有蛮多差异,就从新版本出发,进行解读。

    不会过多解读SHAP值理论部分,相关理论可参考:

    关于SHAP值加速可参考以下几位大佬的文章:

    官方:
    slundberg/shap

    关联文章:
    机器学习模型可解释性进行到底 —— 从SHAP值到预测概率(二)
    机器学习模型可解释性进行到底 ——PDP&ICE图(三)



    1 介绍

    文章可解释性机器学习_Feature Importance、Permutation Importance、SHAP
    来看一下SHAP模型,是比较全能的模型可解释性的方法,既可作用于之前的全局解释,也可以局部解释,即单个样本来看,模型给出的预测值和某些特征可能的关系,这就可以用到SHAP。

    SHAP 属于模型事后解释的方法,它的核心思想是计算特征对模型输出的边际贡献,再从全局和局部两个层面对“黑盒模型”进行解释。SHAP构建一个加性的解释模型,所有的特征都视为“贡献者”。

    对于每个预测样本,模型都产生一个预测值,SHAP value就是该样本中每个特征所分配到的数值。

    基本思想:计算一个特征加入到模型时的边际贡献,然后考虑到该特征在所有的特征序列的情况下不同的边际贡献,取均值,即某该特征的SHAPbaseline value

    文章kaggle | Machine Learning for Insights Challenge提及:
    Permutation importance很不错,因为它用很简单的数字就可以衡量特征对模型的重要性。但是它不能handle这么一种情况:当一个feature有中等的permutation importance的时候,这可能意味着这么两种情况:

    • 1:对少量的预测有很大的影响,但是整体来说影响较小;
    • 2:对所有的预测都有中等程度的影响。

    SHAP 就可以应用的上,来看一下SHAP呈现的几种图,本轮笔者 是直接拿slundberg/shap中的代码,发现0.39.0版本,跟之前的版本差异非常大,很多函数名称都发生了变化。

    笔者实验下述代码的环境:anaconda + py3.7 + jupyter notebook + shap==0.39.0

    安装方式:

    
    pip install shap
    or
    conda install -c conda-forge shap
    

    2 可解释图

    那就从拆解当下slundberg/shap的案例入手,开始解读SHAP值的各类神图:

    注意画图前需要加:

    shap.initjs()
    

    2.1 [微观]单样本特征影响图一:waterfall

    在这里插入图片描述

    图一:

    • 该图代表第0个样本,
    • Y轴代表不同特征值,
    • X代表SHAP值,
    • E[f(x)]代表所有样本f(x)的期望,base_values,model.predict(X)的预测值的平均值
    • f(x)代表第0个样本,f(x)值的大小为第0个样本的预测值, model.predict(X[0]) = base_values + sum(shap_values[0].values)

    红色代表,该特征对第0个样本是正向增益的。
    蓝色为负向,由此可以看到哪些特征增益好 / 坏

    
    import xgboost
    import shap
    shap.initjs()
    
    # train an XGBoost model
    X, y = shap.datasets.boston()
    model = xgboost.XGBRegressor().fit(X, y)
    
    # explain the model's predictions using SHAP
    # (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
    explainer = shap.Explainer(model)
    shap_values = explainer(X)
    
    # visualize the first prediction's explanation
    shap.plots.waterfall(shap_values[0])
    
    

    在这里插入图片描述

    这个是第0个样本的 所有信息,其中

    • base_values -> 平均,base_values,model.predict(X)的预测值的平均值
    • values -> 这一个样本,每个特征的SHAP值
    • data -> 这一个样本,样本特征值

    2.2 [微观]单样本特征影响图二:force plot

    整个理论的核心图:
    在这里插入图片描述

    shap.initjs()
    # visualize the first prediction's explanation with a force plot
    shap.plots.force(shap_values[0])
    

    shap值类似回归系数:有正负之分,大小之分

    如果解读这个图:

    • shap_values[0] - 第0个样本
    • shap_values[0].base_values - 22.53,所有样本汇总的平均 f(x) 值,所以所有值都一样,模型在数据集上的输出均值22.53
    • shap_values[0].data - 所有特征原值,本案例是数据集shape为(506, 13),第0个样本13个特征的具体值
    • shap_values[0].values - 第0个样本13个特征的shap值

    所以,图中所有样本基础平均f(x)值:22.53,该样本shap值加总之后为f(x) -> 24.02

    计算方式:第0个样本特征原值 第0个样本特征shap值 = shap_values[0].data * shap_values[0].values

    • 红色代表:正向影响,LSTAT这个特征,正向影响,shap值,4.98,影响最大;PTRATIO也是正向
    • 蓝色代表:负向影响,RM特征,负向影响,shap值,6.575,负向的

    来看一下:shap_values[0]

    
    .values =
    array([-4.2850167e-01, -6.6636719e-02,  7.7860229e-02, -1.5295845e-03,
           -7.2922713e-01, -2.1700280e+00,  1.9213372e-01, -4.1425934e-01,
           -4.9156108e-01, -4.7296646e-01,  2.5669456e-01, -5.3907130e-02,
            5.7883248e+00], dtype=float32)
    
    .base_values =
    22.532942
    
    .data =
    array([6.320e-03, 1.800e+01, 2.310e+00, 0.000e+00, 5.380e-01, 6.575e+00,
           6.520e+01, 4.090e+00, 1.000e+00, 2.960e+02, 1.530e+01, 3.969e+02,
           4.980e+00])
    
    

    2.3 [宏观]特征影响图

    官方给到的code:

    # visualize all the training set predictions
    shap.plots.force(shap_values)
    

    会一直报错:

    Exception: In v0.20 force_plot now requires the base value as the first parameter! Try shap.force_plot(explainer.expected_value, shap_values) or for multi-output models try shap.force_plot(explainer.expected_value[0], shap_values[0]).
    

    所以,目前笔者测试的时候,需要按照这个公式:shap.plots.force(平均f(x)值,shap值,特征重要性)
    这里是可以自由选择样本数的,样本少,密度不大,看到的东西多一些:

    # 全样本
    shap.plots.force(explainer.expected_value,shap_values.values,shap_values.data)
    
    # 前100个样本
    shap.plots.force(explainer.expected_value,shap_values.values[:100],shap_values.data[:100])
    
    

    这张图的来源:

    上面的一个样本的解释图旋转90°,然后水平的堆积起所有的样本,就会出现上面的图片。这是全样本的解释图,我们可以选择不同的横纵坐标。

    • X - 横轴是样本数量,
    • Y - 纵轴是shap值加总(每个特征值 * 每个特征的shap值)

    这里横轴的排列是非常有讲究的,因为不是按顺序排列的,该图会把受相同特征影响大的放一起,

    比如观察最左边,蓝色扎堆是负向shap增益区,划过可以看到基本是0/4/5/12这几个特征对大多数样本都有负向增益;
    当然同样,右边,红色扎堆,12/5/10对一些样本是正向增益的

    整体来说,该图是一个宏观的了解,诸多样本不同的特征对其的影响
    在这里插入图片描述
    来看单点:

    jupyter中点击了,会静态,看到某个样本,不同特征的f(x)值
    在这里插入图片描述
    另外也可以指定一些样本:

    # visualize all the training set predictions
     # shap.plots.force(基础值,shap值,特征重要性)
    shap.plots.force(explainer.expected_value,shap_values.values[:100],shap_values.data[:100])
    

    在这里插入图片描述
    整体会变得稀疏一些,看起来友好

    2.4 [宏观]特征依赖图——dependence scatter plot

    代表两个变量交互效应,这里借鉴文章酒店排名模型中的商业价值度量

    在这里插入图片描述

    # create a dependence scatter plot to show the effect of a single feature across the whole dataset
    
    shap.plots.scatter(shap_values[:,"AGE"], color=shap_values[:,"DIS"])
    

    解读一下这个三维散点图,主要解释的是:NOX -> AGE特征的影响

    • X轴为AGE特征的特征值范围,
    • Y轴为AGE特征的shap值,对于模型的输出会带来的变化量

    其中我们可以发现对于同一个x 值,也就是特征取值相同的样本,它们的shap value不同。其原因是,该特征和其他特征有着交互相应

    右边是对比的特征NOX,这里红色代表NOX-高分部分;蓝色代表-NOX低分部分

    从图中可知:
    最右边,一堆红色点,NOX-高分部分 对于 高年龄来说,shap值一般小于0,所以是负面影响
    左上角,稀稀拉拉的蓝色点,代表,NOX-低分部分 对于 低年龄来说,shap值一般大于0,所以是正面影响

    有个问题,貌似不能指定,与AGE对比的变量?

    参考:
    shap.plots.scatter(shap_values[:,"AGE"], color=shap_values[:,"DIS"])
    可以指定对比:AGE 与DIS之间的关系

    另外两个特征的影响,如果某个特征为分类特征,则会呈现序列装,如下图
    notebooks/tree_explainer

    如果是分类变量,笔者还没遇见过,只是看到文章可解释机器学习-shap value的使用提及之前旧函数的一些注意事项:

    能够正常显示分类变量的结果。也就是说,如果希望后面正常使用shap 的全部功能的话,最好就是在刚开始的时候,我们先把分类变量转成数字形式,也就是OrdinalEncoder 编码。
    在这里插入图片描述

    2.5 [宏观]特征密度散点图:beeswarm

    # summarize the effects of all the features
    shap.plots.beeswarm(shap_values)
    

    在这里插入图片描述
    下图中每一行代表一个特征,横坐标为Shap值。特征的排序是按照shap 的平均绝对值,对模型来说的最重要特征。宽的地方表示有大量的样本聚集。

    一个点代表一个样本,颜色越红说明特征本身数值越大,颜色越蓝说明特征本身数值越小。

    可以看做一种特征重要性的排列图,

    LSTAT对模型非常重要,而且LSTAT高分红点值的人,shap值小于0,负向影响;
    特征值越小,shap大于0,正向影响

    横向来看,LSTAT这个特征,样本分布较为分散,那么代表该特征影响越大

    另外,比如特征 B ,大多数的点弥漫在SHAP = 0,所以对大部分人都没啥影响,只对小部分人有影响。

    2.6 [宏观]特征重要性SHAP值

    每个特征的shap值排序,与上述的一致

    shap.plots.bar(shap_values)
    

    在这里插入图片描述

    2.7 [宏观]样本聚类下特征分布热力图

    参考:heatmap plot

    import xgboost
    import shap
    
    # train XGBoost model
    X,y = shap.datasets.adult()
    model = xgboost.XGBClassifier(n_estimators=100, max_depth=2).fit(X, y)
    
    # compute SHAP values
    explainer = shap.Explainer(model, X)
    shap_values = explainer(X[:1000])
    
    shap.plots.heatmap(shap_values)
    
    

    在这里插入图片描述
    这个图里面有很多门道,

    • X轴下面是样本序列,X轴上面的f(x)是每个样本shap值加总(样本维度shap加总),代表与均值的偏离程度;
    • Y轴左边是特征名,右边应该是特征重要性(特征维度shap加总);
    • 中间花花绿绿的条纹,是每个样本,每个特征,SHAP值大小。

    另外还有,样本这样的排序是有规律的,先是shap.order.hclust层次聚类过,所以样本色块分布如此均匀。

    来具体解读一下,层次聚类的结果:

    • 比如第0-50个样本,capital gain色块非常红,代表这50个样本,受capital gain的正向影响较大;且样本shap值加总f(x) 也大于平均线,是优质样本。

    2.8 [宏观]特征的层次聚类

    import xgboost
    import shap
    
    # train XGBoost model
    X,y = shap.datasets.adult()
    model = xgboost.XGBClassifier(n_estimators=100, max_depth=2).fit(X, y)
    
    # compute SHAP values
    explainer = shap.Explainer(model, X)
    shap_values = explainer(X[:1000])
    
    # 层次聚类 + SHAP值
    clust = shap.utils.hclust(X, y, linkage="single")
    shap.plots.bar(shap_values, clustering=clust, clustering_cutoff=1)
    

    在这里插入图片描述

    这其实是2.6节+层次聚类的结果;
    可以说,relationshipmarital status高度相关,存在特征的多重共线性问题(从另外一篇来看,可能relationship会混淆marital status的因果影响,参考[Be careful when interpreting predictive models in search of causal insights]

    2.9 [微观]多样本-不同特征SHAP决策图

    decision plot

    from pprint import pprint
    import lightgbm as lgb
    import matplotlib.pyplot as plt
    import numpy as np
    import pickle
    import shap
    from sklearn.model_selection import train_test_split, StratifiedKFold
    import warnings
    
    X, y = shap.datasets.adult()
    X_display, y_display = shap.datasets.adult(display=True)
    
    # create a train/test split
    random_state = 7
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=random_state)
    d_train = lgb.Dataset(X_train, label=y_train)
    d_test = lgb.Dataset(X_test, label=y_test)
    
    params = {
        "max_bin": 512,
        "learning_rate": 0.05,
        "boosting_type": "gbdt",
        "objective": "binary",
        "metric": "binary_logloss",
        "num_leaves": 10,
        "verbose": -1,
        "min_data": 100,
        "boost_from_average": True,
        "random_state": random_state
    }
    
    model = lgb.train(params, d_train, 10000, valid_sets=[d_test], early_stopping_rounds=50, verbose_eval=1000)
    
    # 计算shap值
    explainer = shap.TreeExplainer(model)
    expected_value = explainer.expected_value
    if isinstance(expected_value, list):
        expected_value = expected_value[1]
    print(f"Explainer expected value: {expected_value}")
    
    select = range(20)
    features = X_test.iloc[select]
    features_display = X_display.loc[features.index]
    
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        shap_values = explainer.shap_values(features)[1]
        shap_interaction_values = explainer.shap_interaction_values(features)
    if isinstance(shap_interaction_values, list):
        shap_interaction_values = shap_interaction_values[1]
    
    
    
    

    以上为加载数据,直接来画一下SHAP决策图:

    # top20 样本决策图
    shap.decision_plot(expected_value, shap_values, features_display)
    

    在这里插入图片描述
    该函数的输入有:

    • expected_value:int,预测值的平均值,model.predict(X)的预测值的平均值
    • shap_values,array,20*12,20个样本12个特征下,各自的shap值
    • features_display,dataframe,20*12,20个样本12个特征下,各自的原特征值

    该图的解读方式:

    • Y轴特征的排序就是特征的重要性,特征维度SHAP值的加总
    • 横向,最上面[-15,10] 是这20个样本最终的预测值,model.predict(x[i])
    • 每条线是一个样本,所以比较适合样本比较少的分析
    • 每条线最上面触碰到(比如最右边的那条红线)就是第9个样本的模型预测值(6.8
    • 中间那条灰线就是所有样本预测的均值,expected_value = -2.43

    那么这个图在说个啥呢,就是每个样本,每个特征累加的过程,以第9个样本为例,以下是每个样本的SHAP值:

    [('Age', 1.0005292304135247), ('Workclass', -0.00961971822852331),
     ('Education-Num', 0.6520195769846917), ('Marital Status', 0.38046518229621656),
     ('Occupation', 0.3068224161474528), ('Relationship', 1.1042083100072628),
     ('Race', 0.02055876376016164), ('Sex', -0.2407685655486416),
     ('Capital Gain', 6.091624680787399), ('Capital Loss', -0.019415257138761084),
     ('Hours per week', -0.05843492194589284), ('Country', 0.011780342708710345)]
    

    累加的过程就是:

    -2.43
    + Country,0.0117   
    + Capital Loss,-0.0194
    + ...
    + Capital Gain,6.091
    +...
    

    所以可以看到样本9的这条线在Capital Gain突然增加很多
    在这里插入图片描述

    同样该图也有一些变形:

    变形1:由数值 -> 概率

    shap.decision_plot(expected_value, shap_values, features_display, link='logit')
    

    在这里插入图片描述
    最上面的[-10,15]改成了概率值

    变形2:高亮某个样本线highlight

    shap.decision_plot(expected_value, shap_values, features_display, highlight=9)
    

    比如这里高亮第9个样本:
    在这里插入图片描述


    3 优质解读案例

    3.1 酒店排名模型中的商业价值度量

    截取文章:酒店排名模型中的商业价值度量

    对模型的单个结果进行研究是有趣的,但是聚合视图可以让我们很好地查看模型给出的趋势。下面的摘要图按重要性降序列出了几个最重要的特征。每个点都是一个结果,它在x轴上的位置代表特征的SHAP值,颜色代表特征的相对大小,红色代表高,蓝色代表低。
    在这里插入图片描述
    我们可以看到,最重要的特征是hotel_cumulative_share,在右侧有一个红色的大条,表示分享的多的酒店是好的。接下来是previous_user_hotel_interaction,这是一个标记,表示用户以前是否曾经浏览过该酒店。虽然这个标志通常设置为0表示没有交互,但是当它不是0时,它的影响是巨大的。
    与股票或评论计数不同,较低的相对价格几乎总是被认为是更好的。一般来说,具有良好历史业绩的酒店,离用户申报的目的地较近的酒店(如果有的话),以及相对便宜的酒店,都在模型中排名较高。

    我想扩展最后一点,因为之前我说过,一个好的机器学习模型应该能够为不同的用户找到一个合适的价格区间。虽然该模型认为相对便宜的酒店更好,但它强调,这是不正确的,有时根本不符合用户显示出对高端酒店的偏好。

    在这里插入图片描述
    上面是一个部分依赖图,显示了x轴user_preferred_price上用户的价格水平和酒店的价格srq_price_zscore之间的交互。
    一条长长的红色线条大致沿着y-x线,这说明昂贵的酒店对于低端用户具有负 SHAP值,与低端用户的相关性较小,对于高端用户具有正 SHAP值,与高端用户的相关性更大。
    相反,垂直的蓝色条纹表明,该模型能够调整其对低端用户的期望。在不需要任何人工输入的情况下,该模型能够根据用户指定的价格水平将其与酒店进行匹配。


    4 一致的个性化特征归因方法

    SHAP知识点全汇总

    对于可解释来说,一致性非常重要,稳定的归因方式才有稳定的解决。

    一致性:每当我们更改模型以使其更依赖于某个特征时,该特征的归因重要性不应该降低。

    如果一致性不成立,意味着当一个模型被更改为某个特征对模型输出的影响更大时,反而会降低该特征的重要性,那么我们不能比较任意两个模型之间的归因重要性,因为具有较高分配归因的特征并不意味着模型实际上更依赖该特征。

    特征归因方法可以分全局和个性化(针对个体),其中全局特征重要度是为整个数据集计算的,该类特征归因方法通常都用特征重要度表示,主要有三种方式:

    • 增益(Gain)。给定特征的所有分裂所贡献的损失或不纯度的总减少量,增益在特征选择方向上被广泛应用。
    • 分裂数(Split Count)。在所有树中一个特征被用做分裂节点的次数。
    • 置换。随机置换测试集中一个特征的值,然后观察模型误差的变化,如果一个特征的值很重要,那么遍历它会导致模型的错误大量增加。

    上面三种都是基于整个数据集去计算特征重要度的,但对于树来说,计算单个预测的特征重要值的个性化方法却较少,虽然与模型无关的个性化解释方法(比如LIME)可以应用于树,但它们明显比树特定的方法慢,并且具有抽样变异性,目前我们所知的树特有的个性化解释方法只有Sabbas,该方法与经典的全局的增益方法类似,但它不是测量损失的减少,而是测量模型预期输出的变化,通过比较模型在树根处输出的期望值与子树在子节点处输出的期望值,以及当前输入的决策路径,然后将这些期望之间的差异归因于在根节点上分离的特性,通过递归地重复这个过程,最后在决策路径上的特征之间分配预期模型输出和当前输出之间的差异。

    下面举两个模型的例子对归因方法的一致性进行比较,假设模型的输出是基于人的症状的风险评分,对于二元特征发烧(Fever)和咳嗽(Cough),模型A只是一个简单的"和"函数,模型B是相同的函数,但是当为咳嗽时预测值会增加(加10分),使得模型更依赖于咳嗽,这时因咳嗽更重要,导致在模型B中咳嗽先分裂。

    比较A、B模型在下面六种归因方法上的差别:

    • Tree SHAP,本文提出的一种新的个性化方法。(个性化特征归因方法,为单个预测计算)
    • Saabas,个性化的启发式特征归因方法。(个性化特征归因方法,为单个预测计算)
    • mean(|Tree SHAP |),基于个性化Tree SHAP归因的平均幅度的全局归因方法(全局特征归因方法,为整个数据集计算,实际为所有样本的Tree SHAP值按照特征计算均值)
    • 增益(全局特征归因方法,为整个数据集计算)
    • 分裂数(全局特征归因方法,为整个数据集计算)
    • 置换(全局特征归因方法,为整个数据集计算)

    在这里插入图片描述

    个性化特征归因方法:Tree SHAP、Sabbas,只有SHAP值能够保证反映特征的重要性,而Saabas值可能会给出错误的结果,比如模型B中认为更大的原因是发烧,而不是咳嗽,这是不一致的表现。

    全局特征归因方法:mean(|Tree SHAP |)、增益、分裂数和特征置换,只有mean(|Tree SHAP |)和置换认为模型B咳嗽比发烧更重要,这意味着在一致性上增益和分裂数不是全局特性重要性的可靠度量。

    所以gain、split count和Saabas方法中的特征重要度都不一致(使B模型更加依赖咳嗽时,却认为发烧更重要),这意味着模型改变为更多地依赖于给定的特性时,分配给该特征的重要性却降低了。通常我们期望树根附近的特征比在叶子附近分裂的特征更重要(因为树是贪婪地构造的),然而增益方法偏向于更重视较低的分裂,这种偏差会导致不一致,当咳嗽变得更加重要时(因此在根部分裂),其归因重要性实际上下降。个性化的Saabas方法在我们下降树时计算预测的差异,因此它也会受到与树中较低分割相同的偏差,随着树木越来越深,这种偏差只会增长。 相比之下,Tree SHAP方法在数学上等效于平均所有可能的特征排序的预测差异,而不仅仅是它们在树中的位置指定的排序。

    所以在我们考虑的方法中,只有SHAP值和置换的方法是具有一致性的,而其中又只有SHAP值是个性化的,所以SHAP值是唯一一致的个性化特征归因方法。


    5 详解base_values 和 单样本shap值的计算过程

    有一小部分参考:不再黑盒,机器学习解释利器:SHAP原理及实战
    主要参考:
    slundberg/shap/test_linear.py

    import xgboost
    import shap
    shap.initjs()
    
    # train an XGBoost model
    X, y = shap.datasets.boston()
    model = xgboost.XGBRegressor().fit(X, y)
    
    # explain the model's predictions using SHAP
    # (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
    explainer = shap.Explainer(model)
    shap_values = explainer(X)
    
    # visualize the first prediction's explanation
    shap.plots.waterfall(shap_values[0])
    
    
    # 第0个样本
    # 样本 x 的所有特征的贡献之和等于预测值减去平均预测值
    shap_values[0].base_values
    shap_values[0].values
    shap_values[0].data
    
    
    predict = model.predict(pd.DataFrame(X.iloc[0,:]).T)
    # base_values -> 平均,f(x) 值 所有样本一样
    # values -> 这一个样本,每个特征的SHAP值
    # data -> 这一个样本,样本特征值
    
    # 每个样本特征shap值 与模型预测值的差异
    sum(shap_values[0].values) = predict - shap_values[0].base_values
    
    # 平均base_values的计算来源
    model.predict(X).mean()
    shap_values[0].base_values
    

    每个样本特征shap值之和 = 该样本模型预测值 - 所有样本预测值的平均值 = predict - shap_values[0].base_values
    base_values = 模型预测值平均值 = model.predict(X).mean()

    就是计算每一个特征的shapley值之和,就是 整体 偏离平均预测值的贡献

    在文献不再黑盒,机器学习解释利器:SHAP原理及实战提到的是,貌似现在shap版本暂时没有做对数化处理:在这里插入图片描述

    6 其他细节的延申

    6.1 waterfall图,从只能画一人 -> 支持多人

    import xgboost
    import shap
    
    # train an XGBoost model
    X, y = shap.datasets.boston()
    model = xgboost.XGBRegressor().fit(X, y)
    
    # explain the model's predictions using SHAP
    # (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
    explainer = shap.Explainer(model)
    shap_values = explainer(X)
    
    # visualize the first prediction's explanation
    shap.plots.waterfall(shap_values[0])
    

    一个简单案例中提及如上,可以看到waterfall支持一个人,而且shap_values是一个比较特殊的类,会必须要datavaluesbase_values
    但是多个人要画这个图,这里可以自己将shap值进行相加/求平均,
    然后得到多人的特征,自己DIY一下:

    class new_shap_values():
        def __init__(self,shap_values,bool_tf = None,method = 'sum'):
            self.feature_names = shap_values.feature_names
            if method == 'sum':
                self.data = np.nansum(shap_values.data[bool_tf], axis=0)
                self.values = np.nansum(shap_values.values[bool_tf], axis=0)
                self.base_values = np.nansum(shap_values.base_values[bool_tf], axis=0)
            elif method == 'mean':
                self.data = np.nanmean(shap_values.data[bool_tf], axis=0)
                self.values = np.nanmean(shap_values.values[bool_tf], axis=0)
                self.base_values = np.nanmean(shap_values.base_values[bool_tf], axis=0)
            else:
                print('sry,not right method.')
    
    shap.plots.waterfall(new_shap_values(shap_values,bool_tf = X['CRIM'] > 10,method = 'sum'))
    

    bool_tf是可以灵活选中

    6.2 一个完整的shap值重要性输出 案例

    import xgboost
    import shap
    shap.initjs()
    
    # train an XGBoost model
    X, y = shap.datasets.boston()
    model = xgboost.XGBRegressor().fit(X, y)
    

    在fit的过程中如果报错:

    ValueError: DataFrame.dtypes for data must be int, float, bool or categorical.  When
    categorical type is supplied, DMatrix parameter
    `enable_categorical` must be set to `True`.feat1, feat12, feat123, feat1234
    

    那么可以使用_get_numeric_data

    model = xgboost.XGBRegressor().fit(X._get_numeric_data(), y)
    

    此时可以输出xgb模型的重要性:

    pd.DataFrame(zip(model.get_booster().feature_names,model.feature_importances_),columns = ['特征名','xgb重要性'])
    

    然后计算shap值:

    # explain the model's predictions using SHAP
    # (same syntax works for LightGBM, CatBoost, scikit-learn, transformers, Spark, etc.)
    explainer = shap.Explainer(model)
    shap_values = explainer(X)
    
    
    pd.DataFrame(zip(shap_values.feature_names,np.abs(shap_values.values).mean(0)),columns = ['特征','ds重要性'])
    
    

    此时输出了shap值得重要性,其中可以看到重要性得计算方式是np.abs(shap_values.values).mean(0))绝对值求平均得到的
    另外还有一种重要性就是shap值,

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

    之前重要性是取绝对值,但是shap是有正负属性的,所以np.sum也可以反应,且带有正负属性
    在这里插入图片描述

    展开全文
  • shap 模型Responsible AI has been a very hot topic in recent years. Accountability and explainability now become the necessary components of your machine learning models, particularly when the models ...

    shap 模型

    Responsible AI has been a very hot topic in recent years. Accountability and explainability now become the necessary components of your machine learning models, particularly when the models make decisions that will impact people’s life, such as medical diagnostic, financial service. This is a very large topic for machine learning and a lot of ongoing work has been dedicated to various aspects. You can check more resources on this topic[1]. In this post, I will focus on SHAP (SHapley Additive exPlanations), which is one of the most popular explainability packages, due to its versatile (local/global explainability; model-specific/agnostic) and the solid theoretical foundation from game theory. You can find many posts and tutorials to understand how SHAP can help you understand how your ML model works, i.e., how each of your features contributes to the model prediction. However, in this post, I will talk about SHAP loss values that many people may be less familiar with. I will walk through some key concepts by presenting an example. I will also share some of my thoughts.

    近年来,负责任的AI一直是一个非常热门的话题。 问责制和可解释性现已成为您的机器学习模型的必要组成部分,尤其是当模型做出会影响人们生活的决策时,例如医疗诊断,金融服务。 对于机器学习来说,这是一个非常大的主题,并且许多正在进行的工作致力于各个方面。 您可以检查有关此主题的更多资源[1]。 在本文中,我将重点介绍SHAP (SHapley Additive exPlanations),这是最受欢迎的可解释性软件包之一,这是因为它的通用性(局部/全局可解释性;特定于模型/不可知论)以及博弈论的扎实理论基础。 您可以找到许多文章和教程来了解SHAP如何帮助您了解ML模型的工作原理,即每个功能如何有助于模型预测。 但是,在这篇文章中,我将讨论许多人可能不太熟悉的SHAP损失值。 我将通过举例说明一些关键概念。 我还将分享我的一些想法。

    To begin with, you may want to check the example provided by SHAP package. And there are two important notes:

    首先,您可能需要检查SHAP软件包提供的示例 。 并且有两个重要说明:

    • The shap loss values will show you how each feature contributes to the logloss value from the expected value. Note, in this post, when I say loss value, it refers to logloss, since we will look at the classification problem)

      急剧损失值将向您显示每个功能如何从预期值贡献到对数损失值。 请注意,在本文中,当我说损失值时,它指的是对数损失,因为我们将研究分类问题)
    • You should use “interventional” method for the calculation of SHAP loss values

      您应使用“介入”方法计算SHAP损失值

    Essentially, this means when integrating out the absent features, you should use the marginal distribution instead of the conditional distribution. And the way to achieve the marginal distribution is to assign the absent features with the values from the background dataset.

    本质上,这意味着在集成缺少的功能时,应使用边际分布而不是条件分布。 实现边际分布的方法是用背景数据集中的值分配缺失的特征。

    The use of “interventional” (i.e., marginal distribution) or “tree_path_dependent” (i.e., conditional distribution) is an important nuance (see docstring in SHAP package) and it’s worth further discussion. But I don’t want to confuse you in the very beginning. You just need to know that in the common practice, TreeShap calculates shap values very fast because it takes advantage of the conditional distribution from the tree structure of the model, but the use of conditional distribution can introduce the problem of causality[2].

    使用“介入”(即边际分布)或“ tree_path_dependent”(即条件分布)是一个重要的细微差别(请参阅SHAP软件包中的文档字符串 ),值得进一步讨论。 但我不想一开始就让您感到困惑。 您只需要知道,在通常的实践中,TreeShap可以非常快速地计算shap值,因为它利用了模型树结构中的条件分布,但是使用条件分布会引入因果关系问题[2]。

    训练XGBoost分类器 (Train an XGBoost Classifier)

    The example in this post is modified from the tutorial example in SHAP package and you can find the full code and notebook here. I first trained an XGBoost classifier. The dataset uses 12 features to predict if a person makes over 50K a year.

    本文中的示例是从SHAP软件包中的教程示例修改而来 ,您可以在此处找到完整的代码和笔记本。 我首先训练了XGBoost分类器。 该数据集使用12个特征预测一个人的年收入是否超过5万。

    ['Age', 'Workclass', 'Education-Num', 'Marital Status', 'Occupation', 'Relationship', 'Race', 'Sex', 'Capital Gain', 'Capital Loss', 'Hours per week', 'Country']

    You can use the SHAP package to calculate the shap values. The force plot will give you the local explainability to understand how the features contribute to the model prediction for an instance of interest (Fig. 1). The summary plot will give the global explainability (Fig. 2). You can check Part 1 in the Jupyter Notebook. There is nothing new but just the common use of SHAP, so I will leave the details to you and jump to Part 2, shap values for the model loss.

    您可以使用SHAP包来计算shap值。 力图将为您提供局部可解释性,以了解特征如何对感兴趣的实例进行模型预测 (图1)。 摘要图将给出全局解释性(图2)。 您可以在Jupyter Notebook中检查第1部分。 除了SHAP的常用用法之外,没有什么新的内容,因此我将为您提供细节,并跳至第2部分, 模型损失的shap值

    Image for post
    Fig. 1. Force plot shows how each feature contributes to pushing the model output from the base value to the model output. Note the output is in log odds ratio space.
    图1.力图显示了每个特征如何有助于将模型输出从基值推向模型输出。 注意,输出在对数优势比空间中。
    Image for post
    Fig. 2. SHAP summary plot gives the global explainability. A feature with a large magnitude means it has a more important impact on the prediction.
    图2. SHAP摘要图给出了整体可解释性。 大幅度的特征意味着它对预测具有更重要的影响。

    解释模型的对数损失 (Explain the Log-Loss of the Model)

    Now the contribution to the model loss is more of interest, so we need to calculate shap loss values. In some sense, this is similar to residual analysis. The code snippet is as follows. Note that you need to

    现在,对模型损失的贡献更加令人关注,因此我们需要计算形状损失值。 从某种意义上讲,这类似于残差分析。 代码段如下。 请注意,您需要

    • provide a background data since we use “interventional” approach. And the computational cost could be expensive. So you should provide a background data of a reasonable size (here I use 100).

      由于我们使用“介入”方法,因此提供了背景数据。 并且计算成本可能是昂贵的。 因此,您应该提供合理大小的背景数据(此处使用100)。
    • Now the model_output is “log_loss”.

      现在,模型输出为“ log_loss”。
    # subsample to provide the background data (stratified by the target variable)X_subsample = subsample_data(X, y)explainer_bg_100 = shap.TreeExplainer(model, X_subsample, 
    feature_perturbation="interventional",
    model_output="log_loss")shap_values_logloss_all = explainer_bg_100.shap_values(X, y)

    Force Plot

    力图

    Now the fore plot for a data instance has a similar interpretation as that in Fig. 2, but in terms of log loss instead of prediction. A successful prediction (ground truth as True and prediction as True) is given in Fig. 3, while a wrong prediction (ground truth as True and prediction as False) in Fig. 4. You can see how the features with blue color try to reduce the logloss from the base value, and the reds increase the logloss. It’s noteworthy that the base values (expected values) of the model loss depend on the label (True/False) so it is a function instead of a single number. The calculation of expected values is by first setting all the data labels to True (or False), and then calculate the average log loss, for which you can check more details on the notebook. I am not sure if there is a particular reason for such a calculation of base values, but after all, the base values just serve as a reference value so I think it should not matter very much.

    现在,数据实例的前部图具有与图2相似的解释,但用对数损失代替预测。 图3中给出了成功的预测(地面真实为True,预测为True),而图4中给出了错误的预测(地面真实为True,预测为False)。您可以看到蓝色特征如何尝试从基本值减少对数损失,红色增加对数损失。 值得注意的是,模型损失的基值(期望值)取决于标签(真/假),因此它是一个函数,而不是单个数字。 期望值的计算方法是,首先将所有数据标签设置为True(或False),然后计算平均对数损失,您可以在笔记本上查看更多的详细信息。 我不确定是否有这样特殊的原因来计算基本值,但是毕竟,基本值仅用作参考值,因此我认为应该没有太大关系。

    Image for post
    Fig. 3. Force plot for a data instance, ground truth is True and mode predicts True.
    图3.数据实例的力图,地面真实为True,模式预测为True。
    Image for post
    Fig. 4. Force plot for a data instance, ground truth is True and mode predicts False.
    图4.数据实例的力图,地面真实为True,模式预测为False。

    Summary Plot

    摘要图

    Similarly, we have the summary plot for the model logloss (Fig. 5). This will tell you how the features contribute to the model logloss (the calculation is based on absolute mean). A feature with a large contribution means it contributes a lot to the model loss, could be increasing the logloss for some data instance or reducing the logloss for other data instances. Therefore, the summary plot here should show the consistency with the top features by shap values in Fig. 2. But we can see the ranking orders are a bit different. While “Relationship” remains the top one, the order of “Age”, “Education-Num”, “Capital Gain”, “Hours per week”, “Occupation” is different. And “Capital Gain” in Fig. 5 has a relatively large contribution than it does in Fig. 2. This suggests that “Capital Gain” plays an important role in reducing the log loss while relatively speaking it may not be that important for the model to make the prediction compared to “Relationship”. It’s noteworthy that the summary plot in Fig. 5 should be interpreted with cautions, since the bar plot in Fig. 5 is calculated based on absolute mean, which means both the effect of reducing logloss and increasing logloss are taken into account to rank the importance of a feature. In plain language, a large magnitude of (absolute) contribution may not necessarily mean a feature is a “good” feature.

    同样,我们有模型对数损失的汇总图(图5)。 这将告诉您特征如何导致模型对数损失(计算基于绝对均值)。 具有较大贡献的功能意味着它对模型损失做出了很大贡献,可能是增加某些数据实例的对数丢失或减少其他数据实例的对数丢失。 因此,这里的摘要图应通过图2中的shap值显示与顶部特征的一致性。但是我们可以看到排名顺序有些不同。 虽然“关系”仍然是头等大事,但“年龄”,“教育数字”,“资本收益”,“每周工作时间”,“职业”的顺序却不同。 而且,图5中的“资本收益”比图2中的贡献更大。这表明“资本收益”在减少对数损失方面起着重要的作用,而相对而言,对于模型而言可能并不那么重要。与“关系”相比做出预测。 值得注意的是,应谨慎解释图5中的摘要图,因为图5中的条形图是基于绝对均值计算的,这意味着要同时考虑减少对数损失和增加对数损失的影响来对重要性进行排名功能。 用通俗易懂的语言来说,(绝对)巨大的贡献不一定意味着某个功能就是“良好”功能。

    Image for post
    Fig. 5. Similar to Fig. 2, but based on model logloss.
    图5.与图2类似,但基于模型对数损失。

    Of course, you can use the scatter summary plot instead of the bar summary plot to see the detailed distribution to dive deeper for your model debugging (i.e., improve your model performance). The other way I investigate it is to decompose the shap loss values into negative component (Fig. 6) and positive component (Fig. 7). And in terms of the model debugging, you want to achieve a more negative value and reduce the positive value for all the features since you wish all the features reduce the final model logloss.

    当然,您可以使用散点汇总图而不是条形汇总图来查看详细分布,以更深入地进行模型调试(即,提高模型性能)。 我研究的另一种方法是将波形损耗值分解为负分量(图6)和正分量(图7)。 在模型调试方面,您希望为所有功能实现一个更大的负值并减少正值,因为您希望所有功能都可以减少最终模型的对数损失。

    Image for post
    Fig. 6. Sum of all the negative shap loss values for each feature.
    图6.每个特征的所有负整形损失值的总和。
    Image for post
    Fig. 7. Sum of all the positive shap loss values for each feature.
    图7.每个特征的所有正整形损耗值的总和。

    监控区 (Monitoring plot)

    Now we come to the most interesting part: use the shap loss value to monitor your model. Model drift and data drift are real-world problems that your model deteriorates and leads to unreliable/inaccurate predictions. But these usually happen silently, and it is very hard to identify the root cause. In a recent paper[3] by the SHAP author, they use the shap loss values to monitor the model health. The idea is very appealing and I wish to explore more on that. Note that the API is available but seems under ongoing development.

    现在我们来讨论最有趣的部分:使用整形损耗值监视模型。 模型漂移和数据漂移是现实世界中的问题,您的模型会恶化并导致不可靠/不准确的预测。 但是,这些通常是无声的,很难确定根本原因。 在SHAP作者的最新论文[3]中,他们使用突变损失值来监视模型的运行状况。 这个想法非常吸引人,我希望对此进行更多的探索。 请注意,该API可用,但似乎正在开发中。

    First we need to calculate the shap loss values for the training data and test data. In the context of monitoring, you need to calculate the shap loss values for dataset from different time-snapshot. You may recall that we have done this in the beginning of this section. But note that we use the background data sampled from the entire dataset. For the rationale of monitoring, it makes more sense to calculate the shap loss values for the training dataset and the test dataset separately, by using the background data from the training dataset and the test dataset. The code snippets are as follows:

    首先,我们需要为训练数据和测试数据计算成型损耗值。 在监视的上下文中,您需要计算来自不同时间快照的数据集的丢失损失值。 您可能还记得我们在本节的开头已经做到了。 但请注意,我们使用从整个数据集中采样的背景数据。 出于监视的基本原理,通过使用来自训练数据集和测试数据集的背景数据,分别计算训练数据集和测试数据集的shap loss值更有意义。 代码片段如下:

    # shap loss values for training data
    X_train_subsample = subsample_data(X=X_train, y=y_train)explainer_train_bg_100 = shap.TreeExplainer(model, X_train_subsample,
    feature_perturbation="interventional", model_output="log_loss")shap_values_logloss_train = explainer_train_bg_100.shap_values(X_train, y_train)# shap loss values for test data
    X_test_subsample = subsample_data(X=X_test, y=y_test)explainer_test_bg_100 = shap.TreeExplainer(model, X_test_subsample,
    feature_perturbation="interventional", model_output="log_loss")shap_values_logloss_test = explainer_test_bg_100.shap_values(X_test, y_test)

    The monitoring plots for the top features are shown in Fig. 8. First all the data instances will be ordered by the index. And here we assume the index indicates the evolution of time (from left to right along the axis). In this toy example, we don’t have data from different time snapshot so we simply treat the training data as the current data and the test data as the future data we would like to monitor.

    顶级功能的监视图如图8所示。首先,所有数据实例将按索引排序。 在这里,我们假设索引指示时间的演变(沿轴从左到右)。 在此玩具示例中,我们没有来自不同时间快照的数据,因此我们只是将训练数据视为当前数据,将测试数据视为我们要监视的未来数据。

    There are some important points to understand these monitoring plots, based on the current implementation in the SHAP pakcage. In order to see if the shap loss values are time-consistent, t-test will be repeatedly conducted to compare two data samples. The current implementation uses an increment of 50 data points to split the data. That means, the first t-test will compare data[0: 50] to data[50:]; and the second will compare data[0: 100] to data[100:], and so on. The t-test will fail if the p value is smaller than 0.05/n_features. In other words, it uses the confidence level of 95% and Bonferroni correction has been applied. Where the t-test fails, a vertical dash line will be plotted to indicate the location. A bit surprising, we see the monitoring plots show the inconsistency of shap loss values for [“Relationship”, “Education-Num”, “Capital Gain”], and that happens when we enter the time snapshot of test data (Fig. 8).

    基于SHAP pakcage中的当前实现,了解这些监视图有一些重要点。 为了查看成型损耗值是否与时间一致,将重复进行t检验以比较两个数据样本。 当前实现使用增量为50个数据点来拆分数据。 也就是说,第一个t检验会将data [0:50]与data [50:]进行比较; 第二个将比较data [0:100]与data [100:],依此类推。 如果p值小于0.05 / n_features,则t检验将失败。 换句话说,它使用95%的置信度,并且已应用Bonferroni校正。 如果t检验失败,则会绘制一条垂直虚线以指示位置。 有点令人惊讶的是,我们看到监视图显示了[“关系”,“教育-数值”,“资本收益”]的急剧损失值的不一致,并且这种情况发生在我们输入测试数据的时间快照时(图8)。 )。

    Image for post
    Fig. 8. Monitoring plots for top features. The training dataset and test dataset are concatenated to mimic data from different time snapshots. Note that the test data starts from index 26047.
    图8.主要功能的监视图。 将训练数据集和测试数据集连接起来,以模仿来自不同时间快照的数据。 请注意,测试数据从索引26047开始。

    The reason for the use of an increment of 50 data points is not very clear to me. And in this example, since we know [0:26048] is the training data, and [-6513:] is the test data. I modified the increment to 6500 and see if it will give a different result. But the monitoring plots still show the same inconsistency (i.e., the failure of t-test) when it comes to comparing the test data (Fig. 9).

    我不清楚使用50个数据点增量的原因。 在此示例中,由于我们知道[0:26048]是训练数据,[-6513:]是测试数据。 我将增量修改为6500,看看它是否会给出不同的结果。 但是,在比较测试数据时,监视图仍显示出相同的不一致(即t检验失败)(图9)。

    Image for post
    Fig. 9. Monitoring plots for top features. Similar to Fig. 8 but now we use the increment of 6500 data points. The purpose is to compare the test data to the last “time segment” of the training data directly.
    图9.主要功能的监视图。 与图8类似,但现在我们使用6500个数据点的增量。 目的是将测试数据直接与训练数据的最后“时间段”进行比较。

    Finally, I think it’s a good idea to check the t-test on the training data and test data directly. And this verifies the conclusion again, the shap loss values are inconsistent between the training dataset and the test dataset.

    最后,我认为对训练数据和直接测试数据进行t检验是一个好主意。 并且这再次验证了结论,训练数据集和测试数据集之间的成型损耗值不一致。

    # t-test for top features (assume equal variance)
    t-test for feature: Relationship , p value: 2.9102249320497517e-06
    t-test for feature: Age , p value: 0.22246187841821208
    t-test for feature: Education-Num , p value: 4.169244713493427e-06
    t-test for feature: Capital Gain , p value: 1.0471308847541212e-27# t-test for top features (unequal variance, i.e., Welch’s t-test,)
    t-test for feature: Relationship , p value: 1.427849321056383e-05
    t-test for feature: Age , p value: 0.2367209506867293
    t-test for feature: Education-Num , p value: 3.3161498092593535e-06
    t-test for feature: Capital Gain , p value: 1.697971581168647e-24

    The inconsistency of shap loss values between training data and test data is actually very unexpected, and can be troublesome. Remember that we simply use training/test split from the entire dataset, so there is a good reason to believe that training dataset and test dataset should be consistent, in terms of data distribution or shap loss values contribution. By any means, this is just a simple experiment and more investigations should be performed to draw any firm conclusion. But I think there may be some reasons why the SHAP package indicates the monitoring functionality is just preliminary, for example:

    训练数据和测试数据之间的毛发损失值不一致实际上是非常出乎意料的,并且可能很麻烦。 请记住,我们只是使用整个数据集中的训练/测试拆分,因此有充分的理由相信,就数据分布或shap loss值的贡献而言,训练数据集和测试数据集应保持一致。 无论如何,这仅仅是一个简单的实验,应该进行更多的研究以得出任何肯定的结论。 但是我认为SHAP软件包可能表明某些监视功能只是初步的原因,例如:

    • the use of an increment of 50 data points looks arbitrary to me;

      在我看来,使用50个数据点的增量是任意的;
    • the t-test looks very sensitive and can give many false alarms.

      t检验看起来非常敏感,可以发出许多错误警报。

    Another interesting discussion point is the use of background data. Note that for the monitoring plots, the shap loss values on the training dataset and the test dataset are calculated using different background data (subsamples from training dataset/test dataset). Since the “interventional” approach to calculate shap loss values is very expensive, I only tried the subsamples data of a size of 100 data instances. That could yield a high-variance result of the shap loss values. Perhaps a background data of a large size will reduce the variance and give the consistency of shap loss values in the monitoring plots. And when I used the same background data (subsamples from the entire dataset), there will not be inconsistency in the monitoring plot. So how you choose the background data matters a lot!

    另一个有趣的讨论点是背景数据的使用。 请注意,对于监视图,使用不同的背景数据(来自训练数据集/测试数据集的子样本)来计算训练数据集和测试数据集上的异常损失值。 由于计算干扰损失值的“介入”方法非常昂贵,因此我仅尝试了100个数据实例大小的子样本数据。 这可能会导致锐变损耗值的高方差结果。 较大的背景数据也许会减少方差,并在监视图中提供稳定的损耗值。 当我使用相同的背景数据(来自整个数据集的子样本)时,监视图中不会出现不一致的情况。 因此,如何选择背景数据非常重要!

    结论与讨论 (Conclusions and Discussions)

    I hope this post can give you a useful introduction to the shap loss values. You can better debug your ML models by investigating the shap loss values. It can also be a useful approach to monitoring your ML models for model drift and data drift, which is still a very big challenge in the community. But note the limitation: in order to use the shap loss values for monitoring, you need to have the ground truth for the new coming data, which is usually only available after a certain period. Also, unfortunately this functionality is still under development, and the appropriateness of the use of t-test needs to be further justified.

    我希望这篇文章能为您提供有关损耗损失值的有用介绍。 您可以通过调查波形损耗值来更好地调试ML模型。 这对于监视ML模型的模型漂移和数据漂移也是一种有用的方法,这在社区中仍然是很大的挑战。 但是请注意以下限制:为了使用突变损失值进行监视,您需要具有新的即将到来的数据的地面真实性,通常仅在特定时间段之后才可用。 同样,不幸的是,该功能仍在开发中,需要进一步证明使用t检验的适当性。

    Last but not least, calculating shap values (TreeShap) by marginal distribution or conditional distribution can give different results (see the equations). The use of conditional distribution will introduce the problem of causality, while marginal distribution will provide unlikely data points to the model[4]. There seems no consensus about which one to use, depending on what scenarios[2,5]. This paper[6] has some interesting comments on this topic which I would like to quote here:

    最后但并非最不重要的一点是,通过边际分布或条件分布计算形状值(TreeShap)可以得出不同的结果(请参见方程式)。 条件分布的使用将引入因果关系问题,而边际分布将为模型提供不太可能的数据点[4]。 关于使用哪种方案似乎没有共识,具体取决于哪种方案[2,5]。 本文[6]对这个话题有一些有趣的评论,我想在这里引用:

    In general, whether or not users should present their models with inputs that don’t belong to the original training distribution is a subject of ongoing debate.

    总的来说,用户是否应该向他们的模型提供不属于原始训练分布的输入,这是一个不断争论的话题。

    ….

    …。

    This problem fits into a larger discussion about whether or not your attribution method should be “true to the model” or “true to the data” which has been discussed in several recent articles.

    这个问题适合于有关归因方法是“对模型正确”还是对数据真实的更大讨论,最近几篇文章对此进行了讨论。

    Image for post
    llustration of the use of marginal distribution and conditional distribution to integrate out missing values (i.e., absent features). Here X1 is presented feature and X2, X3 are absent features. Reproduced from [2].
    说明使用边际分布和条件分布来整合缺失值(即缺失特征)。 这里的X1是特征,而X2,X3是不存在的特征。 转载自[2]。

    Thank you for your time. And don’t hesitate to leave any comments and discussions!

    感谢您的时间。 并且不要犹豫,留下任何评论和讨论!

    All the plots in this post are created by the author by using the SHAP package. Please kindly let me know if you think any of your work is not properly cited.

    这篇文章中的所有图都是作者使用SHAP包创建的。 如果您认为自己的作品没有被正确引用,请告诉我。

    [1] Introduction to Responsible Machine Learning

    [1] 负责任的机器学习简介

    [2] Janzing, D., Minorics, L., & Blöbaum, P. (2019). Feature relevance quantification in explainable AI: A causality problem. https://arxiv.org/abs/1910.13413

    [2] Janzing,D.,Minorics,L.和Blöbaum,P.(2019)。 可解释的AI中的特征相关性量化:因果关系问题。 https://arxiv.org/abs/1910.13413

    [3] Lundberg, S.M., Erion, G., Chen, H., DeGrave, A., Prutkin, J.M., Nair, B., Katz, R., Himmelfarb, J., Bansal, N. and Lee, S.I. (2020). From local explanations to global understanding with explainable AI for trees. Nature machine intelligence, 2(1), 2522–5839.

    [3] Lundberg,SM,Erion,G.,Chen,H.,DeGrave,A.,Prutkin,JM,Nair,B.,Katz,R.,Himmelfarb,J.,Bansal,N.和Lee,SI( 2020)。 从本地解释到对树的可解释AI的全球理解。 自然机器智能2 (1),2522-5839。

    [4] https://christophm.github.io/interpretable-ml-book/shap.html

    [4] https://christophm.github.io/interpretable-ml-book/shap.html

    [5] Sundararajan, M., & Najmi, A. (2019). The many Shapley values for model explanation. arXiv preprint arXiv:1908.08474.

    [5] Sundararajan,M.和Najmi,A.(2019)。 用于模型解释的许多Shapley值。 arXiv预印本arXiv:1908.08474

    [6] Sturmfels, P., Lundberg, S., & Lee, S. I. (2020). Visualizing the impact of feature attribution baselines. Distill, 5(1), e22.

    [6] Sturmfels,P.,Lundberg,S。,&Lee,SI(2020)。 可视化特征归因基线的影响蒸馏 ,5(1),E22。

    翻译自: https://towardsdatascience.com/use-shap-loss-values-to-debug-monitor-your-model-83f7808af40f

    shap 模型

    展开全文
  • 2 因果推断中的ITE 与SHAP值理论的思考 1 因果推断与线性回归的关系 第一个问题也是从知乎的这个问题开始: 因果推断(causal inference)是回归(regression)问题的一种特例吗? 其中经济学大佬慧航提到过,回归...
  • SHAP (SHapley Additive exPlanations)

    千次阅读 2020-12-06 01:07:05
    Interpretable Machine Learning(2)——SHAP
  • 第一篇主要把SHAP值的各类图表操作方式进行展示: 机器学习模型可解释性进行到底 —— SHAP值理论(一) 接下来主要围绕一篇文章的内容展开【黑盒模型实际上比逻辑回归更具可解释性】 源代码部分:smazzanti/tds_...
  • 观察到的特点是, 以短语为粒度, 而非逐个token地计算shap value(虽然下方的数据粒度是单个token, 那是因为在计算到短语粒度后, 按term个数又做了除法). shap_values .values = array([[[ 0. , 0. ], [-1.22018296, ...
  • SHAP: 在我眼里,没有黑箱

    千次阅读 热门讨论 2020-07-17 19:47:06
    lgb, cat)和神经网络模型, 它们相对于普通线性模型在进行预测时往往有更好的精度,但是同时也失去了线性模型的可解释性, 所以这些模型也往往看作是黑箱模型, 在2017年,Lundberg和Lee的论文提出了SHAP值这一...
  • SHAP解释模型

    千次阅读 2021-09-20 17:07:51
    以下实验使用当前最新版本shap:0.39.0 $ pip install shap 注意xgboost也需要使用对应的较新版本,如: $ pip install xgboost==0.82 为使用交互界面,notebook环境下,加载用于可视化的JS代码 import ...
  • 安装SHAP

    2021-11-04 20:25:32
    记录一下我的SHAP安装史 作为一个python小白,从第一步开始安装python都是那么的难。 安装Python 从官网下载https://www.python.org/。说明一下其实没必要下载太新的,对于SHAP,就只有3.8的版本,我之前下载了3.9就...
  • SHAP模型:可解释机器学习模型

    千次阅读 2021-08-24 10:47:29
    首先个人理解SHAP模型是对机器学习模型进行解释的一个模型 上面这个图就是一个比较直观的解释 机器学习模型一般都是一个黑盒。比如某个模型要进行一些预测任务,首先对模型输入一些已知条件(Age=65,Sex=F,BP=...
  • Shap值衡量特征的边际贡献度,是当前模型解释的最佳方法之一,对于模型进行可视化的全局解释、局部解释,可以在一定程度上满足业务对于模型解释性的要求。 本文通过实例对shap原理进行讲解,帮助初学者、从业人员...
  • 机器学习模型的解释-SHAP

    千次阅读 多人点赞 2020-05-18 15:01:59
    数据监控SHAPSHAPSHAP值基于Shapley值,Shapley值是博弈论中的一个概念。SHAP所做的是量化每个特征对模型所做预测的贡献。 对于所有的特征上图可以自由组合共有2^3=8种可能(数学中称为power set即幂集)。...
  • 摘要这一篇文章主要介绍一下关于SHAP方法,会介绍关于Shapley Value的计算方式,通过举例进行说明。接着会举一个实际的例子,来说明如何使用SHAP来进行模型的解释,和对最后结果的可视化展示。简介这一篇是关于模型...
  • 可解释机器学习-shap value的使用

    万次阅读 多人点赞 2020-03-16 15:50:29
    4 lightgbm-shap 分类变量(categorical feature)的处理 4.1 Visualize a single prediction 4.2 Visualize whole dataset prediction 4.3 SHAP Summary Plot 4.4 SHAP Dependence Plots 1 数据预处理和建模 1.1 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,750
精华内容 2,300
关键字:

shap