成長中的決策樹

如同所有監督式機器學習模型,決策樹也經過訓練,以便以最佳方式解釋一組訓練樣本。決策樹的最佳訓練是 NP 困難的問題因此,訓練通常是利用經驗法則來完成,這是一個易於建立的學習演算法,可提供無法達到最佳效果,但非常接近最佳決策樹。

大多數用來訓練決策樹的演算法,都與貪婪分離和征服策略搭配運作。演算法會先建立一個節點 (根節點),然後遞迴地增加決策樹狀圖。

系統會針對每個節點評估所有可能的條件並評分,演算法會選取「最佳」條件,也就是分數最高的條件。目前,只要知道分數是與任務相關的指標,並且已選取條件,以最大化該指標。

舉例來說,在Palmer Penguins 資料集 (本課程稍後會用到的程式碼範例) 中,大多數 Adelie 和 Chinstrap 企鵝的帳單長度都超過 16 公釐,而大多數 Gentoo Penguins 的帳單金額較低。因此,bill_length_mm ≥ 16 的結果幾乎是 Genoo 企鵝的完美預測,但無法區分 Adelies 和 Chinstraps。演算法可能會選擇這個條件。

會導致兩個葉子的條件。條件為「bill_length_mm >= 16」。
如果是,節能綠葉就是「Adelie 或 Chinstrap」。如果沒有,葉子就會是「Gentoo」

圖 7. 種植樹木的第一步。

 

接著,演算法會在兩個子項節點上以遞迴方式重複相同內容。如果找不到滿足條件,節點就會變成分葉。分葉預測會決定範例中最具代表性的標籤值。

演算法如下所示:

def train_decision_tree(training_examples):
  root = create_root() # Create a decision tree with a single empty root.
  grow_tree(root, training_examples) # Grow the root node.
  return root

def grow_tree(node, examples):
  condition = find_best_condition(examples) # Find the best condition.

  if condition is None:
    # No satisfying conditions were found, therefore the grow of the branch stops.
    set_leaf_prediction(node, examples)
    return

  # Create two childrens for the node.
  positive_child, negative_child = split_node(node, condition)

  # List the training examples used by each children.
  negative_examples = [example for example in examples if not condition(example)]
  positive_examples = [example for example in examples if condition(example)]

  # Continue the growth of the children.
  grow_tree(negative_child, negative_examples)
  grow_tree(positive_child, positive_examples)

以下將詳細說明訓練特定決策樹的步驟。

步驟 1:建立根:

含有問號的節點。

步驟 2:擴充節點 1。已找到條件「x1 ≥ 1」。 系統會建立兩個子節點:

根節點導向兩個未定義的節點。

步驟 3:擴充節點 2。找不到滿足條件。因此,請將節點設為分葉:

根節點導向兩個未定義的節點。

步驟 4:擴充節點 #3。發現「x2 ≥ 0.5」條件。系統會建立兩個子節點。

一個根節點、一個條件和三個葉子

還有一些方法來發展決策樹。常見的替代方法是將全球的節點最佳化,而非使用除錯策略。

YDF 代碼
在 YDF 中,決策樹會由上述預設「貪婪分割與征服」演算法增長。或者,您也可以使用 growing_strategy="BEST_FIRST_GLOBAL" 參數啟用全球成長。詳情請參閱 說明文件

視輸入特徵的數量和類型而定,特定節點的可能條件數量可能相當龐大,通常無限無所不包。舉例來說,假設某個門檻條件 $\mathrm{feature}_i \geq t$,即為 $t \in \mathbb{R}$ 的所有可能門檻值組合是無限。

負責找出最佳條件的處理常式稱為「分割器」。由於需要測試許多可能的條件,因此分割器是訓練決策樹時發生的瓶頸。

分割器最大化分數取決於工作。舉例來說:

  • 資訊增加Gini (稍後涵蓋) 通常會用於分類。
  • 均方誤差常用於迴歸。

分割器演算法的種類繁多,每一種都支援不同的:

  • 特徵類型,例如數值、類別、文字
  • 任務,例如二元分類 多類別分類、迴歸
  • 條件類型,例如閾值條件、插邊條件、義務條件
  • 正則化條件,例如門檻條件的確切或近似分割器

此外,在記憶體用量、CPU 用量、運算分佈等方面,也有對等的分割器變體,各有優缺點。

YDF 代碼
在 YDF 中,系統會從系統自動偵測到 (或手動指定) 特徵的類型、超參數和每個分割器的預估速度 (在訓練期間執行小型模型來預測各個候選分割器的速度),以隱含方式選取分割器。