压缩函数如何影响特征重要性

当您使用非线性函数来转换模型输出时,机器学习模型中特征的重要性可能会发生显著变化。这种转换最常见的类型是使用“压缩”函数(squashing function)。像逻辑斯蒂变换(logistic transform)这样的压缩函数通常用于将无界的“边际”空间(margin space)转换为有界的概率空间。边际空间的值以信息为单位,而概率空间的值以概率为单位。您关心哪个空间取决于不同的情况。边际空间更适合进行加减运算,并直接对应于信息论意义上的“证据”。然而,如果您只关心概率百分比的变化,而不是证据本身,那么使用概率空间会更好。选择概率空间意味着,获得大量强有力的证据,将概率从98%提升到99.99%,远不如用较少的证据将概率从50%提升到60%来得重要。为什么从98%概率提升到99.99%比从50%提升到60%需要更多的证据?这是因为从信息论的角度来看,从98%的确定性提升到99.99%需要的信息量,要比从50%的确定性提升到60%更多。

请注意,即使逻辑斯蒂函数是单调变换,它仍然可以改变模型中哪个特征最重要的排序。特征的排序可能会改变,因为某些特征对于达到99.9%的概率可能非常重要,而其他特征通常在达到60%的概率时更有帮助。下面的简单示例展示了如何使用压缩函数改变特征的重要性。

[3]:
import numpy as np
import pandas as pd
import scipy

import shap
[4]:
shap.initjs()
[5]:
# build a simple dataset
N = 500
M = 4
X = np.random.randn(N, M)
X[0, 0] = 0
X[0, 1] = 0
X = pd.DataFrame(X, columns=["A", "B", "C", "D"])


# a function (a made up ML model) with an output in "margin" space...
def f(X):
    return (X[:, 0] > 0) * 1 + (X[:, 1] > 1.5) * 100


# ...and then also change its output to probability space
def f_logistic(X):
    return scipy.special.expit(f(X))
[7]:
# explain both functions
explainer = shap.KernelExplainer(f, X)
shap_values_f = explainer.shap_values(X.values[0:2, :])

explainer_logistic = shap.KernelExplainer(f_logistic, X)
shap_values_f_logistic = explainer_logistic.shap_values(X.values[0:2, :])
Using 500 background data samples could cause slower run times. Consider using shap.kmeans(data, K) to summarize the background as K weighted samples.
Using 500 background data samples could cause slower run times. Consider using shap.kmeans(data, K) to summarize the background as K weighted samples.

边际空间解释

在边际空间中,特征 B 非常重要,因为它为 0 意味着我们不会触发当 B 大于 2 时产生的 +100 效果。尽管 B 大于 2 的情况很罕见,但由于其巨大的影响,它也非常重要。

[8]:
shap_values_f[0, :]
[8]:
array([-0.506, -6.   ,  0.   ,  0.   ])
[9]:
shap.force_plot(float(explainer.expected_value), shap_values_f[0, :], X.iloc[0, :])
[9]:
可视化已省略,Javascript 库未加载!
您是否已在此 notebook 中运行 `initjs()`?如果此 notebook 来自其他用户,您还必须信任此 notebook(文件 -> 信任 notebook)。如果您在 GitHub 上查看此 notebook,出于安全原因,Javascript 已被移除。如果您正在使用 JupyterLab,此错误是因为尚未编写相应的 JupyterLab 扩展。

概率空间解释

在概率空间中,特征 B 不再那么重要,因为逻辑斯蒂函数将边际空间中 +100 的效果压缩到最多只有 +1。因此,现在特征 B 大于 2 的情况既罕见又不那么重要了。

[10]:
shap_values_f_logistic[0, :]
[10]:
array([-0.11344976, -0.02653412,  0.        ,  0.        ])
[11]:
shap.force_plot(float(explainer_logistic.expected_value), shap_values_f_logistic[0, :], X.iloc[0, :])
[11]:
可视化已省略,Javascript 库未加载!
您是否已在此 notebook 中运行 `initjs()`?如果此 notebook 来自其他用户,您还必须信任此 notebook(文件 -> 信任 notebook)。如果您在 GitHub 上查看此 notebook,出于安全原因,Javascript 已被移除。如果您正在使用 JupyterLab,此错误是因为尚未编写相应的 JupyterLab 扩展。
[ ]: