前些天在同行交流羣裏,有個話題一直在羣裏熱烈地討論,那就是 如何解釋機器學習模型 ,由於在風控領域,一個模型若是不能獲得很好的解釋通常都不會被經過的,在銀行裏會特別的常見,因此大多數同行都是會用 LR 來建模。可是,機器學習的模型算法這麼多,不用豈不是很浪費?並且有些算法還十分好用的,至少在效果上,如XGBoost、GBDT、Adaboost。python
那麼,有同窗就會問了,爲何這些算法會沒有解釋性呢?實際上是這樣子的,剛剛所說的那些模型都是一些集成模型,都是由複雜的樹結構去組成的模型,對於人類來講咱們很難直觀地去解釋爲何這個客戶就是爛,究竟是什麼特徵致使他爛?git
其實像XGBoost之類的模型還算是有解釋性的了,咱們經常都會看到有人用信息增益、節點分裂數來衡量特徵的重要度,可是這真的是合理的嗎?github
在解釋是否合理前,有2個概念須要先給你們普及一下:算法
1)一致性segmentfault
指的是一個模型的特徵重要度,不會由於咱們更改了某個特徵,而改變其重要度。好比A模型的特徵X1的重要度是10,那麼若是咱們在模型裏給特徵X2加些權重以增大其重要度,從新計算重要度後,特徵X1的重要度還是10。不一致性可能會致使具備重要度較大的特徵比具備重要度較小的特徵更不重要。app
2)個體化機器學習
指的是重要度的計算是能夠針對個體,而不須要整個數據集一塊兒計算。學習
好了,有了上面的認識,下面就來盤點一下目前常見的特徵重要度計算的方法:spa
1)Tree SHAP:即 shapley加法解釋,基於博弈論和局部解釋的統一思想,經過樹集成和加法方法激活shap值用於特徵歸因。code
2)Saabas:一種個性化啓發式特徵歸因方法。
3)mean(| Tree SHAP |):基於個性化的啓發式SHAP平均的全局屬性方法。
4)Gain:即增益,由Breiman等人提出的一種全局的特徵重要度計算方法,在XGBoost、scikit learn等包中均可以調用,它是給定特徵在分裂中所帶來的不純度的減小值,常常會被用來作特徵選擇。
5)Split Count:即分裂次數統計,指的是給定特徵被用於分裂的次數(由於越重要的越容易被引用,和論文引用差很少一個道理吧)。
6)Permutation:即排序置換,指的是隨機排列某個特徵,看下模型效果偏差的變化,若是特徵重要的話,模型偏差會變化得特別大。
其中,屬於個體化的僅有1-2,3-6均屬於全局性統計,也就是說須要整個數據集進去計算的。
而對於一致性狀況,咱們有一個例子來證實:
有2個模型,Model A 和 Model B,其中A和B徹底一致,可是咱們在計算預測值的時候,強行給 Model B 的 特徵 Cough 加上 10分。以下圖所示(點擊看大圖):
從實驗結果能夠看出以上6種方法的差異:
1)Saabas、Gain、Split Count均不知足 一致性 的要求,在改變了某個特徵的權重以後,原先的特徵重要度發生了改變,也直接致使重要度排序的改變。
2)而知足一致性要求的方法只有 Tree SHAP 和 Permutation了,而Permutation又是全局的方法,所以就只剩下了 Tree SHAP了。
SHAP(Shapley Additive exPlanation)是解釋任何機器學習模型輸出的統一方法。SHAP將博弈論與局部解釋聯繫起來,根據指望表示惟一可能的一致和局部精確的加性特徵歸屬方法。
以上是官方的定義,乍一看不知所云,可能仍是要結合論文(Consistent Individualized Feature Attribution for Tree Ensembles)來看了。
Definition 2.1. Additive feature attribution methods have an explanation model g that is a linear function of binary variables
M是輸入特徵的個數, ϕi’ 就是特徵的貢獻度。ϕ0 是一個常數(指的是全部樣本的預測均值)。SHAP 值有惟一的解,也具備3個特性:Local Accuracy、Missingness、Consistency。
1)Local Accuracy:即局部準確性,表示每一個特徵的重要度之和等於整個Function的重要度
2)Missingness:即缺失性,表示缺失值對於特徵的重要度沒有貢獻。
3)Consistency:即一致性,表示改變模型不會對特徵的重要度形成改變。
簡單來講,SHAP值多是惟一可以知足咱們要求的方法,而咱們上面講到的XGBoost、GBDT等都是樹模型,因此這裏會用到 TREE SHAP。
安裝仍是蠻簡單的,能夠經過終端的pip安裝或者conda安裝
pip install shap or conda install -c conda-forge shap
目前TREE SHAP能夠支持的樹集成模型有XGBoost, LightGBM, CatBoost, and scikit-learn tree models,能夠看看下面的demo:
import xgboost import shap # load JS visualization code to notebook shap.initjs() """訓練 XGBoost 模型,SHAP裏提供了相關數據集""" X,y = shap.datasets.boston() model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100) """ 經過SHAP值來解釋預測值 (一樣的方法也適用於 LightGBM, CatBoost, and scikit-learn models) """ explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) # 可視化解釋性 (use matplotlib=True to avoid Javascript) shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
上面的圖展現了每一個特徵的重要度,會預先計算好一個均值,將預測值變得更高的偏向於紅色這邊,反之藍色。
這個數據集有這些特徵:'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT'
# visualize the training set predictions shap.force_plot(explainer.expected_value, shap_values, X)
上圖能夠看出每一個特徵之間的相互做用(輸出圖是能夠交互的)。
可是爲了理解單個特性如何影響模型的輸出,咱們能夠將該特性的SHAP值與數據集中全部示例的特性值進行比較。因爲SHAP值表明了模型輸出中的一個特性的變化,下面的圖表明瞭預測的房價隨着RM(一個區域中每棟房子的平均房間數)的變化而變化的狀況。
單一RM值的垂直色散表示與其餘特徵的相互做用。要幫助揭示這些交互依賴關係,dependence_plot 自動選擇 另外一個特徵來着色。好比使用RAD着色,突顯了RM(每戶平均房數)對RAD的值較高地區的房價影響較小。
"""建立一個SHAP圖用於展現 單一特徵在整個數據集的表現狀況,每一個點表明一個樣本""" shap.dependence_plot("RM", shap_values, X)
爲了獲得總體水平上每一個特徵的重要度狀況,咱們能夠畫出全部特徵對於全部sample的SHAP值,而後根據SHAP值之和來降序排序,顏色表明特徵重要度(紅色表明高,藍色表明低),每一個點表明一個樣本。
"""畫出全部特徵的重要度排序圖""" shap.summary_plot(shap_values, X)
咱們也能夠只是顯示SHAP值的全部樣本的均值,畫出bar圖。
shap.summary_plot(shap_values, X, plot_type="bar")
[1] A Unified Approach to Interpreting Model Predictions
http://papers.nips.cc/paper/7...
[2] Consistent Individualized Feature Attribution for Tree Ensembles
https://arxiv.org/pdf/1802.03...
[3] Interpretable Machine Learning
https://christophm.github.io/...
[4] shap 官方文檔
https://github.com/slundberg/...
本文由博客一文多發平臺 OpenWrite 發佈!