0
df = pd.read_csv("data.csv")
pca = PCA(n_components=2)
df_2d = pca.fit_transform(df)

clusterer = hdbscan.HDBSCAN(min_cluster_size=1000)
clusterer.fit(df_2d)

clf = LGBMClassifier()
clf.fit(df_2d, clusterer.labels_) ###

explainer = shap.TreeExplainer(clf)
shap_values = explainer.shap_values(df_2d) ###
shap.summary_plot(shap_values, df_2d, plot_type="bar", plot_size=(15, 10)) ###

这是我的代码。它运行完美,但返回带有“功能 1”和“功能 2”的摘要图。这完全有道理,因为我给了它一个仅包含 2 列的数据集。但是我的问题是,我怎样才能让它根据原始数据解释我的决策树的决策?

我已经尝试过此代码,并且它没有错误地工作,但我不确定我是否正确使用它。(不同的是我在分类器和 shap 中都将 df_2d 更改为原始 df)

df = pd.read_csv("data.csv")
pca = PCA(n_components=2)
df_2d = pca.fit_transform(df)

clusterer = hdbscan.HDBSCAN(min_cluster_size=1000)
clusterer.fit(df_2d)

clf = LGBMClassifier()
clf.fit(df, clusterer.labels_) ###

explainer = shap.TreeExplainer(clf)
shap_values = explainer.shap_values(df) ###
shap.summary_plot(shap_values, df, plot_type="bar", plot_size=(15, 10)) ###

感谢您的时间和帮助!

4

1 回答 1

0

您可以使用 KernelExplainer 类,它是一种与模型无关的方法。

# create pipeline
blackbox_model = Pipeline([('scaler', scaler), ('pca', pca), ('clf', clf)])

# fit model
blackbox_model.fit(X_train, Y_train)


# load JS vis in the notebook
shap.initjs() 

# initiate explainer with pipeline function
explainer = shap.KernelExplainer(blackbox_model.predict_proba, X_train)

# get shapley values for one instance
shap_values = explainer.shap_values(X_test.iloc[0,:])

# plot
shap.force_plot(explainer.expected_value[1], shap_values[1], X_test.iloc[0,:])

更多细节在这里:https ://shap.readthedocs.io/en/latest/example_notebooks/tabular_examples/model_agnostic/Iris%20classification%20with%20scikit-learn.html
https://shap-lrjball.readthedocs.io/en/latest /生成/shap.KernelExplainer.html

于 2021-12-31T13:29:36.313 回答