Ex 4: Understanding the decision tree structure

http://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html#sphx-glr-auto-examples-tree-plot-unveil-tree-structure-py

範例目的

此範例主要在進一步探討決策樹內部的結構,分析以獲得特徵與目標之間的關係,並進而進行預測。 1. 當每個節點的分支最多只有兩個稱之為二元樹結構。 2. 判斷每個深度的節點是否為葉,在二元樹中若該節點為判斷的最後一層稱之為葉。 3. 利用 decision_path 獲得決策路徑的資訊。 4. 利用 apply 得到預測結果,也就是決策樹最後抵達的葉。 5. 建立完成後的規則變能用來預測。 6. 一組多個樣本可以尋得其中共同的決策路徑。

(一)引入函式庫及測試資料

引入函式資料庫

  • load_iris 引入鳶尾花資料庫。

from sklearn.model_selection import train_test_split 
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

建立訓練、測試集及決策樹分類器

  • X (特徵資料) 以及 y (目標資料)。

  • train_test_split(X, y, random_state) 將資料隨機分為測試集及訓練集。

    X為特徵資料集、y為目標資料集,random_state 隨機數生成器。

  • DecisionTreeClassifier(max_leaf_nodes, random_state) 建立決策樹分類器。

    max_leaf_nodes 節點為葉的最大數目,random_state 若存在則為隨機數生成器,若不存在則使用np.random

  • fit(X, y) 用做訓練,X為訓練用特徵資料,y為目標資料。

(二) 決策樹結構探討

DecisionTreeClassifier 中有個屬性 tree_,儲存了整個樹的結構。 二元樹被表示為多個平行的矩陣,每個矩陣的第i個元素儲存著關於節點"i"的信息,節點0代表樹的根。 需要注意的是,有些矩陣只適用於有分支的節點,在這種情況下,其他類型的節點的值是任意的。

上述所說的矩陣包含了: 1. node_count :總共的節點個數。 2. children_left:節點左邊的節點的ID,"-1"代表該節點底下已無分支。 3. children_righ:節點右邊的節點的ID,"-1"代表該節點底下已無分支。 4. feature:使節點產生分支的特徵,"-2"代表該節點底下已無分支。 5. threshold:節點的閥值。若距離不超過 threshold ,則邊的兩端就視作同一個群集。

以下為各矩陣的內容

二元樹的結構所通過的各個屬性是可以被計算的,例如每個節點的深度以及是否為樹的最底層。

  • node_depth :節點在決策樹中的深度(層)。

  • is_leaves :該節點是否為決策樹的最底層(葉)。

  • stack:存放尚未判斷是否達決策樹底層的節點資訊。

將stack的一組節點資訊pop出來,判斷該節點的左邊節點ID是否等於右邊節點ID。 若不相同分別將左右節點的資訊加入stack中,若相同則該節點已達底層is_leaves設為True。

執行過程

下面這個部分是以程式的方式印出決策樹結構,這個決策樹共有5個節點。 若遇到的是test node則用閥值決定該往哪個節點前進,直到走到葉為止。

執行結果

接下來要來探索每個樣本的決策路徑,利用decision_path方法可以讓我們得到這些資訊,apply存放所有sample最後抵達哪個葉。 以第0筆樣本當作範例,indices存放每個樣本經過的節點,indptr存放每個樣本存放節點的位置,node_index中存放了第0筆樣本所經過的節點ID。

執行結果

接下來是探討多個樣本,是否有經過相同的節點。 以樣本0、1當作範例,node_indicator.toarray()存放多個矩陣0代表沒有經過該節點,1代表經過該節點。common_nodes中存放true與false,若同一個節點相加的值等於輸入樣本的各樹,則代表該節點都有被經過。

執行結果

(三)完整程式碼

Last updated