この記事では、SHAP: 機械学習のモデルの説明について説明します。

WBOY
リリース: 2024-06-01 10:58:13
オリジナル
783 人が閲覧しました

機械学習とデータ サイエンスの分野では、モデルの解釈可能性が研究者や実務者にとって常に焦点となってきました。深層学習やアンサンブル手法などの複雑なモデルが広く適用されるようになったことで、モデルの意思決定プロセスを理解することが特に重要になってきました。 Explainable AI | XAI は、モデルの透明性を高めることで、機械学習モデルに対する信頼と自信を構築するのに役立ちます。 モデルの透明性の向上は、複数の複雑なモデルの普及や、モデルを説明するための意思決定プロセスなどの方法によって実現できます。これらの方法には、特徴重要度分析、モデル予測間隔推定、ローカル解釈可能性アルゴリズムなどが含まれます。特徴重要度分析では、入力特徴に対するモデルの影響度を評価することで、モデルの意思決定プロセスを説明できます。モデル予測間隔の推定により、モデル予測に関する決定的な情報が得られます。ローカル解釈可能アルゴリズムが役立ちます

XAI は、機械学習モデルがどのように意思決定を行うかを理解し、説明するためのツールとフレームワークのセットです。その中でも、Python の SHAP (SHApley Additive Explains) ライブラリは非常に便利なツールです。 SHAP ライブラリは、個々の予測と全体的な予測に対する特徴の寄与を定量化し、美しく使いやすい視覚化を提供します。

次に、Scikit-learn で構築された回帰および分類モデルの予測を理解するために、SHAP ライブラリの基本について概説します。

この記事では、SHAP: 機械学習のモデルの説明について説明します。

SHAP と SHAP 値

