全面!手把手教你決策樹可視化(附連結&代碼)

thu數據派 發佈 2020-01-23T11:42:33+00:00

並且我們將在馬上出版的機器學習書籍《TheMechanics of Machine Learning》中大量使用該包。

作者: Terence Parr, Prince Grover

翻譯:王雨桐

校對:詹好

本文長度約為9500字,建議閱讀10+分鐘

本文分析了決策樹可視化中的關鍵因素,比較了現有的可視化工具。並通過大量的示例介紹了一個決策樹可視化工具的設計和實現過程。

目錄

  • 決策樹概述
  • 決策樹可視化的關鍵因素
  • 效果展示
  • 與現有可視化的比較
  • 我們的決策樹可視化
  • 可視化特徵-目標空間
  • 細節部分
  • 用可視化樹來解釋單次觀測
  • 橫向決策樹
  • 簡化結構
  • 前車之鑑
  • 代碼示例
  • 回歸樹可視化----以波士頓房價為例
  • 分類樹可視化---以紅酒為例
  • 實踐經驗
  • Scikit決策樹的影子樹
  • 工具箱
  • SVG生成的矢量圖
  • 經驗總結
  • 未來工作

在適用於結構化數據的機器學習模型中,梯度提升和隨機森林可以稱得上是明星級模型,而決策樹則是這兩者的基石。決策樹的可視化工作對於了解這些模型的工作原理有極大的幫助。然而目前的可視化軟體工具很基礎,對新手並不友好。例如,我們無法利用現有的庫展示每個節點是如何劃分變量的。此外,當把一個新樣本放到決策樹中進行預測時,我們只能生成一張可供展示的結果圖片,而很難運用現有工具將整個過程可視化。

因此我們創建了一個通用包來在scikit-learn上可視化決策樹模型以及解釋模型。並且我們將在馬上出版的機器學習書籍《The Mechanics of Machine Learning》(由JeremyHoward編寫)中大量使用該包。以下是一個簡單的決策樹可視化示例:

附書連結:

https://mlbook.explained.ai/

本文演示了這項工作的成果,詳細介紹了我們為此所做的嘗試,並概述了該工具的在使用過程中的基本框架和技術細節。該可視化軟體是dtreeviz的一部分,它是一個新興的Python機器學習庫。本文不會過多闡述決策樹的基本原理,但為了方便您熟悉相關的術語使用,我們會對此做一個簡短的概述。

決策樹概述

決策樹是一種基於二叉樹(最多有左右兩個子樹)的機器學習模型。決策樹遍歷訓練數據並將信息濃縮為二叉樹的內部節點和葉節點,從而學習訓練集中的觀測值之間的關係,這些觀測值表示為特徵向量x和目標值y。(註:向量為粗體,標量為斜體。)

決策樹中的每個葉子都表示特定的預測結果。回歸樹中輸出的預測是一個(連續的)值,例如價格;而分類樹中輸出的預測是(離散的)目標類別(在scikit中表示為整數),例如是否患有癌症。決策樹將觀測分為具有相似目標值的組,每個葉子代表其中一個分組。對於回歸而言,葉節點中觀測的相似性意味著目標值之間的差異很小;而對於分類而言,則意味著大多數或所有觀測屬於同一類別。

任何一個從樹根到葉節點的路徑都要經過一系列(內部)決策節點。在訓練過程中選出特定的分割點後,每個決策節點將x中的單個要素的值(xi)與分割點值進行比較。例如,在預測房租的模型中,決策節點會比較特徵,如臥室數量和浴室數量等。(請參閱第3章,新樣本預測的可視化效果。)即使在具有目標值離散的分類模型中,決策節點仍會比較數值特徵值,這是因為在scitkit中,假定決策樹模型的所有特徵都是數值類型,因此分類變量必須要經過獨熱編碼、合併、標籤編碼等處理。

為了得到決策節點,模型將遍歷訓練集的子集(或根節點的完整訓練集)。在訓練過程中,根據相似性最大化的原則,決策樹將根據選擇節點的特徵和該特徵空間內的分割點,將觀察結果放入左右兩個桶中(子集)。(該選擇過程通常要對特徵和特徵值進行詳盡的比較)左子集中樣本的xi特徵值均小於分割點,而右子集中樣本的xi均大於分割點。通過為左分支和右分支創建決策節點,遞歸地進行樹的構造。當達到某個停止標準(例如,節點中包含的觀測數少於5)時,決策樹終止生長。

決策樹可視化的關鍵因素

決策樹可視化應該突出以下重要元素,我們將在下文中具體闡述。

  • 決策節點的特徵vs目標值分布(在本文中稱為特徵-目標空間)。我們想知道能否基於特徵和分割點將觀測進行分類。
  • 決策節點的特徵和特徵分割點。我們需要知道每個決策節點所選擇的待考察的特徵變量,以及將觀測分類的標準。
  • 葉節點純度,這會影響我們的預測置信度。較高的純度也就意味著那些在回歸問題中較低方差的葉節點,以及分類問題中包含絕大多數目標的葉節點,它們都意味著更可靠的預測效果。
  • 葉節點預測值。基於訓練集的目標值,該葉節點具體的預測結果。
  • 決策節點中的樣本數。我們需要了解決策節點上大部分樣本的歸屬。
  • 葉節點中的樣本數。我們的目標是讓決策樹的葉節點更少,數目更大和純度更高。如果樣本的節點下的樣本數太少,則可能由過擬合現象。
  • 新樣本如何從根節點開始被分到特定的葉節點。這有助於解釋為什麼新樣本得到了相應的預測。例如,在預測公寓租金價格的回歸樹中,由於決策節點檢查了臥室的數量,而新樣本的臥室數量大於3,因此預測價格偏高。

效果展示

在深入研究現有的可視化工具之前,想先介紹一下我們生成的效果圖。本節重點介紹一些可視化的案例,這些是我們利用一些數據集構造的scikit回歸和分類決策樹。你還可以利用完整的庫和代碼復現所有案例。

附代碼連結:

https://github.com/parrt/dtreeviz/blob/master/testing/gen_samples.py

與現有可視化工具的比較

如果搜索「可視化決策樹」,很快便能找到由scikit提供的基於Python語言的解決方案:sklearn.tree.export_graphviz。此外還可以找到R甚至SAS和IBM的可視化工具。在本節中,我們收集了現有的各種決策樹可視化效果,並將它們與我們使用dtreeviz庫製作的決策樹進行了比較。在下一部分中,我們將對可視化進行更詳細的討論。

讓我們使用默認設置下的scitkit可視化工具,在大家都很熟悉的的Iris數據集上繪製一個可視化的決策樹。

scikit樹很好地表現了樹的結構,但我們仍然發現了一些問題。首先顏色的運用不夠直觀,比如在為什麼有些節點是彩色的而有些不是這一問題上:如果顏色代表該分類器的預測類別,那麼我們可能會認為只有葉子才是彩色的,因為只有葉子才有預測。事實證明,沒有顏色的節點預測能力較弱。

除此之外,基尼係數(確定性得分)會占用圖中的空間,並且不利於解釋。在每個節點中體現各目標類別的樣本數很有用,但直方圖可以提供更多信息。此外,利用有顏色的目標類別圖例會很好。最後,將true和false用作邊緣標籤並不夠清晰,³和<看起來更清晰。最顯著的區別是我們的決策節點利用堆疊直方圖展示特徵分布,每個目標類別都會用不同的顏色顯示。同樣,我們的葉子大小與該葉子中的樣本數成正比。

再來考察一個回歸的案例。下圖是在波士頓數據集的上使用scikit的可視化效果,我們將它與dtreeviz的版本進行比較。

同樣,在scikit樹中,我們不能直觀地理解顏色的用途,但是在進一步研究後,我們發現顏色較深的圖像表示較高的預測目標值。如前文所述,在我們的解決方案中,決策節點下能夠顯示特徵空間分布,比如該案例就使用了特徵-目標值散點圖,在葉節點總使用帶狀圖顯示目標值分布,其中點更密集的葉節點意味著該葉節點下有更多的樣本。

同樣,我們來考察以下R語言下的可視化決策樹的軟體包,該軟體包的結果與scikit類似,但邊緣標籤的效果更好:

SAS和IBM同樣提供(均不支持Python語言)決策樹可視化。我們發現SAS的決策節點包括與該節點的樣本目標值和其他詳細信息有關的條形圖:

在這一案例中有一個很好的idea,就是通過邊緣寬度來體現子樹中的樣本量。但是由於缺少水平軸,這些條形圖的解釋性並不如意。測試類別變量的決策節點(上圖)每個類別僅具有一個條形,因此它們只能表示簡單的類別計數,而不是特徵分布。對於數字特徵(下圖),SAS決策節點顯示目標值或特徵值的直方圖(我們無法從圖像中分辨出)。SAS節點條形圖/直方圖似乎只是在說明目標值,這並沒有告訴我們有關特徵分割的信息。

下側的SAS樹似乎突出顯示了新樣本的預測過程,但我們無法從其他工具和庫中找到任何其他示例,這樣的功能似乎並不常見。

再來考察IBM軟體的情況。它在泰坦尼克數據集中表現出了非常不錯的可視化效果,甚至結合IBM的Watson分析以條形圖的形式顯示了決策節點類別的計數:

再來看看IBM較早的SPSS產品中對決策樹可視化效果:

可見,在SPSS中,這些決策節點提供了與樣本目標類別計數相同的SAS條形圖。

以上所提及的所有可視化都提供了不錯的結果,但是給予我們啟發性最大的是來自《機器學習的可視化簡介》中的案例。它給我們展示了一個以動畫形式展示的決策樹可視化案例,如下所示:

附連結:

r2d3.us/visual-intro-to-machine-learning-part-1/(譯者註:很經典的可視化,建議看原網站動態圖)

除了動畫的要素之外,該可視化還具有此前提到的三個獨特特徵:

  • 決策節點顯示特徵空間如何分割
  • 決策節點的分割點在分布中直觀顯示(就是那個三角形的指示符號)
  • 葉節點的大小與該葉中的樣本數成正比

儘管該案例是出於教學目的而開發的基於hardcoded技術的可視化動圖,但它給我們指明了正確的方向。

我們的決策樹可視化

除了《機器學習的可視化簡介》中的動畫外,我們找不到另一個能夠更好說明如何在決策節點(特徵目標空間)處分割特徵值的案例了。而這一點恰恰是在決策樹模型訓練期間進行操作的關鍵點,也是新手應該關注的點,因此我們借鑑這一方案,從檢查分類樹和回歸樹的決策節點開始我們的可視化工作。

  • 可視化特徵-目標空間

同行,我們通過訓練數據學習到決策節點選擇特徵xi並在xi的值域(特徵空間)進行分割,將具有相似目標值的樣本分到兩個子樹中的一個中。準確地說,訓練過程中需要檢查特徵和目標值之間的關係。因此,除非我們的可視化工作在決策節點上顯示了特徵-目標空間,否則讀者很難根據可視化圖像來直觀理解得到預測結果的整個過程和原因。為了突出現實決策節點是如何分割特徵空間的,我們以單特徵(AGE)的回歸樹和分類樹作為展示。這個案例使用波士頓房價數據中的單個特徵(age)來訓練回歸決策樹。為了便於討論,在下圖中加入了節點id:

附生成效果圖的代碼:

https://github.com/parrt/dtreeviz/blob/master/testing/paper_examples.py

水平虛線表示決策節點中左子樹和右子樹的目標均值;垂直虛線表示特徵空間中的分割點。下方的黑色三角形突出顯示分割點並標出了確切的分割值。葉節點用虛線指示目標預測(這裡使用的是平均值)。

如圖所示,為了便於決策節點的比較,AGE特徵軸都控制在了一個相同的值域上,而並沒有將數值集中的區域進行方法。因此,決策節附近的樣本的AGE值被限制在了一個狹窄的區域中。

例如,將節點0中的特徵空間進一步被劃分為了為節點1和8的特徵空間;節點1的特徵空間又進一步劃分為節點2和5中所示的特徵空間。當然,可以看到,這一決策樹模型的預測效果並不是很好,這是因為出於展示的方便,我們僅僅單一的變量來訓練模型,但是這個簡單的案例給我們演示了如何可視化決策樹劃分特徵空間的過程。

儘管分類決策樹和回歸決策樹的在實現方式大致上相同,但對它們進行解釋方式卻大不相同,因此這兩種情況的可視化效果是不同的。對於回歸模型,最好使用特徵與目標的散點圖來顯示特徵-目標空間。但是,對於分類模型,目標是離散的類別而不是連續的數字,因此我們選擇使用直方圖來可視化特徵目標空間。下圖是在USER KNOWLEDGE數據上訓練的分類樹,同樣我們只使用了單個特徵(PEG)來進行訓練,並且同樣標記了節點id:

在這一案例中,直方圖顯示了PEG特徵空間分布,而顏色則體現了特徵與目標類別之間的關係。例如,在節點0中,我們可以看到具有very_low目標類別的樣本聚集在PEG特徵空間的左端,而具有high目標類別的樣本聚集在右端。與回歸樹一樣,左子樹的特徵空間和父節點上直方圖分割點左側的特徵空間相同;右子樹也同理。

例如,將節點9和12的直方圖組合起來,可以得出節點8的直方圖。我們將PEG決策節點的水平軸限制在相同範圍,因此位於下方的直方圖中的範圍更窄,這也意味著分類更純凈。

為了更清楚地顯示不同類別的特徵空間,我們使用了堆疊直方圖。值得注意的是,堆疊直方圖在Y軸上的高度是所有類別的樣本總數。多個類別的計數相互疊加。

當類別多於四或五個時,堆積直方圖可讀性很低,因此我們建議在這種情況下將直方圖類型參數設置為不堆積的直方圖。在基數較高的目標類別下,重疊的分布更難以可視化,並且出現問題,因此我們設置了10個目標類別的限制。使用10類Digits數據集(使用非堆疊直方圖)所構成的一個比較淺的決策樹的示例如下:

  • 細節部分

在前面的論述中,我們省略了一些最值得關注的可視化細節,在這裡我們來對其中的一些關鍵要素展開分析。

在對於分類樹可視化中,我們使用了節點大小來指示每個節點包含的樣本數量。隨著節點中樣本數量的減少和葉節點直徑的變小,直方圖將按比例變短。

對於給定的特徵,特徵空間(水平軸)始終具有相同的寬度和相同的範圍,這更有利於比較不同節點的特徵目標空間。所有直方圖的條具有相同的寬度(以像素為單位)。為了避免混亂,我們僅在水平和垂直軸上標示了最小值和最大值。

儘管在決策樹的可視化過程中一般不適用餅狀圖來進行呈現,但我們還是選擇了使用它來體現葉節點的分類。我們通過觀察圖中是否有明顯占主導的顏色,就可以評判分類結果的純度。餅圖最大的缺陷是無法體現元素間具體的關係。我們僅僅能從其中主導的顏色決定該節點的預測結果。

對於回歸樹而言,為了便於比較節點,我們將所有決策節點的目標(垂直)軸限制在相同的高度和相同的範圍。對於給定的特徵,回歸要素空間(水平軸)始終是相同的寬度和範圍。將所有散點圖的透明度設置為較低水平,因此較高的目標值密度對應較深的顏色。

回歸葉節點在垂直方向上顯示相同範圍的目標空間。相比於箱狀圖,我們選擇了帶狀圖,因為帶狀圖能更好地表示分布,並隱含地以點數表示樣本數。(我們還用文字標示了葉子節點的樣本數。)關於葉節點的預測值,我們選擇了帶狀圖的質量(均值)分布中心,同時,我們使用了虛線來將其突出顯示。

除此之外,還有許多其他細節可以提高可視化圖表的效果:

  1. 包含分類類別的圖例。
  2. 所有顏色均從一個對於色盲而言相對友好的調色板中進行挑選,每個2至10個目標類別綁定一個調色板。
  3. 我們在文本上使用灰色而不是黑色,這更有利於人眼審視。
  4. 圖中的線採用細線。
  5. 我們在帶狀圖和餅狀圖中突出了其輪廓。
  • 新樣本預測的可視化效果

通過了解拆分決策節點的特徵空間的過程,我們能直觀地看到決策樹是如何得到具體的預測結果的。現在讓我們看一下如何將預測新樣本的過程可視化。此處的關鍵是可視化從根到葉節點的路上所做出的決策。

