挤压函数如何影响特征重要性
当您使用非线性函数转换模型的输出时,特征在机器学习模型中的重要性可能会发生显著变化。其中最常见的变换类型是使用“挤压”函数。诸如逻辑变换之类的挤压函数通常用于将无界的“裕度”空间转换为有界的概率空间。裕度空间的值以信息单位表示,而概率空间的值以概率单位表示。您关心哪个空间在不同情况下可能会有所不同。裕度空间更适合加法和减法,并且在信息论意义上直接对应于“证据”。但是,如果您只关心概率百分比的变化,而不关心证据,那么您最好使用概率空间。通过选择概率空间,您是在表明,获得大量强大的证据将您从 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 非常重要,因为当 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 扩展。
您是否在此 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 扩展。
您是否在此 notebook 中运行了 `initjs()`?如果此 notebook 来自其他用户,您还必须信任此 notebook(文件 -> 信任 notebook)。如果您在 github 上查看此 notebook,则出于安全原因,Javascript 已被剥离。如果您正在使用 JupyterLab,则此错误是因为尚未编写 JupyterLab 扩展。
[ ]: