手把手教你使用SHAP(機(jī)器學(xué)習(xí)模型解釋工具)
SHAP簡介
SHAP(SHapley Additive exPlanation)是解決模型可解釋性的一種方法。SHAP基于Shapley值,該值是經(jīng)濟(jì)學(xué)家Lloyd Shapley提出的博弈論概念?!安┺摹笔侵赣卸鄠€個體,每個個體都想將自己的結(jié)果最大化的情況。該方法為通過計算在合作中個體的貢獻(xiàn)來確定該個體的重要程度。
SHAP將Shapley值解釋表示為一種加性特征歸因方法(additive feature attribution method),將模型的預(yù)測值解釋為二元變量的線性函數(shù):

其中
,M是簡化輸入的特征數(shù),![]()
假設(shè)第i個樣本為
,第i個樣本的第j個特征為
,模型對該樣本的預(yù)測值為yi,整個模型的基線(通常是所有樣本的目標(biāo)變量的均值)為
,那么SHAP value服從以下等式:
![]()
其中
為
SHAP值。f(xi,1)就是第i個樣本中第1個特征對最終預(yù)測值yi的貢獻(xiàn)值。每個特征的SHAP值表示以該特征為條件時預(yù)期模型預(yù)測的變化。對于每個功能,SHAP值說明了貢獻(xiàn),以說明實(shí)例的平均模型預(yù)測與實(shí)際預(yù)測之間的差異。當(dāng)f(xi,1)>0,說明該特征提升了預(yù)測值,反之,說明該特征使得貢獻(xiàn)降低。
加性特征歸因方法是滿足以下三個條件的唯一解決方案:
局部精度 Local Accuracy:對特定輸入x近似原始模型 f 時,局部精度要求解釋模型至少和 f 對簡化的輸入x′ 輸出匹配:
- 缺失性 Missingness:如果簡化的輸入表示特征是否存在,缺失性要求輸入中缺失的特征對結(jié)果沒有影響:
- 一致性 Consistency:一致性要求如果模型發(fā)生變化,簡化輸入的貢獻(xiàn)應(yīng)當(dāng)增加或不變,與其他輸入無關(guān):

定理1來自于合作博弈論的組合結(jié)果,?i表示Shapley值。Young (1985)證明了Shapley值是唯一滿足局部精度、一致性和一個冗余屬性的值。
SHAP****優(yōu)點(diǎn):
解決了多重共線性問題- 不僅考慮單個變量的影響,而且考慮變量之間的協(xié)同效應(yīng)
缺點(diǎn)
計算效率低
應(yīng)用方法
(基于tensorflow和keras)
導(dǎo)入SHAP庫
import shap
如果沒有這個庫,先在terminal安裝:
pip install shap
導(dǎo)入模型
以隨機(jī)森林為例:
導(dǎo)入模型的方法為:
from sklearn.externals import joblib
model = joblib.load('..(你的隨機(jī)森林模型路徑)\RF.model')
確定特征值,也就是你要分析的參數(shù)
在本文的例子中,特征參數(shù)都在x_test數(shù)組中
創(chuàng)建解釋器
explainer = shap.TreeExplainer(model) #創(chuàng)建解釋器
因?yàn)槲覀兊哪P褪请S機(jī)森林,所以采用的是針對樹的解釋器:TreeExplainer
用解釋器對特征參數(shù)進(jìn)行解釋
shap_values = explainer.shap_values(x_test) #x_test為特征參數(shù)數(shù)組 shap_value為解釋器計算的shap值
繪制單變量影響圖
shap.dependence_plot("參數(shù)名稱", 計算的SHAP數(shù)組, 特征數(shù)組, interaction_index=None,show=False)
注意:
1)”參數(shù)名稱“表示要繪制的單變量名稱
2)shap_value是第5步計算的SHAP值
3)特征數(shù)組為dataframe格式。第一行需要是特征名稱,后面是具體的特征數(shù)值。如果原始數(shù)組是numpy的array數(shù)組,需要按照以下代碼添加特征名稱:
data_with_name = pd.DataFrame(x_test) #將numpy的array數(shù)組x_test轉(zhuǎn)為dataframe格式。
data_with_name.columns = ['特征1','特征2','特征3'] #添加特征名稱
4)interaction_index 表示是否考慮交互作用,None為只考慮單因素作用,不考慮其他因素。如果不是None,會自動搜索與該參數(shù)交互最大的參數(shù),也就是令顏色的離散程度最大的特征進(jìn)行著色,然后從圖中展示出來。
如圖所示,如果考慮交互作用,與等效滲透率交互作用最強(qiáng)的是厚度,或者說,厚度這個參數(shù)對等效滲透率的SHAP值分布影響最大。當(dāng)然,這里可以通過設(shè)置查看別的參數(shù)的交互作用。
圖中橫坐標(biāo)表示特征的取值,縱坐標(biāo)表示特征的SHAP值,也就是特征的取值對于模型的輸出會帶來的變化量。此外,對于同一個x值,也就是特征取值相同的樣本,他們的SHAP值不同,這是因?yàn)樵撎卣髋c其他特征有交互作用。
5)show=False 表示不顯示圖,如果是true,顯示的是默認(rèn)繪圖格式,也就是說坐標(biāo)的大小啊,含義啊都是默認(rèn)的。如果不滿意自帶的繪圖格式,可以show=False,然后自定義格式。這里給出一套相關(guān)自定義代碼:
fig, ax = plt.subplots()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負(fù)號
shap.dependence_plot("等效滲透率", shap_values, data_with_name,show=False)
plt.xticks( fontproperties='Times New Roman', size=20) #設(shè)置x坐標(biāo)字體和大小
plt.yticks(fontproperties='Times New Roman', size=20) #設(shè)置y坐標(biāo)字體和大小
plt.xlabel('Mean(average impact on model output magnitude)', fontsize=20)#設(shè)置x軸標(biāo)簽和大小
plt.tight_layout() #讓坐標(biāo)充分顯示,如果沒有這一行,坐標(biāo)可能顯示不全
plt.savefig("保存.png",dpi=1000) #可以保存圖片
重要性排序繪圖
shap.summary_plot(shap_values, x_test, plot_type="bar",show=False)
這行代碼可以繪制出參數(shù)的重要性排序。

