SHAP:Shapley additive explanations.一种博弈论方法,用于解释任何机器学习模型的输出。
官方解释文档:Welcome to the SHAP documentation — SHAP latest documentation
下面笔者将实例进行简单的运用讲解:
实例:用ResNet50网络对Imagenet50数据集进行分类
#导入必要库
import json
import numpy as np
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
import shap
# 加载预训练模型和数据集
model = ResNet50(weights='imagenet')
X, y = shap.datasets.imagenet50()
# 获取 ImageNet 1000 class names
url = "https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json"
with open(shap.datasets.cache(url)) as file:
class_names = [v[1] for v in json.load(file).values()]
#python function:获取模型输出;此处可替换为自己的模型.
def f(x):
tmp = x.copy()
preprocess_input(tmp)
return model(tmp)
接下来要创建一个masker,用以覆盖在图像上,以显示重要区域。
#创建一个masker覆盖图像
masker = shap.maskers.Image("inpaint_telea", X[0].shape)
# 创建解释器
explainer = shap.Explainer(f, masker, output_names=class_names)
# 举例解释两张图片的分类情况,用SHAP value
#outputs=shap.Explanation.argsort.flip[:4]:依次输出概率最大的四个可能的类别
shap_values = explainer(X[1:3], max_evals=100, batch_size=50, outputs=shap.Explanation.argsort.flip[:4])
# 输出
shap.image_plot(shap_values)
运行结果为:
第一张图,鸟被判别为了美洲白鹭(American Egret)。原因是脖子处弯曲的形状,这一特征对于其分类结果起着重要的作用,就如图中该处鲜艳的红色一般。
第二张图,船被判别为了快艇(speedboat)。原因是船的形状,同上,这一特征对于其分类结果起着重要的作用,就如图中该处鲜艳的红色一般。
下面,将max_evals调到500,首先时间由17s变为25s,运行时间变长。
shap_values = explainer(X[1:3], max_evals=500, batch_size=50, outputs=shap.Explanation.argsort.flip[:4])
得到结果如下:
可以直观看出方形块变小,更为细致显示了各处特征对于最终分类结果的贡献度。