天天看點

技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

作者:麗台科技
技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

Machine learning ( ML )越來越多地用于各個行業。欺詐檢測、需求感覺和信貸承銷是特定用例的幾個示例。

這些機器學習模型做出影響日常生活的決策。是以,模型預測必須公平、無偏見、無歧視。在透明度和信任至關重要的高風險應用程式中,準确的預測至關重要。

確定 AI 公平性的一種方法是分析從機器學習模型獲得的預測。這暴露了差異,并提供了采取糾正措施診斷和糾正根本原因的機會。

Explainable AI (XAI) 是一個負責任的人工智能領域,緻力于研究解釋機器學習模型如何進行預測的技術。這些解釋是人類可以了解的,使所有利益相關者能夠了解模型的輸出并做出必要的決策。SHAP 是一種在工業中廣泛使用的評估和解釋模型預測的技術。

這篇文章解釋了如何訓練 XGBoost 模型,如何使用 CPU 和 GPU 在 Python 中實作 SHAP 技術,最後比較兩者的結果。在文章結束時,您應該能夠回答以下問題:

  • 為什麼解釋機器學習模型至關重要,特别是在高風險決策中?
  • 我們如何區分可解釋技術和可解釋技術?
  • 什麼是 SHAP 技術,它是如何用來解釋模型的預測的?
  • GPU 加速 SHAP 的優勢是什麼?

可解釋性與可譯性

在人工智能和機器學習的背景下,區分可解釋性和可譯性很有幫助。這些術語具有不同的含義,但經常互換使用。

在開創性的論文Psychological Foundations of Explainability and Interpretability in Artificial Intelligence 中,美國國家标準與技術研究院( NIST )的研究人員提出了以下解釋性和可解釋性的定義:

可解釋性

可解釋性是一種低級、詳細的心理表征,旨在描述一些複雜的過程。解釋描述了一些模型機制或輸出是如何産生的。

可譯性

可解釋性是一種高層次、有意義的心理表征,它将刺激情境化,并利用人類背景知識。可解釋的模型應該為使用者提供資料點或模型輸出在上下文中的含義的描述。

此外,根據 Explanation in Artificial Intelligence: Insights from the Social Sciences , 可解釋性是指人類能夠了解和信任 ML 模型預測的程度。

解釋方法概述

解釋模型預測的方法可大緻分為model-specific 和post-hoc 技術 。

特定于型号

廣義線性模型、決策樹和廣義可加模型等算法都是可解釋的。這些模型被稱為“玻璃盒模型”,因為可以跟蹤和推斷預測是如何做出的。用于解釋此類模型的技術是model-specific ,因為每種方法都基于特定模型的内部結構。例如,對線性模型中權重的解釋會影響model-specific explanations。

後 hoc

顧名思義,事後解釋技術是在模型經過訓練後應用的。一些著名的事後技術包括SHAP、 LIME和[VZX 42]。這些是不确定模型的。他們将模型視為 BlackBox ,并假設他們隻能通路模型的輸入和輸出。這使得它們有利于複雜算法,如增強樹和深度神經網絡,這些算法無法通過特定于模型的技術進行解釋。

這篇文章主要關注 SHAP ,一種解釋模型預測的事後技術。

使用 SHAP 技術解釋模型

SHAP 是 SHapley Additive Explanations 的縮寫。它是最常用的事後解釋技術之一。SHAP 利用合作博弈理論 的概念分解預測,以衡量每個特征對預測的影響。

Shapley 值定義為特征值在所有可能的特征聯盟中的平均邊際貢獻。沙普利價值觀是一種起源于經濟學和博弈論的技術,它根據參與者對總收益的貢獻,為聯盟中的參與者配置設定公平的報酬。将其轉化為機器學習場景意味着根據特征對模型預測的貢獻來為模型中的特征配置設定重要性。

SHAP unifies 使用 Shapley 值生成準确的局部特征重要性值的幾種方法,然後可以對這些值進行聚合以獲得全局解釋。SHAP 值解釋了具有特定值的給定特征對模型預測的影響,與我們在該特征采用某個基線值時所做的預測相比。基線值是模型在沒有任何特征值資訊的情況下預測的值。

