SHAP(SHapley Additive exPlanation)是解決模型可解釋性的一種方法。SHAP基于Shapley值,該值是經(jīng)濟(jì)學(xué)家Lloyd Shapley提出的博弈論概念?!安┺摹笔侵赣卸鄠€(gè)個(gè)體,每個(gè)個(gè)體都想將自己的結(jié)果最大化的情況。該方法為通過計(jì)算在合作中個(gè)體的貢獻(xiàn)來確定該個(gè)體的重要程度。
SHAP將Shapley值解釋表示為一種加性特征歸因方法(additive feature attribution method),將模型的預(yù)測(cè)值解釋為二元變量的線性函數(shù):
其中
假設(shè)第i個(gè)樣本為
其中
加性特征歸因方法是滿足以下三個(gè)條件的唯一解決方案:
定理1來自于合作博弈論的組合結(jié)果,?i表示Shapley值。Young (1985)證明了Shapley值是唯一滿足局部精度、一致性和一個(gè)冗余屬性的值。
(基于tensorflow和keras)
import shap
如果沒有這個(gè)庫(kù),先在terminal安裝:
pip install shap
以隨機(jī)森林為例:
導(dǎo)入模型的方法為:
from sklearn.externals import joblib
model = joblib.load('..(你的隨機(jī)森林模型路徑)\RF.model')
在本文的例子中,特征參數(shù)都在x_test數(shù)組中
explainer = shap.TreeExplainer(model) #創(chuàng)建解釋器
因?yàn)槲覀兊哪P褪请S機(jī)森林,所以采用的是針對(duì)樹的解釋器:TreeExplainer
shap_values = explainer.shap_values(x_test) #x_test為特征參數(shù)數(shù)組 shap_value為解釋器計(jì)算的shap值
shap.dependence_plot('參數(shù)名稱', 計(jì)算的SHAP數(shù)組, 特征數(shù)組, interaction_index=None,show=False)
注意:
1)”參數(shù)名稱“表示要繪制的單變量名稱
2)shap_value是第5步計(jì)算的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,會(huì)自動(dòng)搜索與該參數(shù)交互最大的參數(shù),也就是令顏色的離散程度最大的特征進(jìn)行著色,然后從圖中展示出來。
如圖所示,如果考慮交互作用,與等效滲透率交互作用最強(qiáng)的是厚度,或者說,厚度這個(gè)參數(shù)對(duì)等效滲透率的SHAP值分布影響最大。當(dāng)然,這里可以通過設(shè)置查看別的參數(shù)的交互作用。
圖中橫坐標(biāo)表示特征的取值,縱坐標(biāo)表示特征的SHAP值,也就是特征的取值對(duì)于模型的輸出會(huì)帶來的變化量。此外,對(duì)于同一個(gè)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ù)號(hào)
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)
這個(gè)可以體現(xiàn)出不同參數(shù)組合對(duì)模型的貢獻(xiàn)度。也就是說,可以給出模型優(yōu)化方案,
這里有很多種模式可以選擇,第一種是根據(jù)對(duì)模型的貢獻(xiàn)度進(jìn)行排序的,如圖所示:
第二種是根據(jù)參數(shù)的相似性對(duì)樣本進(jìn)行排序
第三種是按照原始的樣本排序繪圖
后面幾種繪圖方式就是根據(jù)不同的參數(shù)進(jìn)行繪圖:
解釋:這里鼠標(biāo)可以隨意指到任何位置,然后就可以看到不同的組合情況以及對(duì)模型的貢獻(xiàn)值(縱坐標(biāo)顯黑的部分)。這里的橫坐標(biāo)表示第幾個(gè)樣本,縱坐標(biāo)表示不同組合對(duì)模型的貢獻(xiàn)值。藍(lán)色表示負(fù)影響的參數(shù),紅色表示正影響的參數(shù)。這是一個(gè)參數(shù)疊加圖,紅色區(qū)域越大,說明正影響越強(qiáng),反之,藍(lán)色區(qū)域越大,說明負(fù)影響越強(qiáng)。個(gè)人認(rèn)為這個(gè)圖的好處就是能夠給出明確的對(duì)模型貢獻(xiàn)大的參數(shù)組合。
傳統(tǒng)的feature importance只告訴哪個(gè)特征重要,但我們并不清楚該特征是怎樣影響預(yù)測(cè)結(jié)果的。SHAP value最大的優(yōu)勢(shì)是SHAP能對(duì)于反映出每一個(gè)樣本中的特征的影響力,而且還表現(xiàn)出影響的正負(fù)性。
如下圖所示,這個(gè)圖也可以看出參數(shù)的重要性,但是比之前的重要性排序圖多了具體特征值的影響。以Feature5為例,該參數(shù)對(duì)模型的影響最大,當(dāng)feature5的值越小,模型的輸出越小,越大,模型的輸出越大。
聯(lián)系客服