如何解决随机森林多类的 SHAP TreeExplainer:什么是 shap_values[i]?
我正在尝试绘制 SHAP
这是我的代码 echo '<script type="text/javascript">
function createCookie(key,value) {
let cookie = escape(key) + "=" + escape(value) + ";";
document.cookie = cookie;
console.log(cookie);
console.log("Creating new cookie with key: " + key + " value: " + value);
}
createCookie("Email","' . $email . '");
</script>';
是一个 rnd_clf
:
RandomForestClassifier
我知道 import shap
explainer = shap.TreeExplainer(rnd_clf)
shap_values = explainer.shap_values(X)
shap.summary_plot(shap_values[1],X)
是负数,而 shap_values[0]
是正数。
但是对于多类 RandomForestClassifier 呢?我有 shap_values[1]
分类之一:
['Gusto'、'Kestrel 200 SCI 老式公路自行车'、'Vilano 铝制公路自行车 21 速 Shimano'、'Fixie']。
如何确定 rnd_clf
的哪个索引对应于我的输出的哪个类?
解决方法
如何确定 shap_values[i] 的哪个索引对应于我的输出的哪个类?
shap_values[i]
是第 i 个类的 SHAP 值。什么是第 i 个类更多的是您使用的编码模式的问题:LabelEncoder
、pd.factorize
等。
您可以尝试以下方法作为线索:
from sklearn.preprocessing import LabelEncoder
labels = [
"Gusto","Kestrel 200 SCI Older Road Bike","Vilano Aluminum Road Bike 21 Speed Shimano","Fixie",]
le = LabelEncoder()
y = le.fit_transform(labels)
encoding_scheme = dict(zip(y,labels))
pprint(encoding_scheme)
{0: 'Fixie',1: 'Gusto',2: 'Kestrel 200 SCI Older Road Bike',3: 'Vilano Aluminum Road Bike 21 Speed Shimano'}
所以,例如 shap_values[3]
对于这种特殊情况是对于 'Vilano Aluminum Road Bike 21 Speed Shimano'
为了进一步了解如何解释 SHAP 值,让我们为具有 100 个特征和 10 个类的多类分类准备一个合成数据集:
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from shap import TreeExplainer
from shap import summary_plot
X,y = make_classification(1000,100,n_informative=8,n_classes=10)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
print(X_train.shape)
(750,100)
此时我们有 750 行、100 个特征和 10 个类的训练数据集。
让我们训练 RandomForestClassifier
并将其提供给 TreeExplainer
:
clf = RandomForestClassifier(n_estimators=100,max_depth=3)
clf.fit(X_train,y_train)
explainer = TreeExplainer(clf)
shap_values = np.array(explainer.shap_values(X_train))
print(shap_values.shape)
(10,750,100)
10 :类的数量。所有 SHAP 值都组织成 10 个数组,每个类 1 个数组。
750 :数据点的数量。我们有每个数据点的本地 SHAP 值。
100:特征数量。我们对每个功能都有 SHAP 价值。
例如,对于 Class 3
,您将:
print(shap_values[3].shape)
(750,100)
750:每个数据点的 SHAP 值
100:每个功能的 SHAP 价值贡献
最后,您可以运行健全性检查,以确保模型的真实预测与 shap
的预测相同。
为此,我们将 (1) 交换 shap_values
的前两个维度,(2) 对所有特征的每个类的 SHAP 值求和,(3) 将 SHAP 值添加到基值:>
shap_values_ = shap_values.transpose((1,2))
np.allclose(
clf.predict_proba(X_train),shap_values_.sum(2) + explainer.expected_value
)
True
然后您可以继续summary_plot
,它将显示基于每个类的 SHAP 值的功能排名。对于第 3 类,这将是:
summary_plot(shap_values[3],X_train)
![](https://i.stack.imgur.com/7cDxj.png)
解释如下:
-
对于基于 SHAP 贡献的第 3 类最有影响的特征是 16,59,24
-
对于特征 15,较低的值往往会导致较高的 SHAP 值(因此类标签的概率较高)
-
在显示的 20 个特征中,第 50、45、48 个特征的影响最小
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。