我正在查看 Iris 資料集,其中我為 X_test 資料集計算了 SHAP_values,我提供了每個陣列的前五個作為示例:
[
array([[-0.02994951, -0.00631915, -0.11904487, -0.13368648],
[-0.00344951, 0.06718085, 0.24445513, 0.40281352],
[-0.02701866, -0.00925 , -0.084 , -0.16873134],
[-0.02994951, -0.00631915, -0.11904487, -0.13368648],
[-0.03526866, -0.001 , -0.11904487, -0.13368648]]),
array([[ 0.02296024, 0.0191085 , 0.27049242, 0.31693884],
[ 0.02209713, -0.0431662 , -0.12745271, -0.20947822],
[-0.0270254 , -0.0025275 , -0.10235476, -0.22609234],
[ 0.03241468, 0.04532274, 0.25367799, 0.29808459],
[ 0.04827892, -0.00105323, 0.13303134, 0.36174298]]),
array([[ 0.00698927, -0.01278935, -0.15144755, -0.18325236],
[-0.01864762, -0.02401465, -0.11700243, -0.1933353 ],
[ 0.05404406, 0.0117775 , 0.18635476, 0.39482368],
[-0.00246517, -0.03900359, -0.13463313, -0.16439811],
[-0.01301026, 0.00205323, -0.01398647, -0.2280565 ]])
]
我有以下預期值:
EV = [0.289 0.358 0.353]
例如,對于陣列 0 中的第一行,我將期望值添加到陣列 0 中第 0 行的總和中,然后我可以查看給定樣本的貢獻是加到 0 還是加到 1。
sv_0_sum = sv_0.iloc[0, :] # -0.28900000000000003
print(sv_0_sum.sum() explainer.expected_value[0])
在這種情況下,結果為 0。我認為這是有道理的,但是對于二進制分類,SHAP 值將產生一個反映值的 2 個陣列。舉個例子,給定一些資料集中的一個樣本的任意值將是:
shap_values[0] = [0.013, 0.423, 0.245, -0.0123]
和
shap_values[1] = [-0.013, -0.423, -0.245, 0.0123]
但是這個概念如何與多類一起作業?在為 Iris 提供的三個陣列中,我沒有得到這個反映,那么如何理解多類情況下輸出的 SHAP 值呢?
uj5u.com熱心網友回復:
讓我們嘗試重現:
from lightgbm import LGBMClassifier
from shap.datasets import iris
from shap import Explainer, Explanation
from shap import waterfall_plot
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(*iris(), random_state=42)
model = LGBMClassifier().fit(X_train, y_train)
explainer = Explainer(model)
sv = np.array(explainer.shap_values(X_test)) # <-- SHAP values
ev = np.array(explainer.expected_value) # <-- base values
你在這里得到的是每個類的基本值:
ev
array([-3.5596808 , -1.08989253, -3.20879218])
您將在其上添加 shap 值。注意形狀:
ev.shape, sv.shape
((3,), (3, 38, 4))
在哪里:
3對應類數38病例數4是特征,您有興趣為其查找 SHAP 值。
然后,您可能會對如何解釋特定預測感興趣:
idx = 0
model.predict(X_test.iloc[[idx]], raw_score=True)
array([[-8.10103813, 1.50946338, -3.6985032 ]])
如果將每個感興趣的資料點的 SHAP 值添加到基值,您將獲得相同的預測值:
ev sv[:, idx, :].sum(-1)
array([-8.10103813, 1.50946338, -3.6985032 ])
或視覺上:
waterfall_plot(Explanation(sv[0][idx], ev[idx], feature_names=X_train.columns))

其中0代表感興趣的類別預測。
附言
由于 LGBM 分類器中內置的隨機性,您很可能會得到稍微不同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472465.html