SHAP (Shapley Additive Explains) は、機械学習モデルの出力を解釈するためのゲーム理論の手法です。これは、古典的なゲーム理論のゲーム値とその関連拡張機能を活用して、最適なクレジット割り当てとローカル解釈を組み合わせます (詳細と引用については、関連論文を参照してください: https://github.com/shap/shap#quotes)。 SHAP は、モデル出力に対する各特徴の寄与を計算することにより、最適なクレジット割り当てと局所的な説明を提供します。このアプローチは、線形モデル、ツリー モデル、深層学習モデルなど、さまざまなタイプのモデルに適用できます。 SHAP の目標は、機械学習モデルの意思決定プロセスと予測結果に対する各機能の影響を理解するのに役立つ、直感的で解釈可能な方法を提供することです。 SHAP 値と関連拡張機能を使用することで、特徴の重要性をより正確かつ包括的に解釈することができ、モデルの SHAP+ 前の値は、予測に対する特徴の寄与を定量化するのに役立ちます。 SHAP 値がゼロに近づくほど、予測に対する特徴の寄与は小さくなり、SHAP 値がゼロから遠ざかるほど、予測に対する特徴の寄与は大きくなります。さらに、SHAP 値からは、予測に対する特徴の寄与もわかります。 SHAP 値がゼロに近い場合は、その特徴が予測にほとんど寄与していないことを意味し、SHAP 値がゼロから遠い場合は、

shap パッケージをインストールします:

pip install shap-i https://pypi.tuna.tsinghua.edu.cn/simple
ログイン後にコピー
次の例を見てみましょう。回帰問題のSHAP値の特徴を取得します。まずライブラリとサンプル データをロードし、糖尿病の進行を予測するモデルをすばやく構築します。

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import (RandomForestRegressor, RandomForestClassifier)import shapshap.initjs()# Import sample datadiabetes = load_diabetes(as_frame=True)X = diabetes['data'].iloc[:, :4] # Select first 4 columnsy = diabetes['target']# Partition dataX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)print(f"Training features shape: {X_train.shape}")print(f"Training target shape: {y_train.shape}\n")print(f"Test features shape: {X_test.shape}")print(f"Test target shape: {y_test.shape}")display(X_train.head())# Train a simple modelmodel = RandomForestRegressor(random_state=42)model.fit(X_train, y_train)
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。 SHAP 値を取得する一般的な方法は、Explainer オブジェクトを使用することです。次に、Explainer オブジェクトを作成し、テスト データの shap_test 値を抽出します。

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Shap values length: {len(shap_test)}\n")print(f"Sample shap value:\n{shap_test[0]}")
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。shap_test には、各テスト インスタンスのレコードが含まれているため、長さは 89 です。最初のテスト レコードを見ると、それには 3 つの属性が含まれていることがわかります:

shap_test[0].base_values: ターゲットの基本値

shap_test[0].data: 各特徴の値

shap_test[ 0].values: 各オブジェクトの SHAP 値

base value: 基本値 (shap_test.base_values)、期待値 (explainer.expected_value) とも呼ばれ、トレーニング データのターゲット値の平均です。
print(f"Expected value: {explainer.expected_value[0]:.1f}")print(f"Average target value (training data): {y_train.mean():.1f}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.1f}")
ログイン後にコピー
EaShap_test.data には同じ値が含まれています

この記事では、SHAP: 機械学習のモデルの説明について説明します。

Rreeee
values: Shap_test の最も重要な属性は値です。これを介して Shap 値にアクセスできるためです。操作を簡単にするために、SHAP 値を DataFrame に変換しましょう:

この記事では、SHAP: 機械学習のモデルの説明について説明します。

(shap_test.data == X_test).describe()
ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    可以看到每条记录中每个特征的 SHAP 值。如果将这些 SHAP 值加到期望值上,就会得到预测值:

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    np.isclose(model.predict(X_test),  explainer.expected_value[0] + shap_df.sum(axis=1))
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    现在我们已经有了 SHAP 值,可以进行自定义可视化,如下图所示,以理解特征的贡献:

    columns = shap_df.apply(np.abs).mean()\ .sort_values(ascending=False).indexfig, ax = plt.subplots(1, 2, figsize=(11,4))sns.barplot(data=shap_df[columns].apply(np.abs), orient='h', ax=ax[0])ax[0].set_title("Mean absolute shap value")sns.boxplot(data=shap_df[columns], orient='h', ax=ax[1])ax[1].set_title("Distribution of shap values");plt.show()
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    左侧子图显示了每个特征的平均绝对 SHAP 值,而右侧子图显示了各特征的 SHAP 值分布。从这些图中可以看出,bmi 在所使用的4个特征中贡献最大。

    Shap 内置图表

    虽然我们可以使用 SHAP 值构建自己的可视化图表,但 shap 包提供了内置的华丽可视化图表。在本节中,我们将熟悉其中几种选择的可视化图表。我们将查看两种主要类型的图表:

    • 全局:可视化特征的整体贡献。这种类型的图表显示了特征在整个数据集上的汇总贡献。
    • 局部:显示特定实例中特征贡献的图表。这有助于我们深入了解单个预测。
    • 条形图/全局:对于之前显示的左侧子图,有一个等效的内置函数,只需几个按键即可调用:
    shap.plots.bar(shap_test)
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    这个简单但有用的图表显示了特征贡献的强度。该图基于特征的平均绝对 SHAP 值而生成:shap_df.apply(np.abs).mean()。特征按照从上到下的顺序排列,具有最高平均绝对 SHAP 值的特征显示在顶部。

    • 总结图/全局:另一个有用的图是总结图:
    shap.summary_plot(shap_test)
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    以下是解释这张图的指南:

    • 图的横轴显示了特征的 SHAP 值分布。每个点代表数据集中的一个记录。例如,我们可以看到对于 BMI 特征,点的分布相当散乱,几乎没有点位于 0 附近,而对于年龄特征,点更加集中地分布在 0 附近。
    • 点的颜色显示了特征值。这个额外的维度允许我们看到随着特征值的变化,SHAP 值如何变化。换句话说,我们可以看到关系的方向。例如,我们可以看到当 BMI 较高时(由热粉色点表示)SHAP 值倾向于较高,并且当 BMI 较低时(由蓝色点表示)SHAP 值倾向于较低。还有一些紫色点散布在整个光谱中。

    • 热力图/全局:热力图是另一种可视化 SHAP 值的方式。与将 SHAP 值聚合到平均值不同,我们看到以颜色编码的个体值。特征绘制在 y 轴上,记录绘制在 x 轴上:
    shap.plots.heatmap(shap_test)
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    这个热力图的顶部还补充了每个记录的预测值(即 f(x))的线图。

    • Force plot/全局:这个交互式图表允许我们通过记录查看 SHAP 值的构成。
    shap.initjs()shap.force_plot(explainer.expected_value, shap_test.values, X_test)
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    就像热力图一样,x 轴显示每个记录。正的 SHAP 值显示为红色,负的 SHAP 值显示为蓝色。例如,由于第一个记录的红色贡献比蓝色贡献多,因此该记录的预测值将高于期望值。

    交互性允许我们改变两个轴。例如,y 轴显示预测值 f(x),x 轴根据输出(预测)值排序,如上面的快照所示。

    • 条形图/局部:现在我们将看一下用于理解个别案例预测的图表。让我们从一个条形图开始:
    shap.plots.bar(shap_test[0])
    ログイン後にコピー

    この記事では、SHAP: 機械学習のモデルの説明について説明します。

    与“ 条形图/全局 ”中完全相同,只是这次我们将数据切片为单个记录。

  1. Force plot/局部:Force plot是单个记录的强制图。
shap.initjs()shap.plots.force(shap_test[0])
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

分类模型的SHAP values/图表

上面示例是回归模型,下面我们以分类模型展示SHAP values及可视化:

import numpy as npnp.set_printoptions(formatter={'float':lambda x:"{:.4f}".format(x)})import pandas as pdpd.options.display.float_format = "{:.3f}".formatimport seaborn as snsimport matplotlib.pyplot as pltsns.set(style='darkgrid', context='talk', palette='rainbow')from sklearn.datasets import load_diabetesfrom sklearn.model_selection import train_test_splitfrom sklearn.ensemble import RandomForestClassifierimport shapfrom sklearn.datasets import fetch_openml# 加载 Titanic 数据集titanic = fetch_openml('titanic', version=1, as_frame=True)df = titanic.frame# 选择特征和目标变量features = ['pclass', 'age', 'sibsp', 'parch', 'fare']df = df.dropna(subset=features + ['survived'])# 删除包含缺失值的行X = df[features]y = df['survived']# 分割数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林分类器model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

和回归模型一样的,shap values 值也是包括base_values 和values 值:

explainer = shap.Explainer(model)shap_test = explainer(X_test)print(f"Length of shap_test: {len(shap_test)}\n")print(f"Sample shap_test:\n{shap_test[0]}")print(f"Expected value: {explainer.expected_value[1]:.2f}")print(f"Average target value (training data): {y_train}")print(f"Base value: {np.unique(shap_test.base_values)[0]:.2f}")shap_df = pd.DataFrame(shap_test.values[:,:,1],  columns=shap_test.feature_names,  index=X_test.index)shap_df
ログイン後にコピー

我们仔细检查一下将 shap 值之和添加到预期概率是否会给出预测概率:

np.isclose(model.predict_proba(X_test)[:,1],  explainer.expected_value[1] + shap_df.sum(axis=1))
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

内置图与回归模型是一致的,比如:

shap.plots.bar(shap_test[:,:,1])
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

或者瀑布图如下:

shap.plots.waterfall(shap_test[:,:,1][0])
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

示例

看一个具体的用例。我们将找出模型对幸存者预测最不准确的例子,并尝试理解模型为什么会做出错误的预测:

test = pd.concat([X_test, y_test], axis=1)test['probability'] = model.predict_proba(X_test)[:,1]test['order'] = np.arange(len(test))test.query("survived=='1'").nsmallest(5, 'probability')
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

生存概率为第一个记录的746。让我们看看各个特征是如何对这一预测结果产生贡献的:

ind1 = test.query("survived=='1'")\ .nsmallest(1, 'probability')['order'].values[0]shap.plots.waterfall(shap_test[:,:,1][ind1])
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

主要是客舱等级和年龄拉低了预测值。让我们在训练数据中找到类似的例子:

pd.concat([X_train, y_train], axis=1)[(X_train['pclass']==3) & (X_train['age']==29) & (X_train['fare'].between(7,8))]
ログイン後にコピー

この記事では、SHAP: 機械学習のモデルの説明について説明します。

所有类似的训练实例实际上都没有幸存。现在,这就说得通了!这是一个小的分析示例,展示了 SHAP 如何有助于揭示模型为何会做出错误预测。

在机器学习和数据科学中,模型的可解释性一直备受关注。可解释人工智能(XAI)通过提高模型透明度,增强对模型的信任。SHAP库是一个重要工具,通过量化特征对预测的贡献,提供可视化功能。本文介绍了SHAP库的基础知识,以及如何使用它来理解回归和分类模型的预测。通过具体用例,展示了SHAP如何帮助解释模型错误预测。

以上がこの記事では、SHAP: 機械学習のモデルの説明について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート