shap.Explainer 构造函数错误,要求提供未记录的位置参数

Posted

技术标签:

【中文标题】shap.Explainer 构造函数错误,要求提供未记录的位置参数【英文标题】:shap.Explainer constructor error asking for undocumented positional argument 【发布时间】:2021-04-13 16:56:27 【问题描述】:

我正在使用 python shap 包来更好地理解我的机器学习模型。 (来自documentation:“SHAP(SHapley Additive exPlanations)是一种博弈论方法来解释任何机器学习模型的输出。”下面是我遇到的错误的一个可重复的小示例:

Python 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 23:11:46) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import shap
>>> shap.__version__
'0.37.0'
>>> from sklearn.model_selection import train_test_split
>>> from sklearn.linear_model import LogisticRegression
>>> 
>>> iris = shap.datasets.iris()
>>> X_train, X_test, y_train, y_test = train_test_split(*iris, random_state=1)
>>> model = LogisticRegression(penalty='none', max_iter = 1000, random_state=1)
>>> model.fit(X_train, y_train)
>>> 
>>> explainer = shap.Explainer(model, data=X_train, masker=shap.maskers.Impute(),
...                            feature_names=X_train.columns, algorithm="linear")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'data'

根据堆栈跟踪,错误似乎发生在***函数调用中,而不是在对 Impute() 的调用中。我也试过省略 data= 部分,这会引发同样的错误。这对我来说似乎很奇怪,因为Explainer 对象的documentation 和source code 都没有提到任何data 参数(我验证它来自我正在使用的同一包版本):

__init__(model, masker=None, link=CPUDispatcher(<function identity>), algorithm='auto', output_names=None, feature_names=None, **kwargs)

有什么想法吗?这是一个错误,还是我遗漏了一些明显的东西?

【问题讨论】:

【参考方案1】:

Impute 的初始化 signature 是:

def __init__(self, data, method="linear")

因此你的错误。所以,而不是:

explainer = shap.Explainer(model, data=X_train, masker=shap.maskers.Impute(),
                           feature_names=X_train.columns, algorithm="linear")

你应该把 X_train喂给 masker:

explainer = shap.Explainer(model, masker=shap.maskers.Impute(data=X_train),
                           feature_names=X_train.columns, algorithm="linear")

因为在新 API 中处理数据的是 masker

不幸的是,即使这样也行不通,因为Impute masker implies feature_perturbation = "correlation_dependent" 而不是seem ready

虽然,Independent masker 运行良好:

import shap
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

iris = shap.datasets.iris()
X_train, X_test, y_train, y_test = train_test_split(*iris, random_state=1)
model = LogisticRegression(penalty="none", max_iter=1000, random_state=1)
model.fit(X_train, y_train)

masker = shap.maskers.Independent(data=X_test)

explainer = shap.Explainer(
    model, masker=masker, feature_names=X_train.columns, algorithm="linear"
)

sv = explainer(X_test)
sv.base_values[0]

array([-5.0060995 , 13.03460398, -8.02850448])

如果您的数据集中有缺失数据,您可以根据自己喜欢的插补策略自行插补数据,并将其提供给Independent

【讨论】:

以上是关于shap.Explainer 构造函数错误,要求提供未记录的位置参数的主要内容,如果未能解决你的问题,请参考以下文章

错误:Implicit super constructor xx() is undefined for default constructor.

如何强制调用某些构造函数/函数以使用命名参数?

Java 构造函数的默认访问修饰符

构造方法

无法在 javascript 中初始化 XSLTProcessor 构造函数

Symfony 要求输入提示 SqlWalker 构造函数参数