博客專欄

EEPW首頁(yè) > 博客 > 獨(dú)家 | 用XGBoost入門可解釋機(jī)器學(xué)習(xí)

獨(dú)家 | 用XGBoost入門可解釋機(jī)器學(xué)習(xí)

發(fā)布人:數(shù)據(jù)派THU 時(shí)間:2020-09-25 來(lái)源:工程師 發(fā)布文章

這是一個(gè)故事,關(guān)于錯(cuò)誤地解釋機(jī)器學(xué)習(xí)模型的危險(xiǎn)以及正確解釋所帶來(lái)的價(jià)值。如果你發(fā)現(xiàn)梯度提升或隨機(jī)森林之類的集成樹(shù)模型具有很穩(wěn)定的準(zhǔn)確率,但還是需要對(duì)其進(jìn)行解釋,那我希望你能從這篇文章有所收獲。

假定我們的任務(wù)是預(yù)測(cè)某人的****財(cái)務(wù)狀況。模型越準(zhǔn)確,****就越賺錢,但由于該預(yù)測(cè)要用于貸款申請(qǐng),所以我們必須要提供預(yù)測(cè)背后的原因解釋。在嘗試了幾種類型的模型之后,我們發(fā)現(xiàn)XGBoost實(shí)現(xiàn)的梯度提升樹(shù)能提供最佳的準(zhǔn)確率。不幸的是,很難解釋為何XGBoost做出某個(gè)決策,所以我們只有兩種選擇:要么退回到線性模型,要么搞清楚如何解釋XGBoost模型。沒(méi)有數(shù)據(jù)科學(xué)家愿意在準(zhǔn)確率上讓步,于是我們決定挑戰(zhàn)自己,去解釋復(fù)雜的XGBoost模型(本例中,是6棵深達(dá)1247層的樹(shù))。

經(jīng)典的全局特征重要性度量

首先一個(gè)顯而易見(jiàn)的選擇是使用XGBoost中Python接口提供的plot_importance()方法。它給出一個(gè)簡(jiǎn)單明了的柱狀圖,表示數(shù)據(jù)集中每個(gè)特征的重要性(復(fù)現(xiàn)結(jié)果的代碼在Jupyter notebook中)。

1600997066163541.png

圖:該模型在經(jīng)典的成人普查數(shù)據(jù)集上被訓(xùn)練用于預(yù)測(cè)人們是否會(huì)報(bào)告超過(guò)5萬(wàn)美元的收入(使用logistic loss),上圖是執(zhí)行xgboost.plot_importance(model)的結(jié)果

仔細(xì)看一下XGBoost返回的特征重要性,我們發(fā)現(xiàn)年齡在所有特征中占統(tǒng)治地位,成為收入最重要的預(yù)測(cè)指標(biāo)。我們可以止步于此,向領(lǐng)導(dǎo)報(bào)告年齡這個(gè)直觀且讓人滿意的指標(biāo)是最重要的特征,緊隨其后的是每周工作時(shí)長(zhǎng)和受教育程度這些特征。但是,作為一名好的數(shù)據(jù)科學(xué)家,我們查詢了一下文檔,發(fā)現(xiàn)在XGBoost中衡量特征重要性有3個(gè)選項(xiàng):

1. Weight。某個(gè)特征被用于在所有樹(shù)中拆分?jǐn)?shù)據(jù)的次數(shù)

2. Cover。同上,首先得到某個(gè)特征被用于在所有樹(shù)中拆分?jǐn)?shù)據(jù)的次數(shù),然后要利用經(jīng)過(guò)這些拆分點(diǎn)的訓(xùn)練數(shù)據(jù)數(shù)量賦予權(quán)重

3. Gain。使用某個(gè)特征進(jìn)行拆分時(shí),獲得的平均訓(xùn)練損失減少量

這些是在任何基于樹(shù)的建模包中都能找到的重要性度量。Weight是默認(rèn)選項(xiàng),因此我們也試試另外兩種方法,看看有何不同:

