如同所有監督式機器學習模型,決策樹也經過訓練,以便以最佳方式解釋一組訓練樣本。決策樹的最佳訓練是 NP 困難的問題因此,訓練通常是利用經驗法則來完成,這是一個易於建立的學習演算法,可提供無法達到最佳效果,但非常接近最佳決策樹。
大多數用來訓練決策樹的演算法,都與貪婪分離和征服策略搭配運作。演算法會先建立一個節點 (根節點),然後遞迴地增加決策樹狀圖。
系統會針對每個節點評估所有可能的條件並評分,演算法會選取「最佳」條件,也就是分數最高的條件。目前,只要知道分數是與任務相關的指標,並且已選取條件,以最大化該指標。
舉例來說,在Palmer Penguins 資料集 (本課程稍後會用到的程式碼範例) 中,大多數 Adelie 和 Chinstrap 企鵝的帳單長度都超過 16 公釐,而大多數 Gentoo Penguins 的帳單金額較低。因此,bill_length_mm ≥ 16 的結果幾乎是 Genoo 企鵝的完美預測,但無法區分 Adelies 和 Chinstraps。演算法可能會選擇這個條件。
圖 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」條件。系統會建立兩個子節點。
還有一些方法來發展決策樹。常見的替代方法是將全球的節點最佳化,而非使用除錯策略。
growing_strategy="BEST_FIRST_GLOBAL"
參數啟用全球成長。詳情請參閱
說明文件。視輸入特徵的數量和類型而定,特定節點的可能條件數量可能相當龐大,通常無限無所不包。舉例來說,假設某個門檻條件 $\mathrm{feature}_i \geq t$,即為 $t \in \mathbb{R}$ 的所有可能門檻值組合是無限。
負責找出最佳條件的處理常式稱為「分割器」。由於需要測試許多可能的條件,因此分割器是訓練決策樹時發生的瓶頸。
分割器最大化分數取決於工作。舉例來說:
分割器演算法的種類繁多,每一種都支援不同的:
- 特徵類型,例如數值、類別、文字
- 任務,例如二元分類 多類別分類、迴歸
- 條件類型,例如閾值條件、插邊條件、義務條件
- 正則化條件,例如門檻條件的確切或近似分割器
此外,在記憶體用量、CPU 用量、運算分佈等方面,也有對等的分割器變體,各有優缺點。