如何解決機(jī)器學(xué)習(xí)樹集成模型的解釋性問題
01 機(jī)器學(xué)習(xí)模型不可解釋的原因
前些天在同行交流群里,有個(gè)話題一直在群里熱烈地討論,那就是 如何解釋機(jī)器學(xué)習(xí)模型 ,因?yàn)樵陲L(fēng)控領(lǐng)域,一個(gè)模型如果不能得到很好的解釋一般都不會(huì)被通過的,在銀行里會(huì)特別的常見,所以大多數(shù)同行都是會(huì)用 LR 來建模。但是,機(jī)器學(xué)習(xí)的模型算法這么多,不用豈不是很浪費(fèi)?而且有些算法還十分好用的,至少在效果上,如XGBoost、GBDT、Adaboost。
那么,有同學(xué)就會(huì)問了,為什么這些算法會(huì)沒有解釋性呢?其實(shí)是這樣子的,剛剛所說的那些模型都是一些集成模型,都是由復(fù)雜的樹結(jié)構(gòu)去組成的模型,對(duì)于人類來說我們很難直觀地去解釋為什么這個(gè)客戶就是爛,到底是什么特征導(dǎo)致他爛?
02 特征重要度方法盤點(diǎn)
其實(shí)像XGBoost之類的模型還算是有解釋性的了,我們常常都會(huì)看到有人用信息增益、節(jié)點(diǎn)分裂數(shù)來衡量特征的重要度,但是這真的是合理的嗎?
在解釋是否合理前,有2個(gè)概念需要先給大家普及一下:
1)一致性
指的是一個(gè)模型的特征重要度,不會(huì)因?yàn)槲覀兏牧四硞€(gè)特征,而改變其重要度。比如A模型的特征X1的重要度是10,那么如果我們?cè)谀P屠锝o特征X2加些權(quán)重以增大其重要度,重新計(jì)算重要度后,特征X1的重要度仍是10。不一致性可能會(huì)導(dǎo)致具有重要度較大的特征比具有重要度較小的特征更不重要。
2)個(gè)體化
指的是重要度的計(jì)算是可以針對(duì)個(gè)體,而不需要整個(gè)數(shù)據(jù)集一起計(jì)算。
好了,有了上面的認(rèn)識(shí),下面就來盤點(diǎn)一下目前常見的特征重要度計(jì)算的方法:
1)Tree SHAP:即 shapley加法解釋,基于博弈論和局部解釋的統(tǒng)一思想,通過樹集成和加法方法激活shap值用于特征歸因。
2)Saabas:一種個(gè)性化啟發(fā)式特征歸因方法。
3)mean(| Tree SHAP |):基于個(gè)性化的啟發(fā)式SHAP平均的全局屬性方法。
4)Gain:即增益,由Breiman等人提出的一種全局的特征重要度計(jì)算方法,在XGBoost、scikit learn等包中都可以調(diào)用,它是給定特征在分裂中所帶來的不純度的減少值,經(jīng)常會(huì)被用來做特征選擇。
5)Split Count:即分裂次數(shù)統(tǒng)計(jì),指的是給定特征被用于分裂的次數(shù)(因?yàn)樵街匾脑饺菀妆灰茫驼撐囊貌畈欢嘁粋€(gè)道理吧)。
6)Permutation:即排序置換,指的是隨機(jī)排列某個(gè)特征,看下模型效果誤差的變化,如果特征重要的話,模型誤差會(huì)變化得特別大。
其中,屬于個(gè)體化的僅有1-2,3-6均屬于全局性統(tǒng)計(jì),也就是說需要整個(gè)數(shù)據(jù)集進(jìn)去計(jì)算的。
而對(duì)于一致性情況,我們有一個(gè)例子來證明:
有2個(gè)模型,Model A 和 Model B,其中A和B完全一致,但是我們?cè)谟?jì)算預(yù)測(cè)值的時(shí)候,強(qiáng)行給 Model B 的 特征 Cough 加上 10分。如下圖所示(點(diǎn)擊看大圖):
從實(shí)驗(yàn)結(jié)果可以看出以上6種方法的差別:
1)Saabas、Gain、Split Count均不滿足 一致性 的要求,在改變了某個(gè)特征的權(quán)重之后,原先的特征重要度發(fā)生了改變,也直接導(dǎo)致重要度排序的改變。
2)而滿足一致性要求的方法只有 Tree SHAP 和 Permutation了,而Permutation又是全局的方法,因此就只剩下了 Tree SHAP了。
03 SHAP可能是出路,SHAP到底是什么
SHAP(Shapley Additive exPlanation)是解釋任何機(jī)器學(xué)習(xí)模型輸出的統(tǒng)一方法。SHAP將博弈論與局部解釋聯(lián)系起來,根據(jù)期望表示唯一可能的一致和局部精確的加性特征歸屬方法。
以上是官方的定義,乍一看不知所云,可能還是要結(jié)合論文(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是輸入特征的個(gè)數(shù), ϕi’ 就是特征的貢獻(xiàn)度。ϕ0 是一個(gè)常數(shù)(指的是所有樣本的預(yù)測(cè)均值)。SHAP 值有唯一的解,也具有3個(gè)特性:Local Accuracy、Missingness、Consistency。
1)Local Accuracy:即局部準(zhǔn)確性,表示每個(gè)特征的重要度之和等于整個(gè)Function的重要度
2)Missingness:即缺失性,表示缺失值對(duì)于特征的重要度沒有貢獻(xiàn)。
3)Consistency:即一致性,表示改變模型不會(huì)對(duì)特征的重要度造成改變。
簡單來說,SHAP值可能是唯一能夠滿足我們要求的方法,而我們上面講到的XGBoost、GBDT等都是樹模型,所以這里會(huì)用到 TREE SHAP。
04 SHAP的案例展示
0401 SHAP的安裝
安裝還是蠻簡單的,可以通過終端的pip安裝或者conda安裝
- pip install shap
- or
- conda install -c conda-forge shap
0402 對(duì)樹集成模型進(jìn)行解釋性展示
目前TREE SHAP可以支持的樹集成模型有XGBoost, LightGBM, CatBoost, and scikit-learn tree models,可以看看下面的demo:
- import xgboost
- import shap
- # load JS visualization code to notebook
- shap.initjs()
- """訓(xùn)練 XGBoost 模型,SHAP里提供了相關(guān)數(shù)據(jù)集"""
- X,y = shap.datasets.boston()
- model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100)
- """
- 通過SHAP值來解釋預(yù)測(cè)值
- (同樣的方法也適用于 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,:])
output:
上面的圖展示了每個(gè)特征的重要度,會(huì)預(yù)先計(jì)算好一個(gè)均值,將預(yù)測(cè)值變得更高的偏向于紅色這邊,反之藍(lán)色。
這個(gè)數(shù)據(jù)集有這些特征:'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)
output:
上圖可以看出每個(gè)特征之間的相互作用(輸出圖是可以交互的)。
但是為了理解單個(gè)特性如何影響模型的輸出,我們可以將該特性的SHAP值與數(shù)據(jù)集中所有示例的特性值進(jìn)行比較。由于SHAP值代表了模型輸出中的一個(gè)特性的變化,下面的圖代表了預(yù)測(cè)的房價(jià)隨著RM(一個(gè)區(qū)域中每棟房子的平均房間數(shù))的變化而變化的情況。
單一RM值的垂直色散表示與其他特征的相互作用。要幫助揭示這些交互依賴關(guān)系,dependence_plot 自動(dòng)選擇 另一個(gè)特征來著色。比如使用RAD著色,突顯了RM(每戶平均房數(shù))對(duì)RAD的值較高地區(qū)的房價(jià)影響較小。
- """創(chuàng)建一個(gè)SHAP圖用于展示 單一特征在整個(gè)數(shù)據(jù)集的表現(xiàn)情況,每個(gè)點(diǎn)代表一個(gè)樣本"""
- shap.dependence_plot("RM", shap_values, X)
output:
為了得到整體水平上每個(gè)特征的重要度情況,我們可以畫出所有特征對(duì)于所有sample的SHAP值,然后根據(jù)SHAP值之和來降序排序,顏色代表特征重要度(紅色代表高,藍(lán)色代表低),每個(gè)點(diǎn)代表一個(gè)樣本。
- """畫出所有特征的重要度排序圖"""
- shap.summary_plot(shap_values, X)
output:
我們也可以只是顯示SHAP值的所有樣本的均值,畫出bar圖。
- shap.summary_plot(shap_values, X, plot_type="bar")
output:
References
[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/...
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!