質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1275閲覧

SHAPで 回帰も二値もマルチもグラフ表示したい。

hima2b4

総合スコア33

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/06/09 13:15

編集2022/06/10 12:47

GoogleColabで、SHAPを実行しています。

TreeExplainer、モデルはxgbです。
force plotは、回帰と二値分類の場合、以下で描画。

Python

1shap.initjs() 2shap.force_plot(explainer.expected_value, shap_values, X_selected) 3

マルチ分類の場合、以下で描画。

Python

1shap.initjs() 2shap.force_plot(explainer.expected_value[1], shap_values[1], X_selected) 3

データセットのタイプ毎にコード操作は面倒なので、

マルチ分類データですよ等と事前に認識させて、

Python

1shap.initjs() 2if dataset == ‘multi’: 3 shap.force_plot(explainer.expected_value[1], shap_values[1], X_selected) 4else: 5 shap.force_plot(explainer.expected_value, shap_values, X_selected) 6

として実行しても表示されません。

すこし強引ですが、以下を実行しても表示されませんでした。

Python

1 2shap.initjs() 3try: 4 shap.force_plot(explainer.expected_value[1], shap_values[1], X_selected) 5except: 6 pass 7 8try: 9 shap.force_plot(explainer.expected_value, shap_values, X_selected) 10except: 11 pass 12

何かうまい方法をご存知の方がおられましたら、ご教示お願いできませんでしょうか?

※以下が現在の実行コードです。以下の実行コードに上記の変更を加えてもうまくいかなかったということになります。

Python

1 2#@title **Classification**(分類)or **Regression**(回帰) 3#回帰か分類かによってXGB.XGBClassifierを実行するか、XGB.XGBRegressorを実行するかを変えるため、ココで区分。 4 5#@title **Classification**(分類)or **Regression**(回帰) 6dataset_type = 'Classification' #@param ["Classification", "Regression"] 7 8 9#@title **Load Dataset** 10if dataset =='Upload': 11 from google.colab import files 12 uploaded = files.upload()#Upload 13 target = list(uploaded.keys())[0] 14 df = pd.read_csv(target) 15 16FEATURES = df.columns[:-1] 17TARGET = df.columns[-1] 18X = df.loc[:, FEATURES] 19y = df.loc[:, TARGET] 20 21 22#@title **SHAP summary plot** 23 24import xgboost as XGB 25import shap 26 27#XGB 28if dataset_type == 'Regression': 29 xgb = XGB.XGBRegressor(random_state=0) 30else: 31 xgb = XGB.XGBClassifier(random_state=0) 32 33xgb.fit(X, y) 34 35#SHAP 36explainer = shap.TreeExplainer(xgb) 37shap_values = explainer.shap_values(X) 38 39 40#@title **SHAP summary plot** 41shap.summary_plot(shap_values,X) 42 43 44#@title **SHAP force plot** 45shap.initjs() 46shap.force_plot(explainer.expected_value, shap_values, X) 47

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/09 21:20

動作確認に必要な再現できる最小限のサンプルを</>ボタンで表示される記号の間に挟んで掲載できますか?
退会済みユーザー

退会済みユーザー

2022/06/10 21:46

加筆修正ありがとうございます。あとは動作確認のためのデータが必要です。 例えばですが、 https://www.medi-08-data-06.work/entry/how_to_use_shap に、SHAPの例があり、 > #データセットの読込 > X,y = shap.datasets.adult() とすると、shapライブラリの動作確認用のサンプルデータがロードできるようです。 Q. hima2b4さんと同じデータを同じように走らせ動作確認をできるようにできますか?   つまるところ、同じデータを同じコードで走らせないときちんと検証ができない、という話です。 例えば、 ・ 上記のサンプルデータを使って同じ状況を再現できるようにする ・ hima2b4さんの使っているデータをアップロードして同じコードを検証できるようにする どちらでも構いませんが、2つ目のやり方が簡単そうに思います。
guest

回答1

0

自己解決

forteenlenghさん、朝早くから丁寧なお返事、誠にありがとうございます。

リンクいただいた記事、確認させていただき、回帰、分類ともに同じ枠組みで実行するのは、実用においては適切ではないなと思うに至りました。
binaryの場合は、クラス指定なく視認できていましたので「multiも統合してやろう」というのが意図でしたが、multiの場合、shap.summary_plot(shap_values,X) では、各クラスののmeanSHAPが積み上げ棒グラフで表示されますが、scatter plotやforce plotは、視認したいクラスを[1]のように指定する必要がある。統合したとしてもmultiだけはこの指示が必要になる=分けてクラス変更が柔軟にできた方が使い勝手がいいと感じたからです。
元々の問いとは異なりますが、お返事いただいたことで気がつけました。ありがとうございました。

一方、if文で条件分岐させて、trueとfalseで異なる SHAPグラフを表示させたいということはあると思いますので、同じくご連絡いただいたデータセットセット等でdisplay(shap.summary....)などとするといけるのかな?!等、試行してみようと思います。

繰り返しとなりますが、感謝申し上げます。

投稿2022/06/10 23:30

hima2b4

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問