---
title: 【機械学習】SHAP分析やってみた
description: "案件において、DataRobotを扱う際にDataRobot内の機能としてSHAPが提供されていました。\nこの記事では、その際に調べたことをまとめると共にPythonでのSHAPを実装例を通して、SHAPに対する理解を深める一助になればと思います。"
---

[AIDXナレッジ - INSIGHT LAB](https://knowledge.insight-lab.co.jp/aidx)

# [【機械学習】SHAP分析やってみた](https://knowledge.insight-lab.co.jp/aidx/-機械学習-shap分析やってみた)

 作成者: [Budo Ogimoto](https://knowledge.insight-lab.co.jp/aidx/author/budo)｜2023年12月19日

## 初めに

案件において、DataRobotを扱う際にDataRobot内の機能としてSHAPが提供されていました。

この記事では、その際に調べたことをまとめると共にPythonでのSHAPを実装例を通して、SHAPに対する理解を深める一助になればと思います。

## SHAPについて

SHAP（SHapley Additive exPlanations）は、機械学習モデルの予測に対する各特徴量の寄与度を評価するための手法です。

この手法は、シャプレー値と呼ばれるゲーム理論から派生した「貢献度」を用いて、各特徴量が予測値にどの程度貢献しているかを算出することができます。

SHAPは、機械学習モデルの正確性と解釈可能性の両方を向上することができます。

モデルの予測結果を解釈することは、重要な決定を行う上で必要不可欠です。

SHAPは、ローカル解釈可能性（LIME）やパーティシパル・インタープリタブル・マシンラーニング（PDPbox）などの手法と比較して、モデル全体に対する解釈性を提供することができます。

また、SHAPは、異なる特徴量の組み合わせに対する相互作用の影響を評価することもできます。

SHAPは、Pythonのライブラリとして、様々な機械学習フレームワークに統合されています。

例えば、XGBoostやLightGBM、scikit-learnなどに統合されており、容易に利用することができます。

SHAPを使用することで、モデルの予測をより正確に理解し、説明することができます。

## 検証データセットの紹介・読み込み

今回利用するデータセットは、scikit-learnに収録されているカリフォルニア住宅価格のデータセットを利用します。

まずは、データのロードと整形を行います。

出力は以下の通り。

今回はSHAP機能を試すため、特段データセットの分割は行わず、このまま学習に進めます。

## 機械学習モデル構築

今回は、XG Boostを使いモデルを構築していきます。

SHAP機能を試す為にここもパラメータチューニング等の処理は省きますので悪しからず。

これで機械学習モデルの準備は完了しました。

## SHAPによる分析

まずは、ライブラリのインストールから行います。

次にSHAP値の算出を行います。

複数のプロットでSHAP値を確認することができます。  
以下では、各プロットを紹介します。

### waterfallプロット

waterfallプロットの出力スクリプトは下記の通りです。

このグラフでは、特定のレコードのSHAP値を可視化できます。  
主な用途としては、教師データから大幅に外れた予測値を出力した事例に対しての原因究明ができるかと思います。  
見方としては、$E\[f(X)\]=2.068$が訓練データに対するモデルの予測値の平均であり、このラインを基準として各説明変数に対する寄与度を計算しています。  
上図の赤と青の帯は寄与度であり、赤が正値、青が負値に寄与している。  
図中の$f(X)=4.413$がこのレコードの予測値になります。  
上図の例では、MedIncとLongitudeが大きく正に寄与しているとわかります。

### beeswarmプロット

beeswarmプロットの出力スクリプトは下記の通りです。

このグラフでは、導入した全データに対して横軸にSHAP値縦軸に説明変数が置かれています。  
横幅が広い場合、SHAP値の絶対値が高く予測に大きく寄与していると分かります。  
また、各プロットの色については各説明変数値の高低を表しており、SHAP値と各説明変数値の関係が見えてくるかと思います。  
上図の例では、LatitudeとLongitudeはSHAP値と説明変数値が半比例の関係であり、MedIncが比例の関係にあることがわかります。

### barプロット

barプロットの出力スクリプトは下記の通りです。

このグラフはシンプルに各説明変数間のSHAP値を比較が可能です。  
このグラフを確認することでモデルの全体傾向をつかむことができます。  
上図の例では、Latitude、Longitude、MedIncが大きく予測値に寄与していることが分かります。

### scatterプロット

scatterプロットの出力スクリプトは下記の通りです。

横軸に指定した説明変数量をとり、縦軸は指定した説明変数のSHAPを取ります。  
これにより、SHAPと説明変数の依存関係を確認することができます。  
また、説明変数量とSHAP値の間に相関が見られる場合は、目的変数への影響度も高いと考えられます。

## 最後に

この記事では、SHAPについて代表的なグラフを出力しながら説明してみました。  
機械学習モデルでは往々にして推論根拠を求められるシーンもあるため、知っていて損はないと思います。

[完全な記事を表示](https://knowledge.insight-lab.co.jp/aidx/-機械学習-shap分析やってみた)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Budo Ogimoto"
  },
  "dateModified" : "2023-12-19T03:06:29.978Z",
  "datePublished" : "2023-12-19T03:06:29Z",
  "headline" : "【機械学習】SHAP分析やってみた",
  "image" : {
    "@type" : "ImageObject",
    "height" : 814,
    "url" : "https://download.insight-lab.co.jp/hubfs/image-20230626233657873.png",
    "width" : 1400
  },
  "mainEntityOfPage" : "https://knowledge.insight-lab.co.jp/aidx/-機械学習-shap分析やってみた",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60,
      "url" : "/hs/hsstatic/content_shared_assets/static-1.4092/img/default-amp-logo.png",
      "width" : 60
    },
    "name" : "AIDXナレッジ - INSIGHT LAB"
  }
}
```