XGB模型可解釋性SHAP包實戰

2021-10-10 13:42:59 字數 3886 閱讀 1485

xgboost相對於邏輯回歸模型在進行**時往往有更好的精度,但是同時也失去了線性模型的可解釋性。

feature importance可以直觀地反映出特徵的重要性,看出哪些特徵對最終的模型影響較大。但是無法判斷特徵與最終**結果的關係是如何的。

lundberg和lee的**提出了shap值這一廣泛適用的方法用來解釋各種模型(分類以及回歸),如boosting和神經網路模型。

shap包安裝

# 分類變數編碼處理------

pd.set_option('display.max_rows',500) #調整最大顯示行

print(data.dtypes) # 找出分類特徵,稍後進行onehotencoder

col = ['club', 'league', 'height_cm', 'weight_kg',

'nationality', 'potential', 'pac', 'sho', 'pas', 'dri', 'def', 'phy',

'international_reputation', 'skill_moves', 'weak_foot', 'preferred_foot', 'crossing', 'finishing',

'heading_accuracy', 'short_passing', 'volleys', 'dribbling', 'curve',

'free_kick_accuracy', 'long_passing', 'ball_control', 'acceleration',

'sprint_speed', 'agility', 'reactions', 'balance', 'shot_power',

'jumping', 'stamina', 'strength', 'long_shots', 'aggression',

'interceptions', 'positioning', 'vision', 'penalties', 'marking',

'standing_tackle', 'sliding_tackle', 'gk_diving', 'gk_handling',

'gk_kicking', 'gk_positioning', 'gk_reflexes', 'rw', 'rb', 'st', 'lw',

'cf', 'cam', 'cm', 'cdm', 'cb', 'lb'] # 去掉不相干變數

x = data[col].values

y = data['y'].values

from sklearn.preprocessing import onehotencoder

enc = onehotencoder()

array_1 = enc.fit_transform(data[['work_rate_att','work_rate_def']]).toarray()

enc_lab = enc.get_feature_names(['work_rate_att','work_rate_def']).tolist() #返回新的特徵列名

x_new = np.hstack([x,array_1]) # 組合好特徵變數array

#col_new = [i for i in col if i not in ['work_rate_att','work_rate_def']]

col.extend(enc_lab) # 組合好特徵變數列名,稍後畫圖待用

# 建模------

model = xgbr(max_depth=4, learning_rate=0.05, n_estimators=150)

model.fit(x_new,y)

# 特徵重要性----

shap是由shapley value啟發的可加性解釋模型。對於每個**樣本,模型都產生乙個**值,shap value就是該樣本中每個特徵所分配到的數值。

假設第i個樣本為xi,第i個樣本的第jj個特徵為xi,j,模型對第i個樣本的**值為yi,整個模型的基線(通常是所有樣本的目標變數的均值)為ybase,那麼shap value服從:yi=ybase+f(xi,1)+f(xi,2)+⋯+f(xi,k),其中f(xi,1)為xi,j的shap值。

直觀上看,f(xi,1)就是對yiyi的貢獻值,當f(xi,1)>0f(xi,1)>0,說明該特徵提公升了**值,也正向作用;反之,說明該特徵使得**值降低,有反作用。

檢視其中一位球員身價的**值以及其特徵對**值的影響。

# shap例項化------

import shap

explainer = shap.treeexplainer(model)

df = pd.dataframe(x_new,columns=col)

shap_values = explainer.shap_values(x_new) # 計算出每個樣本在66個特徵上的shap值

shap_values.shape # shap值矩陣(10441, 66)

下圖,藍色表示該特徵的貢獻是負數,紅色則表示該特徵的貢獻是正數。球員的身價73.46萬;最長的藍色條是潛力,身價也因此降低了180萬元。

# shap視覺化------

shap.initjs()

j = 0 # 以第乙個樣本為例,檢視shap值

縱軸為特徵變數,橫軸為shap_value(左負右正),點代表樣本點。樣本點紅色表示特徵值較高,紫色表示特徵值較低。

舉例來看,特徵potential對**結果的影響最大,是與value_shape正相關,potential越高會拉高shap_value。特徵age與value_shape負相關,該特徵值高的表示年齡較大的樣本,圖中為紅色點,均處於縱軸左側,即說明負向影響。

我們也可以把乙個特徵對目標變數影響程度的絕對值的均值作為這個特徵的重要性。

因為shap和feature_importance的計算方法不同,所以我們這裡也得到了與modle.feature_importances_不同的重要性排序。

利用shap解釋xgboost模型

漏洞可解釋性定位

利用可解釋性做定位,用可解釋的方法來做定位。首先在建模的時候要包括能體現漏洞的特徵,結合汙點分析的原理,可以這樣說,如果在source和sink中間沒有sanitizer操作,這才可能會導致漏洞發生,資料完整性或資料私密性被破壞。都說借助自然語言的處理方法來對程式處理,是為了程式的語義資訊。可是,程...

AI可解釋性主體

可解釋性,就是我們需要完成一件事的時候,我們能獲取到的足夠多的,能讓我們自己理解的資訊。當我們不能獲得足夠多的資訊,來理解一件事情的時候,我們可以說這是不可解釋的。所以,解釋性的目的就是以人的思維來理解事物,讓人能懂。但是在深度學習模型中,建立模型的時候往往沒有考慮到它的可解釋性,特別是在深層網路中...

11 模型可解釋性與視覺化

可解釋性,則說明對於模型的結果我們是可以理解的,我們不但知道正確率,我們還知道正確率怎麼來的,在生成環境中我們可能會通過模型的可及時性獲取與之相關的特徵,這樣可以使的我們樣本更具有訓練意義 print lr.coef lr.intercept 預設的排序結果是從小到大排序,因此最左邊就是負相關比較高...