Explain Your Machine Learning Model by SHAP. (Part 1)

Yu-Ru Tsai
Taiwan AI Academy
Published in
11 min readJan 31, 2019

前言 Intro

在這篇文章你會學到:

  • 什麼是 Explainable AI
  • SHAP value 是什麼?
  • SHAP value in Machine Learning
  • Takeaway

Difficulty: ★ ★ ☆ ☆ ☆

什麼是 Explainable AI ?

這次的主題選擇是關於Explainable AI,也就是關於要如何解釋自己模型預測出來的結果,我們都需要瞭解為何我們訓練出的模型會做出如此判斷,是基於什麼原因做出這種判斷[1],會不會 model 完全用了非常詭譎的特徵去下決策(但說不定是對的 ?)以下歸納出幾個我們為什麼想知道我們訓練出來的模型到底在說什麼?

  • 確認模型的合理性:在我們需要做出決策,倚重模型做判斷時,我們需要知道,這個模型所參考的數據特徵是否正如我們想像的一樣。若我們不知道演算法建議的理由,那下決策肯定會覺得害怕,如同倚賴了一個名為 AI 的黑盒子一般。
  • 改良模型 : 這點其實跟第一點略為相同,如果我們能知道我們的模型所預測的依據,我們就可以去試著改善它。特別是當模型&資料中,存在了一些恰恰好的 bias, 若我們沒試著看背後的原因的話,通常很難發現一些問題。以過去的專案經驗當做例子,我們使用影像檢驗在找瑕疵物件時,預測的效果不錯,但去細看背後的原因,卻發現模型倚賴背景而作出決斷。詳細的情況是物件的缺陷在拍攝的當天時有個固定的光影,模型判斷defect 的依據竟然是用那個光影,而非物件上的瑕疵。
  • 從模型上學習: 當模型真正的從品質良好的訓練資料集中萃取出了有用的判斷依據,人類便可以從模型中學到一些東西。例如圍棋,人類目前很顯然的已經被圍棋擊敗,但在無關輸贏的這個時候,職業棋手目前早已尋求AI的輔助,讓自己的技術更上一層樓。

SHAP Value 是什麼?

以上幾點讓我們了解 Explainable AI 的必要性,那我們該如何下手去理解每個預測我們的模型是如何理解的呢?

SHAP values (SHapley Additive exPlanations) 是一個 Python 的視覺化分析套件,讓我們能輕易的了解我們的模型作出決策的依據。
那對於我們來說,什麼時候該使用 SHAP value 呢?

我: 根據模型預測,這季我們會損失 3000萬
老闆:什麼因素造成這麼大的虧損?
我:痾….. (๑◎△◎๑)〃

沒錯,就是在你要解釋原因給老闆的時候,解釋不出來的話跟沒有做的意思可是差不多的呢!
那我用實際遇過的案例來當例子

  • 製造業的入料控制以達到最佳化結果,你如何正確的減少不必要的入料,亦可以達到一樣的產能。
  • 利用 Users 的使用行為,找到詐騙帳號。並對模型做出解釋,藉此在各種features 中找到詐騙帳號一般性具有的行為。

Shapl value 的概念早已在1953年 game theory 中使用,但一直到最近才被使用在 Machine Learning 中使用。簡單的說,SHAP 為結合 game theory 的概念與利用局部解釋的方法,找到一個基於期望值得到的相對穩定& consistent,的加權數值。細節部分請大家參照 SHAP NIPS 的 paper

SHAP value in Machine Learning

這邊我們使用 Kaggle 上提供的 data 作為練習,讓大家了解 SHAP value 的操作與概念,模型的架設與語法不是本篇的重點,就不多加解釋哩~

首先在開始前請大家先安裝 SHAP 套件。
pip install shap

首先可以先下載 data接著做最簡單處理後就丟進我們的模型

Read data & preprocess

我們訓練一個模型,任意調整一下參數,將 Data 餵進去看一下結果如何~

Model training

這份 data 為二元分類模型,所以我使用AUC作為 evaluation 的指標,early stopping 也是看 AUC 去做終止。

既然模型已經 train 好了,那就可以來看看模型是如何解釋我們的資料了。

首先可以先宣告 SHAP 的物件出來, 這邊我們介紹的是TreeExplainer,SHAP總共有三種,底層運算各有不同,算出來的結果也有所不同,有興趣的可以仔細看一發。

  • TreeExplainer (XGBoost/LightGBM/CatBoost/scikit-learn models)
  • DeepExplainer (TensorFlow/Keras models)
  • KernelExplainer (explains any function)

一般來說,解釋模型有不同的 scope

  • Global interpretability
  • Local interpretability

Global interpretability

首先,Global interpretability 幫助我們了解每個 feature 與預測值之間的關係。除此之外,global interpretability 給予我們對於預測值而言,每個 feature 影響的方向 & 數字尺度的概念。

我們可以用 shap.summary_plot(shap_value, X_train) 來觀察Global interpretability.

為了用一個 overview 的角度去觀察整個模型,我們呼叫 summary plot 畫出每個 sample 裡各個 feature 的 SHAP values。圖中是按照該 feature 的SHAP values 總和排序,從最重要的 feature 開始排。每個 feature 中的點則代表,在不同的 sample 中,該 feature 對於預測值的影響程度。顏色則為代表 feature value (紅色是高,藍色是低)

這張表不只跟給予我們 feature importance 的資訊,也告訴我們每個點作用的範圍,於是我們可以這樣解釋:

  • 點的顏色: 表示該點 feature 本身值的大小
  • X軸: 該點對於 Shap 值的影響,也就是對預測值影響。
  • Y軸: 各個 features
SHAP summary plot for the man of the game

接下來我們便可以試著去解讀這張圖

  • 進球數很低(藍色)基本上都會大大降低獲勝機率。
  • 可以看到 Blocked 很高的點,卻有可能造成負面的影響。
  • 模型基本上忽略的紅黃卡(Yellow & Red)這個 feature。

Local interpretability

除了整體的去解釋模型外,SHAP 提供對於個別的 sample,模型是怎麼利用各個 features 去解釋這組數據,shap.force_plot(explainer.expected_value, shap_values[10,:], X_train.iloc[10,:]) 這個function 就可以幫助我們對這筆資料去做解釋,我們便可以理解 data 究竟是根據哪些因素,獲得這筆 data 的預測值。

紅色的 feature 表示將正向的影響 output value ,會使值升高,藍色的則相反,會用來減低 output value.

由於我們使用的為 XGboost 演算法,因此 SHAP values 的單一點值計算為 XGboost 中所有 tree output 的總和。這個值為 log odd ratio,也就是表示越大的正值表示越有可能得到 man of the game, 相反的值越低,越不可能得到這個獎項。

舉這個第 83 筆的 data 作為例子,所有資料經過 XGboost 得到的 marginal value 平均值為 0.05516,而這第 83 筆算出來為 -1.82 。

那各個 feature 在這筆資料中又怎麼解釋呢?

  • 正面的影響(贏得獎項): Passes = 583, corners = 10, Pass Accuracy = 84%
  • 負面的影響(沒贏得獎項): Off-Target = 1, Blocked = 8, Yellow Card = 1…

force plot 中格子佔越大,對 output value 的值的影響越大,也就表示會對該筆 data 預測越重要的 feature,因此我們就可以依靠這張表最為解釋的依據。那 output value = -1.82的意思又是什麼呢?我們將 -1.82 帶入 sigmoid function 經過一個非線性轉換,可以求得0.13,即是我們對於這筆資料的預測值。那麼以上的解釋又會顯得更清晰了,對值產生負向影響的,會使降低預測機率; 那降低越多的,對於預測機率影響的也就越大,反之亦然。

通常到了這邊,我們就可以停下來,然後秀出這些圖給你的老闆看了。但我們再來看看 Shap 還能辦到哪些事吧!

Aggregated force_plot

我們這裡也是使用shap.force_plot() 但我們這次不指定要看哪一筆,而是全部呼叫出來,如此便會產生一個整個 Shap 中最酷的圖表(我覺得XD)

shap.force_plot(explainer.expected_value, shap_values, train_X)
aggregated force_plot

這個圖表可將每一筆個別的 force_plot 疊加起來,show 出整個 dataset,並依照 output value 大小,排序成為一個互動式的圖表,使用者可以用滑鼠滑去檢視,不同的 output value 是由哪些 features 造成偌大的影響。

Dependence plot

Shap 也提供我們看兩兩變數間關係的工具,dependence_plot,越往上(Shap越大),越有可能獲得 Man of the Game,如此我們可以容易地去解釋在模型兩兩變數間的 correlation,而不是僅僅只能看 X 相對於 Y 的結果。

shap.dependence_plot('Ball Possession %', shap_values, X_train, interaction_index="Goal Scored")

Conclusion

在過去或許使用複雜模型 & 模型可解釋,會是一種 trade-off。複雜的模型如 ensemble model, deep model 雖然 performance 好,但卻有無法解釋的問題。但現在越來越多工具出來了,我們能夠使用非常複雜的 tree-based,如我們所用的 XGboost 而且又可以清晰地了解到背後影響 model 的因素,就如同線性模型一般簡單易懂。現在越來越多的複雜的模型都一個一個跑出來了,模型解釋的需求也會越來越多,這邊只是起了個頭,相信未來慢慢的能夠解開 deep learning “black box” 的污名。

Takeaway

https://github.com/EvanstsaiTW/SHAP_tutorial

Reference

[1] Explainable AI 是什麼?為什麼 AI 下判斷要可以解釋?
[2] Shapley Value Explanations
[3]https://github.com/slundberg/shap
[4]https://www.kaggle.com/dansbecker/shap-values
[5]https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions

--

--