Python 如何使用TreeExplainer形状图的y轴标签创建列表?

Python 如何使用TreeExplainer形状图的y轴标签创建列表?,python,charts,shap,Python,Charts,Shap,如何使用treeeexplainershap图表的y轴标签创建列表 你好, 我能够生成一个图表,按照y轴上的重要性顺序对变量进行排序。以图形形式可视化是一个重要的解决方案,但现在我需要提取有序变量列表,因为它们位于图形的y轴上。有人知道怎么做吗?我在这里放了一张示例图片 备注:抱歉,我无法添加最小的可复制示例。我不知道如何在这里粘贴Jupyter笔记本的单元格,所以我在下面粘贴了通过Github共享的代码链接 在本例中,列表将是“vB0、mB1、vB1、mB2、mB0、vB2” TL;DR

如何使用
treeeexplainer
shap图表的y轴标签创建列表

你好,

我能够生成一个图表,按照y轴上的重要性顺序对变量进行排序。以图形形式可视化是一个重要的解决方案,但现在我需要提取有序变量列表,因为它们位于图形的y轴上。有人知道怎么做吗?我在这里放了一张示例图片

备注:抱歉,我无法添加最小的可复制示例。我不知道如何在这里粘贴Jupyter笔记本的单元格,所以我在下面粘贴了通过Github共享的代码链接

在本例中,列表将是“vB0、mB1、vB1、mB2、mB0、vB2”

TL;DR

sv=np.数组(形状值)
sv_平均值=np.abs(sv).平均值(1).和(0)
order=np.argsort(sv_平均值)[:-1]
有序列=X测试列[顺序]
打印(已订购)
将上面的代码块附加到您链接的笔记本上,您将得到您想要的

完整答案

summary_plot
显示按形状值的平均值之和排序的列。不能从绘图中提取它们,但可以计算它们

完全可复制的示例:

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

X, y = make_classification(n_samples=1000, n_features=30,
          n_classes=5, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
rf_clf = RandomForestClassifier(random_state=42)
rf_clf.fit(X_train, y_train)

explainer = TreeExplainer(rf_clf)
shap_values = explainer.shap_values(X_test)
summary_plot(shap_values, max_display=10)



如果有什么不清楚的地方,请询问。

请。亲爱的谢尔盖·布什马诺夫,非常感谢您的回答。如果可能的话,我只会要求一个小的编辑。我需要一个包含图表中显示的“功能名称”的列表,而不仅仅是包含索引的数组。可以这样对列表排序吗?@ViniciusPG First代码块<代码>订单是订单<代码>X_测试。列是列<代码>X_测试。列[顺序]是按顺序排列的列,如图表中所示。将此块附加到记事本的末尾我单击了“接受解决方案”,我不知道这会阻止代码。我已暂时删除接受,以便可以编辑。查看是否可能,并在准备好后让我知道是否可以再次接受,这样完整的解决方案已保存在代码中。@ViniciusPG您是否能够读取第一个代码块?您需要的一切都已在答案中。以下是指向您的解决方案的链接。不完美的仍然缺少一些东西。我将import numpy命名为np,但仍然缺少列,如您在此处所见:
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from shap import TreeExplainer, summary_plot

X, y = make_classification(n_samples=1000, n_features=30,
          n_classes=5, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
rf_clf = RandomForestClassifier(random_state=42)
rf_clf.fit(X_train, y_train)

explainer = TreeExplainer(rf_clf)
shap_values = explainer.shap_values(X_test)
summary_plot(shap_values, max_display=10)
sv = np.array(shap_values)
sv_mean=np.abs(sv).mean(1).sum(0)
order = np.argsort(sv_mean)[::-1]
print(order)
array([17, 15, 26,  4, 24,  3, 20,  1,  2, 27, 10, 12, 22, 11, 21, 23,  9,
       28, 19,  7, 16,  8,  5, 14, 25,  0, 13,  6, 29, 18])