如何解讀決策樹和隨機森林的內部工作機制?

如何解讀決策樹和隨機森林的內部工作機制?

隨機森林在過去幾年裡得到了蓬勃的發展。它是一種非線性的基於樹的模型,往往可以得到準確的結果。但是,隨機森林的工作過程大都處於黑箱狀態,往往難以解讀和完全理解。近日,Pivotal Engineering Journal 網站發表了一篇文章,對隨機森林的基礎進行了深度解讀。該文從隨機森林的構造模塊決策樹談起,通過生動的圖表對隨機森林的工作過程進行了介紹,能夠幫助讀者對隨機森林的工作方式有更加透徹的認識。本文內容基於 Ando Saabas 的一個 GitHub 項目。另外,你也能在 GitHub 上找到用於創建本文中各種圖表的代碼。

  • Ando Saabas 的項目:https://github.com/andosa/treeinterpreter

  • 創建圖表的代碼:https://github.com/gregtam/interpreting-decision-trees-and-random-forests

決策樹的工作方式

決策樹可以看成為一個 if-then 規則的集合,即由決策樹的根節點到葉節點的每一條路徑構建一條規則,路徑上內部節點的特徵對應著規則的條件,而葉節點的類對應於規則的結論。因此決策樹就可以看作由條件 if(內部節點)和滿足條件下對應的規則 then(邊)組成。

決策樹的工作方式是以一種貪婪(greedy)的方式迭代式地將數據分成不同的子集。其中迴歸樹(regression tree)的目的是最小化所有子集中的 MSE(均方誤差)或 MAE(平均絕對誤差);而分類樹(classification tree)則是對數據進行分割,以使得所得到的子集的熵或基尼不純度(Gini impurity)最小。

結果得到的分類器可以將特徵空間分成不同的子集。對某個觀察的預測將取決於該觀察所屬的子集。

如何解讀決策樹和隨機森林的內部工作機制?

圖 1:一個決策樹的迭代過程

決策樹的貢獻

以鮑魚數據集(https://archive.ics.uci.edu/ml/datasets/abalone)為例。我們將根據殼的重量、長度、直徑等變量來預測鮑魚殼上環的數量。為了演示,我們構建了一個很淺的決策樹。我們可以通過將樹的最大層數限制為 3 而得到這個樹。

如何解讀決策樹和隨機森林的內部工作機制?

圖 2:預測不同環數的決策樹路徑

要預測鮑魚的環的數量,決策樹將沿著樹向下移動直到到達一個葉節點。每一步都會將當前的子集分成兩個。對於一次特定的分割,我們根據平均環數的改變來定義對該分割做出了貢獻的變量。

比如說,如果我們拿到一個殼重 0.02、長度為 0.220 的鮑魚,那麼它就將落在最左邊的葉節點上,預測的環數是 4.4731。殼重對預測環數的貢獻為:

(7.587 – 9.958) + (5.701 – 7.587) = -4.257

長度的貢獻為:

(4.473 – 5.701) = -1.228

這些貢獻都是負數,說明對於這個特定的鮑魚,殼重和長度值會使預測的環數下降。

我們可以通過運行以下代碼得到這些貢獻。

from treeinterpreter import treeinterpreter as tidt_reg_pred, dt_reg_bias, dt_reg_contrib = ti.predict(dt_reg, X_test)

其中變量 dt_reg 是 sklearn 分類器目標,X_test 是一個 Pandas DataFrame 或 numpy 數組,包含了我們希望從中得到預測和貢獻的特徵。其貢獻變量 dt_reg_contrib 是一個二維 numpy 數組 (n_obs, n_features),其中 n_obs 是觀察的數量,n_features 是特徵的數量。

我們可以繪製一個給定鮑魚的這些貢獻的圖表,看看哪些特徵對預測得到的值的影響最大。我們可以從下面這幅圖表看到這個特定的鮑魚的重量和長度值對預測得到的環數所產生的負影響。

如何解讀決策樹和隨機森林的內部工作機制?

圖 3:一個貢獻圖表示例(決策樹)

我們可以使用小提琴圖表(Violin plot)將這個特定鮑魚的貢獻與所有鮑魚的情況進行比較。這樣可以在這張圖表上疊加一個核密度估計。在下圖中,我們可以看到,與其它鮑魚相比,這個特定鮑魚的殼重異乎尋常地低。實際上,很多鮑魚的殼重值的貢獻都是正數。

如何解讀決策樹和隨機森林的內部工作機制?

圖 4:使用 violin 圖對一個觀察樣本繪製的貢獻圖(決策樹),文末將附上 violin 圖的基本概念與用法。

上面的圖雖然有些信息,但仍然無法讓我們完全理解一個特定變量對鮑魚所擁有的環數的影響。於是,我們可以根據一個給定特徵的值繪製其貢獻。如果我們繪製殼重的值與其貢獻的比較,我們可以知道殼重的增長會導致貢獻的增長。

如何解讀決策樹和隨機森林的內部工作機制?

圖 5:貢獻與殼重(決策樹)

另一方面,去殼後的重量與貢獻的關係是非線性非單調的。更低的去殼後的重量沒有任何貢獻,更高的去殼後的重量有負貢獻,而在兩者之間,貢獻是正的。

如何解讀決策樹和隨機森林的內部工作機制?

圖 6:貢獻與去殼後的重量(決策樹)

擴展成隨機森林

通過將許多決策樹組成森林併為一個變量取所有樹的平均貢獻,這個確定特徵的貢獻的過程可以自然地擴展成隨機森林。

如何解讀決策樹和隨機森林的內部工作機制?

圖 7:使用 violin 圖對一個觀察繪製的貢獻圖(隨機森林)

因為隨機森林固有的隨機性,一個給定殼重值的貢獻會有所不同。但是如下圖平滑的黑色趨勢線所示,這種增長的趨勢仍然存在。就像在決策樹上一樣,我們可以看到殼重增大時,貢獻會更高。

如何解讀決策樹和隨機森林的內部工作機制?

圖 8:貢獻與殼重(隨機森林)

同樣,我們也可能會看到複雜的不單調的趨勢。直徑的貢獻似乎在大約 0.45 處有一處下降,而在大約 0.3 和 0.6 處各有一處峰值。除此之外,直徑和環數之間的關係基本上是增長的。

如何解讀決策樹和隨機森林的內部工作機制?

圖 9:貢獻與直徑(隨機森林)

分類

我們已經看到迴歸樹的特徵分佈源自環的平均值以及其在後續分割中的變化方式。我們可以通過檢查每個子集中某個特定類別的觀察的比例,從而將其擴展成二項分類或多項分類。一個特徵的貢獻就是該特徵所導致的總的比例變化。

通過案例解釋更容易理解。假設現在我們的目標是預測性別,即鮑魚是雌性、雄性還是幼體。

如何解讀決策樹和隨機森林的內部工作機制?

圖 10:多項分類的決策樹路徑

每個節點都有 3 個值——該子集中雌性、雄性和幼體各自的比例。一個臟器重量為 0.1 且殼重 0.1 的鮑魚屬於最左邊的葉節點(概率為 0.082、0.171 和 0.747)。適用於迴歸樹的貢獻邏輯在這裡也同樣適用。

如果這個特定鮑魚是幼體,那麼臟器重量的貢獻為:

(0.59 – 0.315) = 0.275

殼重的貢獻為:

(0.747 – 0.59) = 0.157

我們可以為每個類別繪製一張貢獻圖。下面我們給出了針對幼體類別的貢獻圖。

如何解讀決策樹和隨機森林的內部工作機制?

圖 11:使用 violin 圖對一個幼體觀察繪製的貢獻圖(多類決策樹)

和之前一樣,我們也可以為每一類繪製貢獻與特徵的圖表。殼重對鮑魚是雌性的貢獻會隨殼重的增長而增長,而對鮑魚是幼體的貢獻則會隨殼重的增長而降低。對於雄性來說,殼重的貢獻首先會增長,在殼重超過了 0.5 之後貢獻又會下降。

如何解讀決策樹和隨機森林的內部工作機制?

圖 12:每個類別的貢獻與殼重(隨機森林)

結語

在這篇文章中,我們表明可以通過查看路徑來獲得對決策樹和隨機森林的更加深入的理解。這對隨機森林尤其有用,因為隨機森林是一種非常並行的而且通常性能很高的機器學習模型。為了滿足 Pivotal 客戶的業務需求,我們不僅需要提供有很高預測能力的模型,也要提供可解釋的模型。也就是說,不管效果如何,我們都不想給他們一個黑箱。當與政府和金融領域的客戶做生意時,這就是一個很重要的要求,因為我們的模型需要通過合規性檢查。

附 violin 圖基礎

violin 圖是繪製數字數據的方法,它和箱線圖十分相似,但其另外展示了分佈的概率密度。下面我們先了解箱線圖:

如何解讀決策樹和隨機森林的內部工作機制?

上圖這一組數據表明:

  • 最小值等於 5

  • 最大值等於 10

  • 平均值為 8

  • 下四分位數為 7,即第一四分位數(Q1),等於該樣本中所有數值由小到大排列後第 25% 的值。

  • 中位數為 8.5,即第二四分位數(Q2),等於該樣本中所有數值由小到大排列後第 50% 的值。

  • 上四分位數為 9,即第三四分位數(Q3),等於該樣本中所有數值由小到大排列後第 75% 的值。

  • 四分位距為 2(即ΔQ=Q3-Q1)。

上述是箱線圖的基本參數,箱線圖只顯示諸如平均值/中值和四分位數範圍的彙總統計數據,violin 圖顯示了數據的完整分佈。

如何解讀決策樹和隨機森林的內部工作機制?

violin 圖概括了箱線圖所表達的統計量:

  • 上圖白點代表中位數

  • 灰色的矩形代表 Q3 和 Q1 之間的四分位距

  • 灰線代表 95% 的置信區間

兩邊的灰色曲線代表核密度估計,其展示了數據的分佈形狀。其中兩邊間距較寬的曲線段代表樣本總體取給定值有較高的概率,較窄的曲線段表明取給定值有較小的概率。

End.


分享到:


相關文章: