從XGBoost算法開始,更好地理解和改進你的模型

从XGBoost算法开始,更好地理解和改进你的模型

「CVPR 2018不虛此行精英晚宴」

美國當地時間6月21日晚7:30-9:30@鹽湖城,將門攜眾好友——景馳、碼隆、迪英加、圖森、地平線一起搞事情啦!除了為大家提供充分的交流時間,我“門”還準備了各種走心的獎品,歡迎來玩耍! 戳我來報名

XGBoost 是一種高效的集成學習模型框架,利用樹型分類器可以得到強大的分類結果和十分高效的運算效率。這篇文章主要探討如何解釋這種高效算法的方法,以及正確解釋模型的價值。如果你也被集成樹模型(如梯度提升樹)的可靠性和準確率所吸引,並且需要對他們作出解釋,那麼這篇文章會為你帶來很多有益的思考。

假設我們的任務是為銀行預測個人的金融狀況。模型準確率越高,銀行收入就越多。但是因為模型的預測會用於借貸業務,因此我們也要能對模型為什麼做出這樣的預測給出合理解釋。在嘗試了各種各樣的模型後,我們發現XGBoost所實現的梯度提升樹模型能給出最好的準確率。然而要解釋為什麼XGBoost做出某個預測是困難的,所以我們面前有兩個選擇:1. 轉而使用更容易解釋的線性模型。2. 找出如何解釋XGBoost模型的方法。數據科學家們往往都不想犧牲準確率,所以我們也決定嘗試後者,即對複雜XGBoost模型(1247個深度為6的決策樹)作出解釋。

經典全局特徵重要性度量

最直接的選擇就是使用XGBoost Python接口中的plot_importance方法。它能給出一個簡單的柱狀圖來表示我們數據集中每一個特徵的重要性。

从XGBoost算法开始,更好地理解和改进你的模型

在一個用來預測人們是否會上報$50k以上收入的模型上運行xgboost.plot_importance方法的結果

通過觀察XGBoost所返回的特徵重要性結果,我們可以看到年齡毫無疑問比其他特徵都要重要。我們可以就此打住,並得出年齡就是我們模型最重要特徵的結論,其次是每週的工作時長和受教育水平。但是身為優秀的數據科學家,我們從文檔中得知在XGBoost中對特徵重要性的度量共有三個選項:

  • Weight:一個特徵在所有決策樹中被用來劃分數據的次數。

  • Cover:一個特徵在所有決策樹中被用來劃分數據的次數和每次劃分涉及的樣本個數得到的加權結果。

  • Gain:一個特徵被用於劃分數據時所帶來的訓練損失減益的平均值。

這些都是幾乎在任何樹模型的包裡都能見到的典型重要性度量。Weight是默認選項,所以我們決定試一下另外兩個選項,看結果是否有所差別。

从XGBoost算法开始,更好地理解和改进你的模型

用cover和gain作為選項來運行xgboost.plot_importatnce的結果

我們很驚訝地看到特徵重要性的順序較之前有很大不同。以cover為度量時,capital gain這一特徵最能用於預測,而當用gain作為度量時,relationship status比其他特徵都重要。在搞清哪一種度量最好之前,我們很難直接用這些度量來解釋模型的重要性。

如何判斷特徵重要性的度量是好是壞?

比較不同特徵歸因方法(feature attribution method)的優劣並不容易。為了方便比較,我們定義如下兩個指標:

  • 一致性:如果我們對一個模型作出修改,使得它更依賴於某一個特徵的話,那麼由特徵歸因方法所得到的該特徵的重要性(attributed importance)不應當降低。

  • 準確性:所有特徵重要性的和應等於模型的總重要性。例如,如果重要性是由R²值計算得到的,那麼各個特徵的R²值相加應等於模型的R²值。

如果某種特徵歸因方法不滿足一致性,我們就很難用這種方法來比較兩個模型。因為即便我們算得一個特徵在一個模型的重要性更高,也不意味著這個模型更依賴於該特徵。

而當一個方法不滿足準確性時,我們不知道每個特徵的重要性跟模型重要性間的關係是怎麼樣的。所以我們就不能對歸因方法的結果直接歸一化,因為歸一化可能會打破一致性。

目前的歸因方法是一致和準確的嗎?

如上所述,一個歸因方法應當滿足一致性和準確性,當一個方法不滿足一致性,我們不能保證具有最高歸因的特徵是實際上最重要的。下面我們來使用兩個非常簡單的樹模型來檢查歸因方法的一致性:

从XGBoost算法开始,更好地理解和改进你的模型

基於兩個特徵的簡單樹模型,模型B中的咳嗽這一個特徵顯然比模型A中的更重要。

模型的輸出是基於不同症狀對生病的風險所做出的評分。當發燒和咳嗽兩個症狀同時出現時,模型A會給出一個非零的風險分數。模型B跟模型A類似,但在咳嗽症狀出現時,模型B會在模型A的基礎上加10分。為了檢查一個歸因方法是否滿足一致性,我們要先定義“重要性”。在這裡我們將用兩種方法來定義重要性:1)當我們移除一組特徵時,模型預期準確率(accuracy)的變化。 2)當我們移除一組特徵時,模型預期輸出(output)的變化。

第一個定義可以衡量特徵對模型的全局影響,而第二個定義則是衡量特徵對單一預測的局部影響。在A和B兩個簡單樹模型中,無論從哪個定義出發,咳嗽特徵在模型B中都更重要。

上文中提到的weight,cover和gain三種方法都是全局特徵歸因方法。但是對銀行部署的模型來說,模型需要對每個客戶的預測提供解釋。為了驗證不同方法是否滿足一致性,我們在簡單樹模型上運行五種不同的特徵歸因方法:

1. Tree SHAP.我們提出的一種新穎的局部方法。

2. Saabas.一種啟發式的局部方法。

3. mean(|Tree SHAP|). 一種基於Tree SHAP的局部結果取均值的全局方法。

4. Gain.與上文中的XGBoost中的Gain方法相同。

5. Split count. 與上文中XGBoost中的weight方法相同。

6. Permutation.

當隨機擾動某個特徵時,模型在測試集上的準確率的下降。

从XGBoost算法开始,更好地理解和改进你的模型

使用六種不同的方法對模型A和模型B進行特徵歸因。這六種方法是已知文獻中所有針對樹模型的特徵歸因方法。

但前述的方法都是不一致的,這是由於他們認為在模型B中咳嗽的重要性小於模型A。不一致的模型不能將影響最大的特徵視為最重要的特徵。細心的讀者可能已經發現我們已經在前文中的經典特徵歸因方法中提出過不一致特徵了。同時對於精確性來說,Tree SHAP、Sabaas和Gain三種方法是精確的而分裂計數和特徵置換是不準確的。

令人驚訝的是,被廣泛使用的基於gain的方法會引起如此多的不一致的結果。為了更好的理解其中的原因,讓我們來看看gain是如何計算模型A和B的。讓我們簡單的假設25%的數據落到了每一個的葉子節點並被精確的標記(每個葉子1/4)。

如果將均方根誤差作為損失函數,首先從模型A的1200開始計量。在第一次分裂的過程中,損失從1200降到了800,那麼意味著gain利用fever特徵貢獻了400提升;進一步利用cough特徵分裂得到了0的損失,意味著cough貢獻了800的提升;在模型B中,Cough和Fever分別貢獻了625和800的提升。如下圖所示:

从XGBoost算法开始,更好地理解和改进你的模型

模型A和模型B的分數計算

通常情況下距離根比較近的節點擁有比靠近葉子節點更重要的特徵。那麼對於gain方法來說,它對於gain方法來說低層級靠近葉子節點的特徵卻貢獻了更多的重要性。正是這種偏差導致了不一致性。隨著樹的加深,這樣的偏差也在不斷增長。但對於Tree SHAP方法來說,在數學上對不同層次的特徵進行了平均。

模型解釋

結合了堅實的理論和快速的算法實現讓SHAP值成為了解釋樹形模型的有力工具。利用這種新方法,我們重新解釋了上文中個性化銀行模型中的特徵。

基於SHAP的全局均值方法用於收入預測模型

我們可以看到關係是最重要的特徵,其次是年齡特徵。SHAP度量保證了一致使得我們的分析更加容易。接下來我們需要對每一個客戶繪製響應的特徵:

从XGBoost算法开始,更好地理解和改进你的模型

圖中每個點代表一個客戶,x座標是特徵的重要性,顏色代表特徵的取值

上圖中特徵根據均值排列,從中我們可以看到關係特徵在收入達到50k$上的預測十分強烈。同時我們可以從上圖中看到局外點的影響。圖中的的顏色同時還顯示了年輕人一般收入較低、受教育程度會提高收入。

做了這麼多,結果已經很棒了。但是我們還可以從中發現更多的信息。我們可以繪製出度量隨特徵的變化如下圖所示:

从XGBoost算法开始,更好地理解和改进你的模型

y軸表示了年齡對於年收入超過50k$的影響程度。

從中可以清晰的看到XGBoost模型抽取的特徵,及其相互影響。對於20多歲的年輕人來說,年齡對於他們的影響十分小甚至有副作用,這意味著其他特徵影響著年齡的重要性。為了瞭解這種相互影響,我們將受教育年限作為帶顏色的點繪製到了同一副圖中。高等教育在20多歲的年紀裡對於收入影響不大,但在30多歲時候卻有著至關重要的影響。

上圖中可以清楚的看出受教育程度和年齡的關係。同樣我們還可以做出每週工作時間及其重要性的關係。

如果我們對於數據中的另一個變量工作時間進性相同的分析的話,我們會發現沒有工作50小時是比較好的選擇,而如果對對於已婚人士來說的話超出的工作時間並不能為他們帶來更多的收入。

从XGBoost算法开始,更好地理解和改进你的模型

解讀你的模型

我們大概瀏覽了一遍在構建和部署模型的時候如何思考和理解模型。我們可以通過SHAP值作為度量來分析並利用shape工具包來可視化分析結果。從而尋找出最重要的變量。如果你對XGBoost感興趣,你還可以嘗試下Apache的XGBoost和微軟的LightGBM這兩個工具包,相信會給你帶來不錯的結果。

-The End-

將門是一家專注於發掘、加速並投資技術創新激活商業價值的創業公司的新型創投機構,旗下設有將門創新服務、將門技術社群以及將門投資基金。

將門創新服務專注於使創新的技術落地於真正的應用場景,激活和實現全新的商業價值,服務於行業領先企業和技術創新型創業公司。

將門技術社群專注於幫助技術創新型的創業公司提供來自產、學、研、創領域的核心技術專家的技術分享和學習內容,使創新成為持續的核心競爭力。

將門投資基金專注於投資通過技術創新激活商業場景,實現商業價值的初創企業,關注技術領域包括機器智能、物聯網、自然人機交互、企業計算。在兩年的時間裡,將門投資基金已經投資了包括量化派、碼隆科技、禾賽科技、偉景智能、杉數科技、迪英加科技等數十傢俱有高成長潛力的技術型創業公司。

如果您是技術領域的初創企業,不僅想獲得投資,還希望獲得一系列持續性、有價值的投後服務,歡迎發送或者推薦項目給我“門”: [email protected]

从XGBoost算法开始,更好地理解和改进你的模型

點擊右上角,把文章朋友圈

將門創投

讓創新獲得認可!

[email protected]


分享到:


相關文章: