赞
踩
SHAP(SHapley Additive exPlanations)是一个流行的Python库,用于解释机器学习模型的预测。它基于博弈论中的沙普利值
,为模型预测提供直观的解释。以下是一些常见的使用案例:
特征重要性解释:
模型比较:
可视化工具:
力导向图(force plots)
、总结图(summary plots)
和依赖图(dependence plots)
,这些工具有助于更好地理解模型的行为。在机器学习领域,理解模型是至关重要的一环。SHAP(SHapley Additive exPlanations)是一个强大的工具,可用于解释模型的预测结果。本文将介绍如何使用SHAP库解释随机森林分类器的在鸢尾花数据集上的预测结果。
pip install shap
pip install scikit-learn
pip install pandas
pip install numpy
pip install matplotlib
import shap
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
使用鸢尾花数据集进行演示:
data = load_iris()
X, y = data.data, data.target
feature_names = data.feature_names
target_names = data.target_names
# 下面将特征值转为DataFrame是为了在可视化的时候能够直接绘制出特征名称。
X = pd.DataFrame(X, columns=feature_names)
将数据集分为训练集和测试集:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
使用随机森林分类器进行模型训练:
model = RandomForestClassifier()
model.fit(X_train, y_train)
创建SHAP解释器并计算测试集的SHAP值:
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
将SHAP值转换为NumPy数组:
# 因为在博主所用的版本中,shap_values()返回的是一个list,
# 想要享受numpy的便利就必须转为ndarray。
# 吐槽:这很神奇......因为印象中的机器学习库都会返回ndarray或者DataFrame。
shap_values = np.array(shap_values)
选择一个实例,并获取其预测类别和类别名称:
instance_index = 0
instance = X_test.iloc[[instance_index]]
predicted_class = model.predict(instance)[0]
predicted_class_name = target_names[predicted_class]
使用force plot可视化第一个预测的解释:
# 一个简单的函数,为了减少代码量而生,功能是快速绘制出带有特征名称及类别名称的各个力导向图。 def plot_force_with_names(predicted_class, predicted_class_name, instance_index, instance): """ :param predicted_class: 模型输出的类型,用数值表示 :param predicted_class_name: 预测出的类型的名称 :param instance_index: 实例所对应的位置索引,用于获取对应的shap_value。 :param instance: 包含该实例的各个特征名称以及特征值的DataFrame :return: """ shap.initjs() shap.force_plot(explainer.expected_value[predicted_class], shap_values[predicted_class, instance_index], instance, show=False, matplotlib=True) # 显示带有目标名称的force plot标题 plt.title(f'Force plot for prediction: {predicted_class_name}') plt.show() for clss_index in range(len(target_names)): class_name = target_names[clss_index] plot_force_with_names(clss_index, class_name, instance_index, instance)
可以看到该样本的特征不断将随机森林的决策远离山鸢尾。
可以看到该样本的特征不断将随机森林的决策推向变色鸢尾。
可以看到该样本的特征不断将随机森林的决策远离维吉尼亚鸢尾。
这三个图展示了该随机森林模型的四个特征(花萼的长度、宽度,以及花瓣的长度、宽度)对决策的影响方向。
通过以上步骤,我们成功地使用SHAP库解释了随机森林分类器的预测结果。这种解释有助于深入了解模型如何进行预测,增强模型的可解释性,从而提高对模型的信任度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。