節點內的決策很簡單:如果測試向量x中的特徵xi小於分割點,則歸類到左子樹,否則歸為右子樹。為了突出決策過程,我們必須重點強調比較操作。對於沿葉子預測變量節點路徑的決策節點,我們在水平特徵空間中的位置xi處顯示了橙色三角形。

如果橙色三角形位於黑色三角形的左側,則沿左路徑,否則沿右路徑。預測過程中涉及的決策節點被帶有虛線框的框包圍,邊緣較粗且呈橙色。以下為兩個測試向量的示例樹:

帶有特徵名稱和值的測試向量x出現在葉子預測變量節點的下方(或橫向決策樹的右端)。測試向量突出顯示了一個或多個決策節點中使用的特徵。當特徵數量達到閾值20(左右方向為10)時,測試向量不會顯示未使用的特徵,以避免不必要的測試向量。

  • 橫向決策樹

相比於縱向決策樹,一些用戶偏愛橫向圖像,有時樹的性質從左到右體現得更好。在預測過程中,樣本特徵向量也可以從左向右延伸。以下是一些示例:

  • 簡化結構

從更宏觀的角度評估決策樹,我們可以看到對分類過程的概述。這意味著比較樹的形狀和大小之類等,但更重要的是查看葉節點。我們想知道每個葉節點有多少個樣本,分類的純度如何,以及大多數樣本落在哪裡。

當可視化文件太大時,很難獲得概述,因此我們提供了一個「non-fancy」選項。該選項可以生成較小的可視化文件,同時保留關鍵的葉子信息。以下案例是分別為non-fancy模式的回歸樹和分類樹:

前車之鑑

從設計的角度對這些樹可視化感興趣的人可能會發現閱讀我們嘗試過並拒絕的內容很有意思。在設計分類樹時,相比於塊狀的直方圖,我們預計核密度估計會給出更準確的圖像。我們完成了如下的案例:

問題在於只有一個或兩個樣本的決策節點中,所得到的這種分布極具誤導性:

我們還嘗試使用氣泡圖代替直方圖作為分類器決策節點:

這些可視化圖形看起來確實很酷,但比較下來,還是直方圖更易於閱讀。

關於回歸樹,我們考慮使用箱形圖顯示預測值的分布,還考慮使用簡單的條形圖顯示樣本數量:

與現在使用的條形圖相比,每片葉子的雙圖都不令人滿意。箱形圖無法像條形圖那樣顯示目標值的分布。在帶狀圖之前,我們只是使用樣本索引值作為水平軸來體現目標值:

這是一種誤導,因為水平軸通常是特徵空間。我們將其壓縮為帶狀圖。

代碼示例

本節提供了波士頓回歸數據集和紅酒分類數據集的可視化示例。您還可以查看示例可視化的完整庫以及生成示例的代碼。

  • 回歸樹可視化----以波士頓房價為例

以下是一個代碼示例,用於加載Boston數據並訓練最大深度為3的回歸樹:

boston= load_boston()X_train= boston.datay_train= boston.targettestX= X_train[5,:]regr= tree.DecisionTreeRegressor(max_depth=3)regr= regr.fit(X_train, y_train)

可視化樹的代碼包括樹模型,訓練數據,特徵和目標名以及新樣本(如果必要的話):

viz = dtreeviz(regr, X_train, y_train,target_name='price',              feature_names=boston.feature_names,               X =testX)viz.save("boston.svg") # suffix determines thegenerated image formatviz.view()             # pop up window to display image
  • 分類樹可視化---以紅酒為例

這是一個代碼案例,用於加載Wine數據並訓練最大深度為3的分類樹:

clf= tree.DecisionTreeClassifier(max_depth=3)wine= load_wine()clf.fit(wine.data,wine.target)

分類模型可視化與回歸模型相同,但需要目標類名稱:

viz= dtreeviz(clf, wine.data, wine.target, target_name='wine', feature_names=wine.feature_names, class_names=list(wine.target_names))viz.view()

在Jupyter notebooks中,從dtreeviz()返回的對象具有_repr_svg_()函數,Jupyter使用該函數自動顯示該對象。請參閱示例筆記本。