SHAP 是用于計算特征屬性的最廣泛的事後解釋技術之一。它不依賴于模型,可以作為一種局部和全局特征屬性技術使用,并有可靠的經濟學理論支援。此外,基于樹的模型的 SHAP 變體大大減少了計算時間,進而幫助使用者快速從模型中獲得見解。

以下部分提供了如何使用 SHAP 技術的示例。

步驟 1 :訓練 XGBoost 模型并計算 SHAP 值

使用衆所周知的Adult Income Dataset執行以下操作:

  • 根據給定的資料集訓練 XGBoost 模型,預測一個人的年收入是否超過 5 萬美元。此類資料在目标營銷等各種用例中都很有用。
  • 計算 SHAP 值以解釋各個特征的貢獻。
  • 可視化并解釋 SHAP 值。

安裝

可以使用 GitHub 上提供的名為shap的獨立 Python 軟體包安裝 SHAP :

pip install shap

or
conda install -c conda-forge shap           

SHAP 本身也受到流行算法(如 LightGBM 和 XGBoost )以及幾個 R 包的支援。

設定環境

首先設定環境并導入必要的庫:

import numpy as np   
import pandas as pd  

# Visualization Libraries
import matplotlib.pyplot as plt
%matplotlib inline

## Machine learning packages
from sklearn.model_selection import train_test_split
import xgboost as xgb

## Model Interpretation package
import shap
shap.initjs()

# Ensuring Reproducibility
SEED = 12345

# Ignoring the warnings
import warnings  
warnings.filterwarnings(action = "ignore")           

資料集

此資料集來自UCI Machine Learning Repository Irvine,可在Kaggle上使用。它包含基于人口普查資料的 人口統計資訊。資料集具有諸如教育程度、每周工作時間、年齡等屬性。

shap 庫附帶了一些常用的資料集,包括下面使用的成人收入資料集的預處理版本。

技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

圖 1.從 shap 庫通路資料集

X,y = shap.datasets.adult()
X_view,y_view = shap.datasets.adult(display=True)
X_view.head()           
技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

表 1.顯示資料集前五行的 DataFrame

如上所示,資料集由各種預測變量(如年齡、工作級别和教育程度)以及一個目标變量組成。如果一個人年收入> 5 萬美元,目标變量為 True;如果年收入為≤$ 50 公裡。在確定資料集經過預處理和清理後,繼續進行模型訓練。

訓練 XGBoost 模型

XGBoost 在表格資料集方面表現出色,在機器學習社群中非常流行。首先,将資料集拆分為訓練集和驗證集。

# create a train/test split
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.2, random_state=7)           

接下來,根據 5K 助推回合的訓練資料訓練 XGBoost 模型。

# read in the split dataset into an optimized data structure called Dmatrix required by XGBoost
dtrain = xgb.DMatrix(X_train, label=y_train)
dvalid = xgb.DMatrix(X_valid, label=y_valid)

%%time
# Feed the model the global bias
base_score = np.mean(y_train)
#Set hyperparameters for model training
params = {
   'objective': 'binary:logistic',
   'eval_metric': 'logloss',
   'eta': 0.01,
   'subsample': 0.5,
   'colsample_bytree': 0.8,
   'max_depth': 5,
   'base_score': base_score,
   'seed': SEED
}
# Train using early stopping on the validation dataset.
watchlist = [(dtrain, 'X_train'), (dvalid, 'X_test')]
model = xgb.train(params,        
                       dtrain,                  
                       num_boost_round=5000,                    
                       evals=watchlist,
                       early_stopping_rounds=20,
                       verbose_eval=100)
===============================================================
Wall time: 14.3 s           

在 Apple M1 8 核 CPU 上執行訓練需要 14.3 秒,并啟用了提前停止功能。

有關 XGBoost 子產品内可配置參數的更多資訊,請參閱 XGBoost Parameters 。

計算 SHAP 值

根據算法的性質, SHAP 有許多不同的風格。最流行的似乎是 KernelSHAP 、 DeepSHAP 和 TreeSHAP 。雖然 KernelSHAP 與模型無關,但 TreeSHAP 僅适用于基于樹的模型(包括我們剛剛教育訓練的 XGBoost 模型)。使用 shap 庫中的 TreeExplainer 類解釋包含超過 30K 個樣本和超過 1000 棵樹的整個資料集。

%%time
explainer = shap.TreeExplainer(model=model)
shap_values = explainer.shap_values(X) 
================================================================
CPU times: user 4min 12s, sys: 116 ms, total: 4min 12s
Wall time: 1min 4s
           

