在机器学习中使用 SHAP 值实现模型可解释性

发布时间 2023-08-06 17:14:43作者: tuyg

推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景

机器学习可解释性

机器学习可解释性是指用于解释和理解机器学习模型如何进行预测的技术。随着模型变得越来越复杂,解释它们的内在逻辑并深入了解它们的行为变得越来越重要。

这很重要,因为机器学习模型通常用于做出具有现实世界后果的决策,例如医疗保健、金融和刑事司法。如果没有可解释性,就很难知道机器学习模型是否做出了正确的决策,或者它是否有偏见。

在机器学习可解释性方面,需要考虑各种技术。一种流行的方法是确定特征重要性分数,该分数揭示了对模型预测影响最大的特征。SKlearn 模型默认提供特征重要性分数,但您也可以利用 SHAPLime 和 Yellowbrick 等工具来更好地可视化和理解机器学习结果。

本教程将介绍 SHAP 值以及如何使用 SHAP Python 包解释机器学习结果。

什么是 SHAP 值?

SHAP 值基于博弈论中的 Shapley 值。在博弈论中,Shapley值有助于确定协作博弈中的每个玩家对总支出的贡献。

对于机器学习模型,每个特征都被视为一个“玩家”。要素的 Shapley 值表示该要素在所有可能的特征组合中的贡献的平均量级。

具体而言,SHAP 值是通过比较存在和不存在特定特征的模型预测来计算的。这是针对数据集中的每个要素和每个样本以迭代方式完成的。

通过为每个特征分配每个预测的重要性值,SHAP 值提供了模型行为的本地、一致的解释。它们揭示了哪些特征对特定预测的影响最大,无论是正面的还是负面的。这对于理解复杂机器学习模型(如深度神经网络)背后的推理很有价值。

SHAP 值入门

在本节中,我们将使用 Kaggle 的移动价格分类数据集来构建和分析多分类模型。我们将根据功能(例如RAM,尺寸等)对手机价格进行分类。目标变量为 <code>price_range</code>,值为 0(低成本)、1(中等成本)、2(高成本)和 3(非常高的成本)。

注意:带有输出的代码源可在 Deepnote 工作区中找到。

安装 SHAP

使用<code>pip</code>或<code>conda</code>命令在系统上安装<code>shap</code>非常简单。

pip install shap

conda install -c conda-forge shap

加载数据

数据集干净且组织良好,使用标签编码器将类别转换为数字。

import pandas as pd

mobile = pd.read_csv("train.csv")
mobile.head()
在机器学习中使用 SHAP 值实现模型可解释性

准备数据

首先,我们将确定因变量和自变量,然后将它们拆分为单独的训练集和测试集。

from sklearn.model_selection import train_test_split

 
X = mobile.drop('price_range', axis=1)
y = mobile.pop('price_range')

# Train and test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

训练和评估模型

之后,我们将使用训练集训练我们的随机森林分类器模型,并在测试集上评估其性能。我们获得了 87% 的准确率,这是相当不错的,我们的模型总体上是平衡的。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# Model fitting
rf = RandomForestClassifier()
rf.fit(X_train, y_train)

# Prediction
y_pred = rf.predict(X_test)

# Model evaluation
print(classification_report(y_pred, y_test))
              precision    recall  f1-score   support

           0       0.95      0.91      0.93       141
           1       0.83      0.81      0.82       153
           2       0.80      0.85      0.83       158
           3       0.93      0.93      0.93       148

    accuracy                           0.87       600
   macro avg       0.88      0.87      0.88       600
weighted avg       0.87      0.87      0.87       600

计算 SHAP 值

在这一部分中,我们将创建一个 SHAP 树解释器,并使用它来计算测试集的 SHAP 值。

import shap
shap.initjs()

# Calculate SHAP values
explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_test)

摘要图

汇总图是模型中每个特征的特征重要性的图形表示。它是了解模型如何进行预测和识别最重要特征的有用工具。

在我们的例子中,它显示了每个目标类的特征重要性。事实证明,手机的“内存”,“battery_power”和尺寸在决定价格范围方面起着重要作用。

# Summarize the effects of features
shap.summary_plot(shap_values, X_test)
在机器学习中使用 SHAP 值实现模型可解释性

我们现在将可视化类“0”的未来重要性。我们可以清楚地看到,RAM、电池和手机尺寸对预测低成本手机有负面影响。

shap.summary_plot(shap_values[0], X_test)
在机器学习中使用 SHAP 值实现模型可解释性

依赖关系图

依赖图是一种散点图,用于显示特定特征如何影响模型的预测。在此示例中,功能为“battery_power”。

图的 x 轴显示“battery_power”的值,y 轴显示形状值。当电池电量超过1200时,开始对低端手机型号的分类产生负面影响。

shap.dependence_plot("battery_power", shap_values[0], X_test,interaction_index="ram")
在机器学习中使用 SHAP 值实现模型可解释性

力图

让我们将焦点缩小到单个样本。具体来说,我们将仔细研究第 12 个样本,看看哪些特征导致了“0”结果。为此,我们将使用力图并输入期望值、SHAP 值和测试样本。

事实证明,RAM、手机尺寸和时钟速度对型号的影响更大。我们还注意到,该模型不会预测“0”类,因为 f(x) 较低。

shap.plots.force(explainer.expected_value[0], shap_values[0][12,:], X_test.iloc[12, :], matplotlib = True)
在机器学习中使用 SHAP 值实现模型可解释性

我们现在将可视化类“1”的力图,我们可以看到它是正确的类。

shap.plots.force(explainer.expected_value[1], shap_values[1][12, :], X_test.iloc[12, :],matplotlib = True)
在机器学习中使用 SHAP 值实现模型可解释性

我们可以通过检查测试集的第 12 条记录来确认我们的预测。

y_test.iloc[12]
>>> 1

决策图

决策图可以成为了解机器学习模型决策过程的有用工具。它们可以帮助我们识别对模型预测最重要的特征,并识别潜在的偏差。

为了更好地理解影响模型预测类“1”的因素,我们将检查决策图。根据此图,手机高度似乎对模型有负面影响,而RAM则有积极影响。

shap.decision_plot(explainer.expected_value[1], shap_values[1][12,:], X_test.columns)
在机器学习中使用 SHAP 值实现模型可解释性

结论

在这篇博文中,我们介绍了 SHAP 值,这是一种解释机器学习模型输出的方法。我们已经展示了如何使用 SHAP 值来解释单个预测和模型的整体性能。我们还提供了如何在实践中使用 SHAP 值的示例。

随着机器学习扩展到医疗保健、金融和自动驾驶汽车等敏感领域,可解释性和可解释性只会变得越来越重要。SHAP 值提供了一种灵活、一致的方法来解释预测和模型行为。它可用于深入了解模型如何进行预测、识别潜在偏差并提高模型的性能。

原文链接:在机器学习中使用 SHAP 值实现模型可解释性 (mvrlink.com)