1600997121838000.png

圖:運(yùn)行xgboost.plot_importance,并使用參數(shù) importance_type=’cover’和’gain’的結(jié)果

結(jié)果令人詫異,對(duì)于XGBoost提供的3個(gè)選項(xiàng),特征重要性的排序都大不相同。對(duì)于cover方法,資本收益似乎是收入最重要的預(yù)測(cè)指標(biāo),而對(duì)于gain方法,關(guān)系狀態(tài)特征獨(dú)占鰲頭。不知道哪種方法最好的情況下,依靠這些度量來(lái)報(bào)告特征重要性,這很讓人不爽。

什么因素決定了特征重要性度量的好壞?

如何比較兩種特征歸因(feature attribution)方法并不明顯。我們可以在諸如數(shù)據(jù)清洗,偏差檢測(cè)等任務(wù)上測(cè)量每種方法的最終用戶性能。但這些任務(wù)僅僅是特征歸因方法質(zhì)量的間接度量。這里,定義兩個(gè)我們認(rèn)為任何好的特征歸因方法都應(yīng)遵循的屬性:

1. 一致性(Consistency)。當(dāng)我們更改模型以使其更多依賴于某個(gè)特征時(shí),該特征的重要性不應(yīng)該降低。

2. 準(zhǔn)確性(Accuracy)。所有特征重要性的和應(yīng)該等于模型的總體重要性。例如,如果重要性由R^2值來(lái)衡量,則每個(gè)特征的歸因值加起來(lái)應(yīng)該等于整個(gè)模型的R^2。

如果一致性不滿足,那我們就無(wú)法比較任意兩個(gè)模型的特征重要性,因?yàn)榇藭r(shí)分配到更高的歸因并不意味著模型對(duì)此特征有更多依賴。

如果準(zhǔn)確性不滿足,那我們就不知道每個(gè)特征的歸因是如何合并起來(lái)以代表整個(gè)模型的輸出。我們不能簡(jiǎn)單的對(duì)歸因進(jìn)行歸一化,因?yàn)檫@可能會(huì)破壞該方法的一致性。

當(dāng)前的歸因方法是否一致且準(zhǔn)確?

回到之前****數(shù)據(jù)科學(xué)家的工作。我們意識(shí)到一致性和準(zhǔn)確性很重要。實(shí)際上,如果一個(gè)方法不具備一致性,我們就無(wú)法保證擁有最高歸因的特征是最重要的特征。因此,我們決定使用兩個(gè)與****任務(wù)無(wú)關(guān)的樹(shù)模型來(lái)檢查各個(gè)方法的一致性:

1600997163796955.png

圖:在兩個(gè)特征上的簡(jiǎn)單樹(shù)模型??人燥@然在模型B中比模型A中更重要。

模型的輸出是根據(jù)某人的癥狀而給出的風(fēng)險(xiǎn)評(píng)分。模型A僅僅是一個(gè)用于發(fā)燒和咳嗽兩個(gè)特征的簡(jiǎn)單“and”函數(shù)。模型B也一樣,只不過(guò)只要有咳嗽癥狀,就加10分。為了檢查一致性,我們需要定義“重要性”。此處,我們用兩種方式定義重要性:

1) 作為當(dāng)我們移除一組特征時(shí),模型預(yù)期準(zhǔn)確率的變化。

2) 作為當(dāng)我們移除一組特征時(shí),模型預(yù)期輸出的變化。

第一個(gè)定義度量了特征對(duì)模型的全局影響。而第二個(gè)定義度量了特征對(duì)單次預(yù)測(cè)的個(gè)性化影響。在上面簡(jiǎn)單的樹(shù)模型中,當(dāng)發(fā)燒和咳嗽同時(shí)發(fā)生時(shí)對(duì)于兩種定義,咳嗽特征在模型B中明顯都更重要。

****例子中的Weight,cover和gain方法都是全局特征歸因方法。當(dāng)在****部署模型時(shí),我們還需要針對(duì)每個(gè)客戶的個(gè)性化說(shuō)明。為了檢查一致性,我們?cè)诤?jiǎn)單的樹(shù)模型上運(yùn)行6種不同的特征歸因方法:

1. Tree SHAP。我們提出的一種新的個(gè)性化度量方法。

2. Saabas。一種個(gè)性化的啟發(fā)式特征歸因方法。

3. Mean( |Tree SHAP| )。基于個(gè)性化Tree SHAP平均幅度的一種全局歸因方法。

4. Gain,上述XGBoost使用的相同方法,等同于scikit-learn樹(shù)模型中使用的Gini重要性度量。

5. 拆分次數(shù)(Split Count)。代表XGBoost中緊密相關(guān)的’weight’和’cover’方法,但使用’weight’方法來(lái)計(jì)算。

6. 排列(Permutation)。當(dāng)在測(cè)試集中隨機(jī)排列某個(gè)特征時(shí),導(dǎo)致模型準(zhǔn)確率的下降。

1600997215491774.png

圖:使用6種不同方法對(duì)模型A和B做特征歸因。截止發(fā)文時(shí)間,這些方法代表了文獻(xiàn)中所有關(guān)于樹(shù)模型的特征歸因方法。

從圖上可知,除了permutation方法外,其余方法都是不一致的。因?yàn)樗鼈冊(cè)谀P虰中比在模型A中給咳嗽分配的重要性更少。不一致的方法無(wú)法被信任,它無(wú)法正確地給最有影響力的特征分配更多的重要性。細(xì)心的讀者會(huì)發(fā)現(xiàn),之前我們?cè)谕荒P蜕鲜褂媒?jīng)典的歸因方法產(chǎn)生矛盾時(shí),這種不一致已經(jīng)顯現(xiàn)。對(duì)于準(zhǔn)確性屬性呢?事實(shí)證明,Tree SHAP,Sabaas和 Gain 都如先前定義的那樣準(zhǔn)確,而permutation和split count卻不然。

令人驚訝的是,諸如gain(Gini重要性)之類廣泛使用的方法居然會(huì)導(dǎo)致如此明顯的不一致。為了更好地理解為何會(huì)發(fā)生這種情況,我們來(lái)仔細(xì)看看模型A和B中的gain是如何計(jì)算的。簡(jiǎn)單起見(jiàn),我們假設(shè)每個(gè)葉子節(jié)點(diǎn)中落有25%的數(shù)據(jù)集,并且每個(gè)模型的數(shù)據(jù)集都具有與模型輸出完全匹配的標(biāo)簽。

如果我們用均方誤差MSE作為損失函數(shù),則在模型A中進(jìn)行任何拆分之前,MSE是1200。這是來(lái)自恒定平均預(yù)測(cè)20的誤差。在模型A中用發(fā)燒特征拆分后,MSE降到了800,因此gain方法將此400的下降歸因于發(fā)燒特征。然后用咳嗽特征再次拆分,會(huì)得到MSE為0,gain方法會(huì)把這次800的下降歸因于咳嗽特征。同理,在模型B中,800歸因于發(fā)燒,625歸因于咳嗽。

1600997246635831.png

圖:模型A和模型B的gain(又稱基尼重要性)得分計(jì)算。

通常,我們期望靠近樹(shù)根的特征比葉子節(jié)點(diǎn)附近的特征更重要(因?yàn)闃?shù)就是貪婪地被構(gòu)造的)。然而gain方法偏向于將更多的重要性歸因于較低的拆分。這種偏見(jiàn)導(dǎo)致了不一致性,即咳嗽應(yīng)該更重要時(shí)(在樹(shù)根處拆分),給它歸因的重要性實(shí)際卻在下降。個(gè)性化的Saabas方法(被treeinterpreter包所使用)在我們從上到下遍歷樹(shù)時(shí)計(jì)算預(yù)測(cè)的差異,它也同樣受偏見(jiàn)影響,即偏向較低的拆分。隨著樹(shù)加深,這種偏見(jiàn)只會(huì)加劇。相比之下,Tree SHAP方法在數(shù)學(xué)上等價(jià)于對(duì)特征所有可能的排序上的預(yù)測(cè)差異求均值,而不僅僅是按照它們?cè)跇?shù)中的位置順序。