使用上述相同的硬體,在 1.4 分鐘内計算出 SHAP 值。請注意将它們與下一秒獲得的值進行比較的時間。既然已經确定了 SHAP 值,下一步就是解釋。為了了解這些值, shap 提供了幾種不同類型的可視化,如力圖、彙總圖、決策圖等,每種圖都突出了模型的特定方面。下面包括兩個圖。

SHAP 力圖

力圖用于解釋資料集中的單個執行個體。為訓練集中的第一行生成力圖,并檢視不同特征如何影響預測。首先列印此資料執行個體的地面真相标簽和模型預測。

classes = {0 : 'False', 1: 'True'}

# ground truth label
y[0]
=========================
False

# Model Prediction
y_pred = [round(value) for value in model.predict(dvalid)]
classes[y_pred[0]]

==========================================================
False
           

此人的基本真相标簽為 False ;也就是說,這個人賺了≤$每年 5 萬。該模型也預測了同樣的情況。圖 2 顯示了同一個人的力量圖,深入了解了各種特征是如何對模型的預測做出貢獻的。

shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0,:],X.iloc[0,:])           
技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

圖 2.SHAP 力圖

此處的 base _ value 為– 1.143 ,而所選樣本的目标值為– 3.89 。所有大于基本值的值都有收益≥$ 50K ,反之亦然。對于所選的樣本,圖 2 中顯示為紅色的特征将預測推到基礎值,而藍色的特征則将預測推離基礎值。是以,可以推斷,擁有 2174 的資本收益和 0 的關系狀态會對該模型對該特定個人收入> 5 萬美元的預測産生負面影響。

SHAP 彙總圖

上一節讨論了 SHAP 如何提供局部解釋,或針對單個預測的解釋。可以聚合這些值,以了解全局視圖。一種方法是使用SHAP summary plots 。

SHAP 彙總圖概述了哪些功能對模型更重要。這可以通過為資料集中的每個樣本繪制每個特征的 SHAP 值來實作。圖 3 描述了一個彙總圖,其中圖中的每個點對應于資料集中的一行。

shap.summary_plot(shap_values_gpu, X_test)           
技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

圖 3.SHAP 彙總圖

圖 3 中的每個點表示原始資料集中的一行。對于每個點:

  • y 軸按重要性從上到下的順序訓示特征。x 軸指的是實際的 SHAP 值。
  • 點的水準位置表示特征對該特定樣本的模型預測的影響。
  • 顔色顯示資料集任何行的特征值是高(紅色)還是低(藍色)。

從總結圖可以推斷,與其他特征相比,“關系狀态”和“年齡”對預測一個人是否會獲得更高收入具有更高的總模型影響。

步驟 2 : GPU 加速 SHAP

如前一節所述,TreeSHAP是專門為樹內建模型定制的 SHAP 版本。雖然 TreeSHAP 相對較快,但當集合大小變得太大時,它也可能面臨典型的計算問題。在這種情況下,建議利用 GPU 加速來加快過程。

然而, TreeSHAP 算法的複雜性導緻難以映射到硬體加速器。這導緻了 GPUTreeShap 的開發,這是适合與 GPU 一起使用的 TreeSHAP 算法的變體。現在可以在計算 SHAP 值時利用 GPU 硬體,進而加快整個模型解釋過程。

GPUTreeShap enables massively exact calculation of the shape values for tree-based algorithms。圖 4 顯示了 GPUTreeSHAP 如何提供在 CPU 上使用帶有 GPU 的 SHAP 時獲得的增益估計。根據 GPUTreeShap: Massively Parallel Exact Calculation of SHAP Scores for Tree Ensembles ,“通過單個 NVIDIA Tesla V100-32 GPU ,在兩個 20 核 Xeon E5-2698 v4 2.2 GHz CPU 上執行的最先進的多核 CPU 實作上,我們實作了 SHAP 值最高 19 倍的加速, SHAP 互動值最高 340 倍的加速。我們還使用八個 V100 GPU 進行了多 GPU 計算實驗,顯示每秒 1.2M 行的吞吐量–基于 CPU 的等效性能估計需要 6850 CPU 個核心。”

技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

圖 4.使用 GPU 的 SHAP 加速

安裝

