gpt4 book ai didi

python-3.x - shap.TreeExplainer 和 shap.Explainer 条形图之间的区别

转载 作者:行者123 更新时间:2023-12-05 01:50:11 66 4
gpt4 key购买 nike

对于下面给出的代码,我得到了 shap 值的不同条形图。

在这个例子中,我有一个包含 1000 个 train 样本和 9 个类和 500 个 test 样本的数据集。然后我使用随机森林作为分类器并生成一个模型。当我着手生成 shap 条形图时,我在这两个场景中得到了不同的结果:

shap_values_Tree_tr = shap.TreeExplainer(clf.best_estimator_).shap_values(X_train)
shap.summary_plot(shap_values_Tree_tr, X_train)

enter image description here

然后:

explainer2 = shap.Explainer(clf.best_estimator_.predict, X_test)
shap_values = explainer2(X_test)

enter image description here

您能解释一下这两个图之间的区别是什么以及使用哪个图来衡量特征重要性吗?

这是我的代码:

from sklearn.datasets import make_classification
import seaborn as sns
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import pickle
import joblib
import warnings
import shap
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV

f, (ax1,ax2) = plt.subplots(nrows=1, ncols=2,figsize=(20,8))
# Generate noisy Data
X_train,y_train = make_classification(n_samples=1000,
n_features=50,
n_informative=9,
n_redundant=0,
n_repeated=0,
n_classes=10,
n_clusters_per_class=1,
class_sep=9,
flip_y=0.2,
#weights=[0.5,0.5],
random_state=17)

X_test,y_test = make_classification(n_samples=500,
n_features=50,
n_informative=9,
n_redundant=0,
n_repeated=0,
n_classes=10,
n_clusters_per_class=1,
class_sep=9,
flip_y=0.2,
#weights=[0.5,0.5],
random_state=17)

model = RandomForestClassifier()

parameter_space = {
'n_estimators': [10,50,100],
'criterion': ['gini', 'entropy'],
'max_depth': np.linspace(10,50,11),
}

clf = GridSearchCV(model, parameter_space, cv = 5, scoring = "accuracy", verbose = True) # model
my_model = clf.fit(X_train,y_train)
print(f'Best Parameters: {clf.best_params_}')

# save the model to disk
filename = f'Testt-RF.sav'
pickle.dump(clf, open(filename, 'wb'))

shap_values_Tree_tr = shap.TreeExplainer(clf.best_estimator_).shap_values(X_train)
shap.summary_plot(shap_values_Tree_tr, X_train)

explainer2 = shap.Explainer(clf.best_estimator_.predict, X_test)
shap_values = explainer2(X_test)

shap.plots.bar(shap_values)

感谢您的帮助和时间!

最佳答案

您的代码有两个问题:

  1. 不可复制
  2. 您似乎缺少 SHAP 包中的一些重要概念,即哪些数据用于“训练”解释器(“真实模型”或“真实数据”解释)以及哪些数据用于预测 SHAP 值。

就第一个而言,您可能会在网上找到很多教程甚至书籍。

关于第二个:

shap_values_Tree_tr = shap.TreeExplainer(clf.best_estimator_).shap_values(X_train)
shap.summary_plot(shap_values_Tree_tr, X_train)

不同于:

explainer2 = shap.Explainer(clf.best_estimator_.predict, X_test)
shap_values = explainer2(X_test)

因为:

  1. 首先使用经过训练的树进行预测;而第二个使用提供的 X_test 数据集来计算 SHAP 值。
  2. 此外,当你说
shap.Explainer(clf.best_estimator_.predict, X_test)

我很确定这不是用于训练解释器的整个数据集 X_test,而是它的 100 个数据点子集。

  1. 最后,
shap.TreeExplainer(clf.best_estimator_).shap_values(X_train)

不同于

explainer2(X_test)

在第一种情况下,您预测(和平均)X_train,而在第二种情况下,您预测(和平均)X_test。当您比较形状时,很容易确认这一点。

那么,如何调和这两者呢?请参阅下面的可重现示例:

1。用于训练解释器的导入、模型和数据:

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from shap import maskers
from shap import TreeExplainer, Explainer

X, y = make_classification(1500, 10)
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=1000, random_state=42)

clf = RandomForestClassifier()
clf.fit(X_train, y_train)

background = maskers.Independent(X_train, 10) # data to train both explainers on

2。比较解释器:

exp = TreeExplainer(clf, background)
sv = exp.shap_values(X_test)

exp2 = Explainer(clf, background)
sv2 = exp2(X_test)

np.allclose(sv[0], sv2.values[:,:,0])

True

我也许应该从一开始就说明这一点:两者保证显示相同的结果(如果使用正确),因为 Explainer 类是 TreeExplainer 的超集>(它在看到树模型时使用后者)。

有什么不明白的地方请提问。

关于python-3.x - shap.TreeExplainer 和 shap.Explainer 条形图之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73329209/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com