只有Tree SHAP既一致又準(zhǔn)確這并不是巧合。假設(shè)我們想要一種既一致又準(zhǔn)確的方法,事實(shí)證明只有一種分配特征重要性的方法。詳細(xì)介紹在我們最近的NIPS論文中,簡(jiǎn)單來(lái)講,從博弈論中關(guān)于利潤(rùn)公平分配的證明引出了機(jī)器學(xué)習(xí)中特征歸因方法的唯一結(jié)果。在勞埃德·沙普利(Lloyd Shapley)于1950年代推導(dǎo)出它們之后,這些唯一的值被稱為沙普利值(Shapley values)。我們?cè)谶@里使用的SHAP值是把與Shapley值相關(guān)的幾種個(gè)性化模型解釋方法統(tǒng)一而來(lái)的。Tree SHAP是一種快速算法,可以精確地在多項(xiàng)式時(shí)間內(nèi)為樹(shù)計(jì)算SHAP值,而不是在傳統(tǒng)的指數(shù)運(yùn)行時(shí)間內(nèi)(請(qǐng)參閱arXiv)。

充滿信心地解釋我們的模型

扎實(shí)的理論依據(jù)和快速實(shí)用的算法相結(jié)合,使SHAP值成為可靠地解釋樹(shù)模型(例如XGBoost的梯度提升機(jī))的強(qiáng)大工具。有了這個(gè)新方法,讓我們回到解釋****XGBoost模型的任務(wù):

1600997281928631.png

圖:全局Mean( |Tree SHAP| )方法應(yīng)用到收入預(yù)測(cè)模型上。x軸是當(dāng)某個(gè)特征從模型中’隱藏’時(shí)模型輸出的平均幅度變化(對(duì)于此模型,輸出具有l(wèi)og-odds單位)。詳細(xì)信息,請(qǐng)參見(jiàn)論文。但是“隱藏”是指將變量集成到模型之外。由于隱藏特征的影響會(huì)根據(jù)其他隱藏特征而變化,因此使用Shapley值可迫使一致性和準(zhǔn)確性。

圖上可看出,關(guān)系特征實(shí)際上是最重要的,其次是年齡特征。由于SHAP值保證了一致性,因此我們無(wú)需擔(dān)心之前在使用gain或split count方法時(shí)發(fā)現(xiàn)的種種矛盾。不過(guò),由于我們現(xiàn)在有為每個(gè)人提供的個(gè)性化說(shuō)明,我們還可以做的更多,而不只是制作條形圖。我們可以在數(shù)據(jù)集中給每個(gè)客戶繪制特征重要性。shap Python包使此操作變得容易。我們首先調(diào)用shap.TreeExplainer(model).shap_values(X)來(lái)解釋每個(gè)預(yù)測(cè),然后調(diào)用shap.summary_plot(shap_values,X)來(lái)繪制以下解釋:

1600997320629083.png

圖:每個(gè)客戶在每一行上都有一個(gè)點(diǎn)。點(diǎn)的x坐標(biāo)是該特征對(duì)客戶模型預(yù)測(cè)的影響,而點(diǎn)的顏色表示該特征的值。不在行上的點(diǎn)堆積起來(lái)顯示密度(此示例中有32,561個(gè)客戶)。由于XGBoost模型具有l(wèi)ogistic loss,因此x軸具有l(wèi)og-odds單位(Tree SHAP解釋了模型的邊距輸出變化)。