8. 不同特征參數(shù)共同作用的效果圖
shap.initjs() # 初始化JS
shap.force_plot(explainer.expected_value, shap_values, x_test,show=False)
這個可以體現(xiàn)出不同參數(shù)組合對模型的貢獻(xiàn)度。也就是說,可以給出模型優(yōu)化方案,
這里有很多種模式可以選擇,第一種是根據(jù)對模型的貢獻(xiàn)度進(jìn)行排序的,如圖所示:

第二種是根據(jù)參數(shù)的相似性對樣本進(jìn)行排序

第三種是按照原始的樣本排序繪圖

后面幾種繪圖方式就是根據(jù)不同的參數(shù)進(jìn)行繪圖:

解釋:這里鼠標(biāo)可以隨意指到任何位置,然后就可以看到不同的組合情況以及對模型的貢獻(xiàn)值(縱坐標(biāo)顯黑的部分)。這里的橫坐標(biāo)表示第幾個樣本,縱坐標(biāo)表示不同組合對模型的貢獻(xiàn)值。藍(lán)色表示負(fù)影響的參數(shù),紅色表示正影響的參數(shù)。這是一個參數(shù)疊加圖,紅色區(qū)域越大,說明正影響越強(qiáng),反之,藍(lán)色區(qū)域越大,說明負(fù)影響越強(qiáng)。個人認(rèn)為這個圖的好處就是能夠給出明確的對模型貢獻(xiàn)大的參數(shù)組合。
重要性排序圖(帶正負(fù)影響)
傳統(tǒng)的feature importance只告訴哪個特征重要,但我們并不清楚該特征是怎樣影響預(yù)測結(jié)果的。SHAP value最大的優(yōu)勢是SHAP能對于反映出每一個樣本中的特征的影響力,而且還表現(xiàn)出影響的正負(fù)性。
如下圖所示,這個圖也可以看出參數(shù)的重要性,但是比之前的重要性排序圖多了具體特征值的影響。以Feature5為例,該參數(shù)對模型的影響最大,當(dāng)feature5的值越小,模型的輸出越小,越大,模型的輸出越大。



Python“寶藏級”公眾號【Python之王】專注于Python領(lǐng)域,會爬蟲,數(shù)分,C++,tensorflow和Pytorch等等。
近 2年共原創(chuàng) 100+ 篇技術(shù)文章。創(chuàng)作的精品文章系列有:
日常收集整理了一批不錯的 Python 學(xué)習(xí)資料,有需要的小伙可以自行免費(fèi)領(lǐng)取。
獲取方式如下:公眾號回復(fù)資料。領(lǐng)取Python等系列筆記,項目,書籍,直接套上模板就可以用了。資料包含算法、python、算法小抄、力扣刷題手冊和 C++ 等學(xué)習(xí)資料!