GPUTreeShap 已與 Python shap package 內建。通路 GPUTreeShap 的另一種方法是安裝 RAPIDS 資料科學架構。這確定了可以通路 GPUTreeShap 和許多不同的庫,以便完全在 GPU 中執行端到端的資料科學管道。

RAPIDS 也有 integrated with XGBoost (從 0.14 開始)。事實上, XGBoost 是在最終成為 RAPIDS 生态系統的情況下加速的第一個流行的 ML 工具包。圖 5 突出顯示了 GPU 上的 XGBoost 加速,将單個 V100 GPU 與雙 20 核 CPU 進行了比較。

開發人員可以利用 RAPIDS 對 XGBoost 和 SHAP 值的 GPU 加速。預設的開源 XGBoost 包已經包含支援 GPU CUDA 的 GPU 支援。

技術部落格 | 使用 GPU 加速 SHAP 解釋機器學習模型預測

圖 5. RAPIDS 與 XGBoost 社群密切合作,加速 GPU 上的 GBDT

使用 GPU 加速訓練 XGBoost 車型

上一節示範了誰在成人收入資料集上訓練 XGBoost 模型。本節重複使用 GPU 加速啟用的相同過程。這需要更改名為 tree_method 的單個參數的值,并大幅減少計算時間。

将 tree_method 參數指定為 gpu_hist,保持所有其他參數不變。

%%time
# Feed the model the global bias
base_score = np.mean(y_train)

#Set hyperparameters for model training
params = {
    'objective': 'binary:logistic',
    'eval_metric': 'logloss',
    'eta': 0.01,
    'subsample': 0.5,
    'colsample_bytree': 0.8,
    'max_depth': 5,
    'base_score': base_score,
    'tree_method': "gpu_hist", # GPU accelerated training
    'seed': SEED
}

# Train using early stopping on the validation dataset.
watchlist = [(dtrain, 'X_train'), (dvalid, 'X_test')]

model_gpu = xgb.train(params,         
                        dtrain,                   
                        num_boost_round=5000,                     
                        evals=watchlist,
                        early_stopping_rounds=10,
                        verbose_eval=100)

=============================================================
CPU times: user 2.43 s, sys: 484 ms, total: 2.91 s
Wall time: 3.27 s           

使用單個 Tesla T4 GPU (通過 Google Colab 提供)訓練 XGBoost 車型有助于将訓練時間從 14.3 秒減少到 3.27 秒。減少計算時間是有益的,因為訓練機器學習模型,特别是在大型資料集上,既有挑戰性,又很昂貴。

使用 GPU 計算 SHAP 值

當選擇 GPU 預測器時, XGBoost 将 GPUTreeShap 用作計算形狀值的後端。

%%time
model_gpu.set_param({"predictor": "gpu_predictor"})
explainer_gpu = shap.TreeExplainer(model=model_gpu)
shap_values_gpu = explainer_gpu.shap_values(X)
==========================================================
CPU times: user 1.34 s, sys: 252 ms, total: 1.59 s
Wall time: 1.56 s
           

使用 GPU ,計算 Shapley 值的計算時間從 1.4 分鐘減少到 1.56 秒,大大減少了計算時間。當資料集涉及數百萬個資料點時,這種收益将更加顯著,這在許多行業都很常見。

總結

SHAP 等技術可以使機器學習系統更加可靠。如果一個模型可以被忠實地解釋,那麼可以對其進行分析,以确定它是否适合部署。這是向灌輸對任何技術的信任邁出的重要一步。使用 GPU 加速,可以更快地計算 SHAP 值,進而更快地了解預測模型。

然而, SHAP 并不是萬能的,它有自己的局限性。對 SHAP 的主要批評是它可能被誤解。SHAP 基本上有助于回答為什麼特定觀測值接收到預測而不是基線值的問題。該基線值由背景資料集的選擇決定,如果參考資料集發生變化,則可以提供對比結果。

是以,根據背景資料集的選擇,相同的觀察可能會導緻不同的 SHAP 值。是以,重要的是要仔細、适當地 選擇背景資料集 記住它們的使用背景。了解機器學習中與可解釋性技術相關的假設和權衡非常重要。

要檢視本文中使用的代碼,請通路 GitHub 上的 parulnith/Data-Science-Articles 。

*本文轉自 NVIDIA英偉達

繼續閱讀