這些特征按mean(| Tree SHAP |)排序,因此我們?cè)俅慰吹疥P(guān)系這個(gè)特征被視為年收入超過(guò)5萬(wàn)美元的最強(qiáng)預(yù)測(cè)因子。通過(guò)繪制特征對(duì)每個(gè)樣本的影響,我們還可以看到重要的異常值影響。例如,雖然資本收益并不是全局范圍內(nèi)最重要的特征,但對(duì)于部分客戶而言,它卻是最重要的特征。按特征值著色為我們顯示了一些模式,例如,年紀(jì)較淺會(huì)降低賺取超過(guò) 5萬(wàn)美元的機(jī)會(huì),而受高等教育程度越高,賺取超過(guò)5萬(wàn)美元的機(jī)會(huì)越大。

我們可以停下來(lái)將此圖展示給老板,但這里咱們來(lái)更深入地研究其中一些特征。我們可以通過(guò)繪制年齡SHAP值(log odds的變化)與年齡特征值的關(guān)系來(lái)實(shí)現(xiàn):

1600997351675617.png

 圖:y軸是年齡特征改變多少每年賺取5萬(wàn)美元以上的log odds。x軸是客戶的年齡。每個(gè)點(diǎn)代表數(shù)據(jù)集中的一個(gè)客戶。

在這里,我們看到了年齡對(duì)對(duì)收入潛力的明顯影響。請(qǐng)注意,與傳統(tǒng)的部分依賴圖(其顯示當(dāng)更改特征值時(shí)的平均模型輸出)不同,這些SHAP依賴圖顯示了相互影響。即使數(shù)據(jù)集中的許多人是20歲,但年齡對(duì)他們的預(yù)測(cè)的影響程度卻有所不同,正如圖中20歲時(shí)點(diǎn)的垂直分散所示。這意味著其他特征正在影響年齡的重要性。為了了解可能是什么特征在影響,我們用受教育的年限給點(diǎn)涂上顏色,并看到高水平的教育會(huì)降低20歲時(shí)的年齡影響,而在30歲時(shí)會(huì)提高影響:

1600997377158720.png

圖:y軸是年齡特征改變多少每年賺取5萬(wàn)美元以上的log odds。x軸是客戶的年齡。Education-Num是客戶已接受的教育年限。

如果我們對(duì)每周的工作小時(shí)數(shù)做另一個(gè)依賴圖,我們會(huì)發(fā)現(xiàn),多投入時(shí)間工作的好處在每周約50個(gè)小時(shí)時(shí)達(dá)到瓶頸,而如果你已婚,則額外工作不太可能代表更高收入:

1600997421759920.png

圖:每周工作時(shí)間與工作時(shí)間數(shù)對(duì)收入潛力的影響。

解釋你自己的模型

這篇文章整個(gè)分析過(guò)程旨在模擬你在設(shè)計(jì)和部署自己的模型時(shí)可能要經(jīng)歷的過(guò)程。shap包很容易通過(guò)pip進(jìn)行安裝,我們希望它可以幫助你放心地探索模型。它不僅包含本文涉及的內(nèi)容,還包括SHAP交互值,模型不可知的SHAP值估算,以及其他可視化。還有很多notebooks來(lái)展示在各種有趣的數(shù)據(jù)集上的各種功能。例如,你可以在一個(gè)notebook中根據(jù)體檢報(bào)告數(shù)據(jù)來(lái)分析你將來(lái)最可能的死亡原因,這個(gè)notebook解釋了一個(gè)XGBoost死亡率模型。對(duì)于Python以外的其他語(yǔ)言,Tree SHAP也已直接合并到核心XGBoost和LightGBM軟件包中。

原文標(biāo)題:

Interpretable Machine Learning with XGBoost

原文鏈接:

https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。

電容器相關(guān)文章:電容器原理


低通濾波器相關(guān)文章:低通濾波器原理


電荷放大器相關(guān)文章:電荷放大器原理


關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