应用SHAP可解释框架对多种分类问题模型进行解释

模型可解释性成为机器学习流水线的一个基本部分。将机器学习模型作为“黑盒子”不再是一种选择。幸运的是,像lime、ExplainerDashboard、Shapash、Dalex等分析工具正在迅速发展,并变得越来越流行。本指南提供了一个实际示例,说明如何使用和解释开源python包SHAP,用于多类分类问题中的XAI分析,并使用它来改进模型。

由Lundberg和Lee(2016)提出的Shapley Additive explanation (Shapley Additive explained)是一种基于博弈论最优Shapley值来解释个体预测的方法。计算Shapley值以获得特征贡献的计算代价很高。为了提高计算效率,有两种方法来近似SHAP值:KernelSHAPTreeSHAP(仅适用于基于树的模型)。SHAP 提供基于 Shapley 值聚合的全局和局部解释方法。

在本指南中,我们将使用 Kaggle 数据集中的 Internet 防火墙数据集示例来演示多分类问题的一些 SHAP 输出图。

# load the csv file as a data frame
df = pd.read_csv('log2.csv')
y = df.Action.copy()
X = df.drop('Action',axis=1)

像往常一样创建模型并进行拟合。

X_train, X_test, y_train, y_test =
model_selection.train_test_split(X, y, random_state=0)cls =
RandomForestClassifier(max_depth=2, random_state=0)
cls.fit(X_train, y_train)

现在,为了对模型有一个基本的印象,我建议查看特征导入器和混淆矩阵。为了理解我们在特征重要性方面的立场,我使用了scikit-learn来计算每棵树中的杂质减少量

֫importances = cls.feature_importances_
indices = np.argsort(importances)
features = df.columns
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='g', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()

稍后我们可以将此结果与由 Shapley 值计算的特征重要性进行比较。

混淆矩阵

混淆矩阵是一种可视化模型性能的方法。更重要的是,我们可以很容易地看到模型完全错误。

class_names = ['drop', 'allow', 'deny', 'reset-both']
disp = plot_confusion_matrix(cls, X_test, y_test,
display_labels=class_names, cmap=plt.cm.Blues,
xticks_rotation='vertical')

模型无法从类重置中检测到任何实例。原因是不平衡的数据集,提供了少量的重置示例。

y.value_counts()
allow 37640
deny 14987
drop 12851
reset-both 54
Name: Action, dtype: int64

SHAP 汇总图

模型输出的 SHAP 值解释了特征如何影响模型的输出。

# compute SHAP values
explainer = shap.TreeExplainer(cls)
shap_values = explainer.shap_values(X)

现在我们可以绘制有助于分析模型的相关图。

shap.summary_plot(shap_values, X.values, plot_type="bar",
class_names= class_names, feature_names = X.columns)

在此图中,特征对类的影响被叠加以创建特征重要性图。因此,如果你创建特性是为了将一个特定的类与其他类区分开来,这就是你可以看到的图。换句话说,多类分类的摘要图可以向您展示机器设法从特征中学习的内容。

在下面的示例中,我们可以看到类 drop 几乎不使用 Destination Plot、Source Port 和 Bytes Sent 功能。我们还可以看到类允许和拒绝同样使用相同的功能。这就是它们之间的混淆度相对较高的原因。为了更好地区分允许和拒绝类,需要生成专用于此类的新功能。

您还可以查看特定类的 summary_plot。

shap.summary_plot(shap_values[1], X.values, feature_names = X.columns)

摘要情节结合了特色的重要性和特色的效果。摘要图上的每个点都是一个特征和实例的Shapley值。y轴上的位置由特征决定,x轴上的位置由Shapley值决定。可以看到,作为最不重要的特性,pkts_sent的Shapley值很低。颜色代表特征从低到高的值。重叠点在y轴方向上抖动,因此我们得到每个特征的Shapley值的分布。这些特征是根据它们的重要性排序的。

在总结图中,我们首先看到特征值和对预测的影响之间的关系。但要了解关系的确切形式,我们必须看看SHAP依赖图。

SHAP 依赖图

部分依赖图(短 PDP 或 PD 图)显示了一个或两个特征对机器学习模型的预测结果的边际效应(J. H. Friedman 2001)。部分依赖图可以显示目标和特征之间的关系是线性的、单调的还是更复杂的。

部分依赖图是一种全局方法:该方法考虑所有实例并给出关于特征与预测结果的全局关系的陈述。 PDP 的一个假设是第一个特征与第二个特征不相关。如果违反此假设,则为部分相关图计算的平均值将包括极不可能甚至不可能的数据点。

依赖图是一种散点图,显示单个特征对模型预测的影响。在这个例子中,当每个住宅的平均房间数高于 6 时,房产价值会显着增加。

· 每个点都是数据集中的一个预测(行)。

· x 轴是数据集中的实际值。

· y 轴是该特征的 SHAP 值,它表示知道该特征的值对该样本预测的模型输出的改变程度。

颜色对应于可能与我们正在绘制的特征有交互作用的第二个特征(默认情况下,第二个特征是自动选择的)。如果此其他特征与我们正在绘制的特征之间存在交互效应,它将显示为明显的垂直着色模式。

֫# If we pass a numpy array instead of a data frame then we
# need pass the feature names in separately
shap.dependence_plot(0, shap_values[0], X.values,
feature_names=X.columns)

在上面的示例中,我们可以看到功能、源端口和 NAT 源端口之间交互的清晰垂直着色模式。

SHAP 力图

力图为我们提供了单个模型预测的可解释性。在这个图中,我们可以看到特征如何影响模型对特定观察的预测。用于错误分析或对特定案例的深入理解非常方便。

i=8
shap.force_plot(explainer.expected_value[0],
shap_values[0][i], X.values[i], feature_names = X.columns)

从图中我们可以看出:

1.模型predict_proba值:0.79

2. 基值:这是当我们不知道当前实例的任何特征时预测的值。基值是模型输出在训练数据集上的平均值(解释器)。代码中的Expected_value)。在这个例子中,基值 = 0.5749

3. 绘图箭头上的数字是该实例的特征值。已用时间(秒)=5 且数据Packets = 1

4. 红色代表将模型分数推高的特征,蓝色代表将分数推低的特征。

5. 箭头越大,特征对输出的影响越大。在 x 轴上可以看到影响的减少或增加量。

6. 5 秒的 Elapsed Time 增加了允许类的属性,6.546 的 Packets 减少了属性值。

SHAP 瀑布图

瀑布图是另一个单实例预测的局部分析图。让我们以实例8为例:

row = 8
shap.waterfall_plot(shap.Explanation(values=shap_values[0][row],
base_values=explainer.expected_value[0], data=X_test.iloc[row],
feature_names=X_test.columns.tolist()))

1. f(x) 是模型 predict_proba 值:0.79。

2. E[f(x)] 是基值 = 0.5749。

3. 左边是特征值,箭头是特征对预测的贡献。

4. 每行显示每个特征的正(红色)或负(蓝色)贡献如何将值从背景数据集上的预期模型输出移动到此预测的模型输出 。

总结

SHAP框架已被证明是机器学习模型解释领域的一个重要进展。SHAP结合了几种现有的方法,创建了一种直观的、理论上合理的方法来解释任何模型的预测。SHAP值量化了特征对预测影响的大小和方向(正或负)。我相信使用SHAP和其他工具的XAI分析应该是机器学习管道中不可分割的一部分。

(0)

相关推荐