附連結:

https://github.com/parrt/dtreeviz/blob/master/notebooks/examples.ipynb

  • JUPYTER NOTEBOOK中的小問題

截至2018年9月,Jupyter notebooks無法正常顯示此庫生成的SVG,字體等會變得混亂:

好消息是github和JupyterLab可以正確地顯示圖像。

在Juypter notebooks中使用Image(viz.topng())的視覺效果較差;如果直接調用viz.view(),會彈出一個窗口,其中會恰當地顯示結果。

實踐經驗

我們在這個項目中遇到了很多問題,編程錯誤、參數設置、解決bug和各種庫的錯誤/限制以及如何更好地融合現有工具。唯一有趣的部分是可視化設計的無數次嘗試。期待這個可視化會對機器學習社區有很大的幫助,這也是我們堅持不懈完成項目的動力。結合stackoverflow,文檔和繁瑣的圖形編程,我們大概花了兩個月的時間完成了這個項目。

最終我們使用matplotlib生成決策和葉節點的圖像,並使用傳統的graphviz將它們組合成樹。我們還在graphviz樹的描述中廣泛使用了HTML標籤,以用於布局和字體規範。但我們遇到的最大麻煩是將所有組件組合成高質量的矢量圖形。

我們先創建了一個影子樹,它包括了scikit創建的決策樹,讓我們開始吧。

  • Scikit決策樹的影子樹

scikit-learn的分類樹和回歸決策樹是為提高效率而構建的,樹的延伸或提取節點信息並不是重點。我們創建了dtreeviz.shadow.ShadowDecTree和dtreeviz.shadow.ShadowDecTreeNode類,以便於使用所有樹信息(傳統的二叉樹)。以下是通過scikit分類樹或回歸樹模型創建影子樹的方法:

shadow_tree = ShadowDecTree(tree_model,X_train, y_train, feature_names, class_names)

影子樹/節點類具有許多方法,這些方法還可以用於需要遍歷scikit決策樹的其他庫。例如,predict()不僅可以運用樹來預測新樣本,而且還返回被訪問節點的路徑。可以通過node_samples()獲得與任意特定節點關聯的樣本。

工具箱

如果能掌握所有技巧,Graphviz和dot語言有助於設計合理的樹型布局,例如當子樹重疊時,如何隱藏圖象重疊的邊緣。如果要在同一水平上顯示兩個葉節點leaf4和leaf5,我們可以用到graphviz如下:

LSTAT3-> leaf4 [penwidth=0.3 color="#444443" label=<>]LSTAT3-> leaf5 [penwidth=0.3 color="#444443" label=<>]{rank=same;leaf4-> leaf5 [style=invis]}

我們通常在graphviz節點上使用HTML標籤,而不僅僅是文本標籤,因為它們能更好地控制文本顯示,並將表格數據顯示為實際表格。例如,當顯示沿著樹的測試向量時,使用HTML表顯示測試向量:

為了從graphviz文件生成圖像,我們使用graphvizpython軟體包,該軟體包最終是用程序例程之一(run())執行dot二進位可執行文件。有時,我們在dot命令上使用了略有不同的參數,因此我們可以更像這樣更靈活地直接調用run():

cmd= ["dot", "-Tpng", "-o", filename, dotfilename]stdout,stderr = run(cmd, capture_output=True, check=True, quiet=False)

我們還將使用run()函數來執行pdf2svg(PDF轉SVG)工具,如下一節所述。

  • SVG生成的矢量圖

我們使用matplotlib生成決策和葉子節點,隨後生成graphviz /dot圖像和HTMLgraphviz標籤,最終通過img標籤引用生成的圖像,如下所示:

<imgsrc="/tmp/node3_94806.svg"/>

94806數字是進程ID,它有利於獨立運行同一台計算機的多個dtreeviz實例。否則,多個進程可能會覆蓋相同的臨時文件。

因為需要可縮放的矢量圖形,我們先嘗試著導入SVG圖像,但無法通過graphviz插入這些文件(兩者都不是pdf)。隨後我們花了四個小時才發現生成和導入SVG是兩件事,需要在OS X上使用--with-librsvg進行如下操作:

$brew install graphviz --with-librsvg --with-app --with-pango

最初,當我們想從matplotlib生成PNG文件時,我們將每英寸的點數(dpi)設置為450,這樣它們在iMac這樣高解析度螢幕上能有不錯的效果。不幸的是,這意味著我們必須使用<td>標籤的width和height參數和graphviz中的HTML表來設定整個樹的大小。這會帶來很多問題,因為我們必須了解matplotlib得到的寬高比。使用SVG文件後,我們不必再了解SVG 文件在HTML中的具體大小;在撰寫此文檔時,我們意識到沒有必要了解SVG文件的具體尺寸。

然而graphviz的SVG結果僅引用了我們導入的節點文件,而沒有將節點圖像嵌入到整個樹形圖像中。這是一種很不方便的形式,因為當發送可視化樹時,我們要發送文件的zip而不是單個文件。我們花了一些時間解析SVG XML,並將所有引用的圖像嵌入到單個大型meta-SVG文件中。有最終,得到了很好的效果。

然後我們注意到在生成SVG時,graphviz不能正確處理HTML標籤中的文本。例如,分類樹圖例的文本會被切除並重疊。

為了獲得獨立SVG文件的工作,我們首先從graphviz生成PDF文件,然後使用pdf2svg將PDF轉換為SVG(pdf2cairo也似乎起作用)。

我們注意到Jupyter notebook存在一個問題,它無法正確顯示這些SVG文件(請參見上文)。Jupyterlab確實可以像github一樣正確處理SVG。我們添加了一個topng()方法,這樣Jupyter Notebook的用戶就能使用Image(viz.topng())來獲取嵌入式圖像。還有一個跟好的方法,調用viz.view()將彈出一個窗口,也可以正確顯示圖像。

經驗總結

有時解決編程問題與算法無關,而與程式語言的限制和功能有關,例如構建一個工具和庫。決策樹可視化軟體也是這種類似的情況。編程並不難,我們是通過搭配適當的圖形工具和庫來得到最終的結果。

設計實際的可視化效果還需要進行無數次的實驗和調整。生成高質量的矢量圖還需要不斷試錯,對結果進行完善。

我們算不上可視化的狂熱者,但是對於這個特定的問題,我們一直堅持了下來,才收穫了理想的效果。在愛德華·塔夫特(Edward Tufte)的研討會上,我了解到,只要不是隨意的瞎搭配,我們就可以在人眼可以處理的限度下使用豐富的圖表呈現大量的信息。

在這個項目中,我們使用了設計面板中的許多元素:顏色,線條粗細,線條樣式,各種圖,大小(區域,長度,圖形高度,...),顏色透明度(alpha),文本樣式(顏色,字體,粗體,斜體,大小),圖形注釋和視覺流程。所有視覺元素都發揮了相應的作用。例如,我們不能僅因為某一個顏色漂亮就使用它,而是要考慮到如何使用這個顏色來突出顯示重要的維度(目標類別),因為人類能輕鬆且快速地發現顏色差異。節點大小的差異也應該很容易被人眼捕捉到,所以我們用節點的大小來表示葉子節點數據量的大小。

未來工作

本文檔中描述的可視化內容是dtreeviz機器學習庫的一部分,該庫還處於起步階段。我很快會將rfpimp庫移至dtreeviz。到目前為止,我們只在OS X上測試過該工具。我們期待其他平台上的程式設計師提供更多執導,以便包括更豐富的安裝步驟。

我們還在考慮幾個細節的調整,例如使直方圖和分類樹底部對齊,會更利於比較節點。另外,某些三角形標籤與軸標籤重疊。最後,如果邊緣寬度和子樹中的樣本量成比例就更好了(如SAS)。

原文標題:

How to visualize decision trees

原文連結:

https://explained.ai/decision-tree-viz/index.html

編輯:黃繼彥

校對:林亦霖

譯者簡介

王雨桐,UIUC統計學在讀碩士,本科統計專業,目前專注於Coding技能的提升。理論到應用的轉換中,敬畏數據,持續進化。

—完—

關注清華-青島數據科學研究院官方微信公眾平台「 THU數據派 」及姊妹號「 數據派THU 」獲取更多講座福利及優質內容。

關鍵字: