如何解讀決策樹(shù)和隨機(jī)森林的內(nèi)部工作機(jī)制?
隨機(jī)森林在過(guò)去幾年里得到了蓬勃的發(fā)展。它是一種非線(xiàn)性的基于樹(shù)的模型,往往可以得到準(zhǔn)確的結(jié)果。但是,隨機(jī)森林的工作過(guò)程大都處于黑箱狀態(tài),往往難以解讀和完全理解。近日,Pivotal Engineering Journal 網(wǎng)站發(fā)表了一篇文章,對(duì)隨機(jī)森林的基礎(chǔ)進(jìn)行了深度解讀。該文從隨機(jī)森林的構(gòu)造模塊決策樹(shù)談起,通過(guò)生動(dòng)的圖表對(duì)隨機(jī)森林的工作過(guò)程進(jìn)行了介紹,能夠幫助讀者對(duì)隨機(jī)森林的工作方式有更加透徹的認(rèn)識(shí)。本文內(nèi)容基于 Ando Saabas 的一個(gè) GitHub 項(xiàng)目。另外,你也能在 GitHub 上找到用于創(chuàng)建本文中各種圖表的代碼。
- Ando Saabas 的項(xiàng)目:https://github.com/andosa/treeinterpreter
- 創(chuàng)建圖表的代碼:https://github.com/gregtam/interpreting-decision-trees-and-random-forests
決策樹(shù)的工作方式
決策樹(shù)可以看成為一個(gè) if-then 規(guī)則的集合,即由決策樹(shù)的根節(jié)點(diǎn)到葉節(jié)點(diǎn)的每一條路徑構(gòu)建一條規(guī)則,路徑上內(nèi)部節(jié)點(diǎn)的特征對(duì)應(yīng)著規(guī)則的條件,而葉節(jié)點(diǎn)的類(lèi)對(duì)應(yīng)于規(guī)則的結(jié)論。因此決策樹(shù)就可以看作由條件 if(內(nèi)部節(jié)點(diǎn))和滿(mǎn)足條件下對(duì)應(yīng)的規(guī)則 then(邊)組成。
決策樹(shù)的工作方式是以一種貪婪(greedy)的方式迭代式地將數(shù)據(jù)分成不同的子集。其中回歸樹(shù)(regression tree)的目的是最小化所有子集中的 MSE(均方誤差)或 MAE(平均絕對(duì)誤差);而分類(lèi)樹(shù)(classification tree)則是對(duì)數(shù)據(jù)進(jìn)行分割,以使得所得到的子集的熵或基尼不純度(Gini impurity)最小。
結(jié)果得到的分類(lèi)器可以將特征空間分成不同的子集。對(duì)某個(gè)觀察的預(yù)測(cè)將取決于該觀察所屬的子集。
圖 1:一個(gè)決策樹(shù)的迭代過(guò)程
決策樹(shù)的貢獻(xiàn)
以鮑魚(yú)數(shù)據(jù)集(https://archive.ics.uci.edu/ml/datasets/abalone)為例。我們將根據(jù)殼的重量、長(zhǎng)度、直徑等變量來(lái)預(yù)測(cè)鮑魚(yú)殼上環(huán)的數(shù)量。為了演示,我們構(gòu)建了一個(gè)很淺的決策樹(shù)。我們可以通過(guò)將樹(shù)的***層數(shù)限制為 3 而得到這個(gè)樹(shù)。
圖 2:預(yù)測(cè)不同環(huán)數(shù)的決策樹(shù)路徑
要預(yù)測(cè)鮑魚(yú)的環(huán)的數(shù)量,決策樹(shù)將沿著樹(shù)向下移動(dòng)直到到達(dá)一個(gè)葉節(jié)點(diǎn)。每一步都會(huì)將當(dāng)前的子集分成兩個(gè)。對(duì)于一次特定的分割,我們根據(jù)平均環(huán)數(shù)的改變來(lái)定義對(duì)該分割做出了貢獻(xiàn)的變量。
比如說(shuō),如果我們拿到一個(gè)殼重 0.02、長(zhǎng)度為 0.220 的鮑魚(yú),那么它就將落在最左邊的葉節(jié)點(diǎn)上,預(yù)測(cè)的環(huán)數(shù)是 4.4731。殼重對(duì)預(yù)測(cè)環(huán)數(shù)的貢獻(xiàn)為:
- (7.587 - 9.958) + (5.701 - 7.587) = -4.257
長(zhǎng)度的貢獻(xiàn)為:
- (4.473 - 5.701) = -1.228
這些貢獻(xiàn)都是負(fù)數(shù),說(shuō)明對(duì)于這個(gè)特定的鮑魚(yú),殼重和長(zhǎng)度值會(huì)使預(yù)測(cè)的環(huán)數(shù)下降。
我們可以通過(guò)運(yùn)行以下代碼得到這些貢獻(xiàn)。
- from treeinterpreter import treeinterpreter as ti dt_reg_pred, dt_reg_bias, dt_reg_contrib = ti.predict(dt_reg, X_test)
其中變量 dt_reg 是 sklearn 分類(lèi)器目標(biāo),X_test 是一個(gè) Pandas DataFrame 或 numpy 數(shù)組,包含了我們希望從中得到預(yù)測(cè)和貢獻(xiàn)的特征。其貢獻(xiàn)變量 dt_reg_contrib 是一個(gè)二維 numpy 數(shù)組 (n_obs, n_features),其中 n_obs 是觀察的數(shù)量,n_features 是特征的數(shù)量。
我們可以繪制一個(gè)給定鮑魚(yú)的這些貢獻(xiàn)的圖表,看看哪些特征對(duì)預(yù)測(cè)得到的值的影響***。我們可以從下面這幅圖表看到這個(gè)特定的鮑魚(yú)的重量和長(zhǎng)度值對(duì)預(yù)測(cè)得到的環(huán)數(shù)所產(chǎn)生的負(fù)影響。
圖 3:一個(gè)貢獻(xiàn)圖表示例(決策樹(shù))
我們可以使用小提琴圖表(Violin plot)將這個(gè)特定鮑魚(yú)的貢獻(xiàn)與所有鮑魚(yú)的情況進(jìn)行比較。這樣可以在這張圖表上疊加一個(gè)核密度估計(jì)。在下圖中,我們可以看到,與其它鮑魚(yú)相比,這個(gè)特定鮑魚(yú)的殼重異乎尋常地低。實(shí)際上,很多鮑魚(yú)的殼重值的貢獻(xiàn)都是正數(shù)。
圖 4:使用 violin 圖對(duì)一個(gè)觀察樣本繪制的貢獻(xiàn)圖(決策樹(shù)),文末將附上 violin 圖的基本概念與用法。
上面的圖雖然有些信息,但仍然無(wú)法讓我們完全理解一個(gè)特定變量對(duì)鮑魚(yú)所擁有的環(huán)數(shù)的影響。于是,我們可以根據(jù)一個(gè)給定特征的值繪制其貢獻(xiàn)。如果我們繪制殼重的值與其貢獻(xiàn)的比較,我們可以知道殼重的增長(zhǎng)會(huì)導(dǎo)致貢獻(xiàn)的增長(zhǎng)。
圖 5:貢獻(xiàn)與殼重(決策樹(shù))
另一方面,去殼后的重量與貢獻(xiàn)的關(guān)系是非線(xiàn)性非單調(diào)的。更低的去殼后的重量沒(méi)有任何貢獻(xiàn),更高的去殼后的重量有負(fù)貢獻(xiàn),而在兩者之間,貢獻(xiàn)是正的。
圖 6:貢獻(xiàn)與去殼后的重量(決策樹(shù))
擴(kuò)展成隨機(jī)森林
通過(guò)將許多決策樹(shù)組成森林并為一個(gè)變量取所有樹(shù)的平均貢獻(xiàn),這個(gè)確定特征的貢獻(xiàn)的過(guò)程可以自然地?cái)U(kuò)展成隨機(jī)森林。
圖 7:使用 violin 圖對(duì)一個(gè)觀察繪制的貢獻(xiàn)圖(隨機(jī)森林)
因?yàn)殡S機(jī)森林固有的隨機(jī)性,一個(gè)給定殼重值的貢獻(xiàn)會(huì)有所不同。但是如下圖平滑的黑色趨勢(shì)線(xiàn)所示,這種增長(zhǎng)的趨勢(shì)仍然存在。就像在決策樹(shù)上一樣,我們可以看到殼重增大時(shí),貢獻(xiàn)會(huì)更高。
圖 8:貢獻(xiàn)與殼重(隨機(jī)森林)
同樣,我們也可能會(huì)看到復(fù)雜的不單調(diào)的趨勢(shì)。直徑的貢獻(xiàn)似乎在大約 0.45 處有一處下降,而在大約 0.3 和 0.6 處各有一處峰值。除此之外,直徑和環(huán)數(shù)之間的關(guān)系基本上是增長(zhǎng)的。
圖 9:貢獻(xiàn)與直徑(隨機(jī)森林)
分類(lèi)
我們已經(jīng)看到回歸樹(shù)的特征分布源自環(huán)的平均值以及其在后續(xù)分割中的變化方式。我們可以通過(guò)檢查每個(gè)子集中某個(gè)特定類(lèi)別的觀察的比例,從而將其擴(kuò)展成二項(xiàng)分類(lèi)或多項(xiàng)分類(lèi)。一個(gè)特征的貢獻(xiàn)就是該特征所導(dǎo)致的總的比例變化。
通過(guò)案例解釋更容易理解。假設(shè)現(xiàn)在我們的目標(biāo)是預(yù)測(cè)性別,即鮑魚(yú)是雌性、雄性還是幼體。
圖 10:多項(xiàng)分類(lèi)的決策樹(shù)路徑
每個(gè)節(jié)點(diǎn)都有 3 個(gè)值——該子集中雌性、雄性和幼體各自的比例。一個(gè)臟器重量為 0.1 且殼重 0.1 的鮑魚(yú)屬于最左邊的葉節(jié)點(diǎn)(概率為 0.082、0.171 和 0.747)。適用于回歸樹(shù)的貢獻(xiàn)邏輯在這里也同樣適用。
如果這個(gè)特定鮑魚(yú)是幼體,那么臟器重量的貢獻(xiàn)為:
- (0.59 - 0.315) = 0.275
殼重的貢獻(xiàn)為:
- (0.747 - 0.59) = 0.157
我們可以為每個(gè)類(lèi)別繪制一張貢獻(xiàn)圖。下面我們給出了針對(duì)幼體類(lèi)別的貢獻(xiàn)圖。
圖 11:使用 violin 圖對(duì)一個(gè)幼體觀察繪制的貢獻(xiàn)圖(多類(lèi)決策樹(shù))
和之前一樣,我們也可以為每一類(lèi)繪制貢獻(xiàn)與特征的圖表。殼重對(duì)鮑魚(yú)是雌性的貢獻(xiàn)會(huì)隨殼重的增長(zhǎng)而增長(zhǎng),而對(duì)鮑魚(yú)是幼體的貢獻(xiàn)則會(huì)隨殼重的增長(zhǎng)而降低。對(duì)于雄性來(lái)說(shuō),殼重的貢獻(xiàn)首先會(huì)增長(zhǎng),在殼重超過(guò)了 0.5 之后貢獻(xiàn)又會(huì)下降。
圖 12:每個(gè)類(lèi)別的貢獻(xiàn)與殼重(隨機(jī)森林)
結(jié)語(yǔ)
在這篇文章中,我們表明可以通過(guò)查看路徑來(lái)獲得對(duì)決策樹(shù)和隨機(jī)森林的更加深入的理解。這對(duì)隨機(jī)森林尤其有用,因?yàn)殡S機(jī)森林是一種非常并行的而且通常性能很高的機(jī)器學(xué)習(xí)模型。為了滿(mǎn)足 Pivotal 客戶(hù)的業(yè)務(wù)需求,我們不僅需要提供有很高預(yù)測(cè)能力的模型,也要提供可解釋的模型。也就是說(shuō),不管效果如何,我們都不想給他們一個(gè)黑箱。當(dāng)與政府和金融領(lǐng)域的客戶(hù)做生意時(shí),這就是一個(gè)很重要的要求,因?yàn)槲覀兊哪P托枰ㄟ^(guò)合規(guī)性檢查。
附 violin 圖基礎(chǔ)
violin 圖是繪制數(shù)字?jǐn)?shù)據(jù)的方法,它和箱線(xiàn)圖十分相似,但其另外展示了分布的概率密度。下面我們先了解箱線(xiàn)圖:
上圖這一組數(shù)據(jù)表明:
- 最小值等于 5
- ***值等于 10
- 平均值為 8
- 下四分位數(shù)為 7,即***四分位數(shù)(Q1),等于該樣本中所有數(shù)值由小到大排列后第 25% 的值。
- 中位數(shù)為 8.5,即第二四分位數(shù)(Q2),等于該樣本中所有數(shù)值由小到大排列后第 50% 的值。
- 上四分位數(shù)為 9,即第三四分位數(shù)(Q3),等于該樣本中所有數(shù)值由小到大排列后第 75% 的值。
- 四分位距為 2(即ΔQ=Q3-Q1)。
上述是箱線(xiàn)圖的基本參數(shù),箱線(xiàn)圖只顯示諸如平均值/中值和四分位數(shù)范圍的匯總統(tǒng)計(jì)數(shù)據(jù),violin 圖顯示了數(shù)據(jù)的完整分布。
violin 圖概括了箱線(xiàn)圖所表達(dá)的統(tǒng)計(jì)量:
- 上圖白點(diǎn)代表中位數(shù)
- 灰色的矩形代表 Q3 和 Q1 之間的四分位距
- 灰線(xiàn)代表 95% 的置信區(qū)間
兩邊的灰色曲線(xiàn)代表核密度估計(jì),其展示了數(shù)據(jù)的分布形狀。其中兩邊間距較寬的曲線(xiàn)段代表樣本總體取給定值有較高的概率,較窄的曲線(xiàn)段表明取給定值有較小的概率。
原文:http://engineering.pivotal.io/post/interpreting-decision-trees-and-random-forests/
【本文是51CTO專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】