建立決策樹

在這個單元中,您需要使用 YDF (Yggdrasil) Decision Forest) 圖書館訓練並解讀決策樹。

這個單元靈感來自 🧭? YDF 入門指南 教學課程。

初賽

研究資料集前,請先執行下列操作:

  1. 建立新的 Colab 筆記本
  2. 如要安裝 YDF 程式庫,請放入並執行下列這行程式碼 新的 Colab 筆記本中:
    !pip install ydf -U
    
  3. 匯入下列程式庫:
    import ydf
    import numpy as np
    import pandas as pd
    

帕爾馬企鵝資料集

這個 Colab 會使用 Palmer Penguins 資料集,內含三個大小的測量結果 企鵝品種:

  • 吊燈
  • 真通
  • Adelie

這是一個分類問題 — 我們的目標是預測 企鵝的故事。以下是企鵝的圖示:

三個不同的企鵝
例如多種種類

圖 16.三種不同的企鵝品種。圖片提供者: @allisonhorst

 

以下程式碼會呼叫 pandas 函式,將 Palmer Penguins 資料集載入記憶體:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

下表為帕爾馬企鵝提供前 3 個範例的格式 資料集:

表 3.帕爾馬企鵝的前 3 個範例 ,瞭解如何調查及移除這項存取權。

物種 島嶼 bill_length_mm bill_depth_mm flipper_length_mm body_mass_g 性別
0 分 Adelie Torgersen 39.1 18.7 181.0 版 NT$11,500 元 男性 2007 年
1 Adelie Torgersen 39.5 17.4 分 186.0 版 3800.0 女性 2007 年
2 Adelie Torgersen 40.3 18.0 版 NT$5,950 元 3250.0 美元 女性 2007 年

完整資料集內含數值組合 (例如 bill_depth_mm)。 分類 (例如 island),而且缺少特徵。與類神經網路不同 決策樹係原生支援所有特徵類型 都不必進行 one-hot 編碼、正規化或額外的 is_present 功能。

以下程式碼儲存格會將資料集分割為訓練集和測試集 設定

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

使用預設超參數訓練決策樹

您可以使用 CART 訓練第一個決策樹狀圖 (分類與 迴歸樹狀結構) 學習演算法 (也稱為學習者),且未指定任何 超參數 這是因為 ydf.CartLearner 學習者提供了良好的預設做法 。您將進一步瞭解這類模型的運作方式 本課程稍後會深入介紹這些方法

model = ydf.CartLearner(label=label).train(train_dataset)

前面呼叫並未指定要做為 輸入特徵因此會使用訓練集中的每個資料欄。通話 也未指定語意 (例如數值、類別、文字) 等輸入特徵因此,系統會自動推斷特徵語意。

呼叫 model.plot_tree() 來顯示產生的決策樹狀結構:

model.plot_tree()

在 Colab 中,你可以使用滑鼠顯示特定元素的詳細資料,例如 以及各節點的類別分佈情形

以預設值訓練的決策樹狀圖
超參數

圖 17.使用預設超參數訓練的決策樹。 ,瞭解如何調查及移除這項存取權。

Colab 顯示根條件有 243 個範例。不過, 別忘了,訓練資料集含有 272 個範例剩餘 29 系統已自動保留範例以供驗證,以及樹狀修理。

第一個條件會測試 bill_depth_mm 的值。表 4 和 5 會顯示 不同物種的可能性

表 4.bill_depth_mm ≥ 42.3不同物種的可能性

物種 可能性
Adelie (紅色) 8%
基督教 (藍色) 58%
斜紋布 (綠色) 36%

 

表 5.不同物種的可能性 bill_depth_mm < 42.3

物種 可能性
Adelie (紅色) 97%
基督教 (藍色) 2%
斜紋布 (綠色) 0%

bill_depth_mm 是數值特徵,因此,找到 42.3 這個值 使用精準分割法,以數字形式進行二元分類 特徵演算法。

如果 bill_depth_mm ≥ 42.3 為 True,則進一步測試 flipper_length_mm ≥ 207.5 幾乎可以 Gentoos 和 Gentoos + Adelie

下列程式碼提供模型的訓練和測試準確率:

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

測試準確率相當罕見,但可能的準確率高於訓練作業 準確度。在這種情況下,測試集可能會與訓練集不同。 不過,火車與拆分測試 隨機存取物件比較可能的解釋是測試資料集非常小 (僅 共 72 個範例),因此準確率估算結果不易雜訊。

以此類小型資料集為例 交叉驗證 比較準確的評估指標值 不過,本範例繼續進行了訓練和藉此輕鬆進行測試 簡單易用

改善模型超參數

使用預設超參數訓練單一決策樹 輕鬆分配獎金如要獲得更準確的預測結果,您可以:

  1. 使用更強大的學習者,例如 隨機森林梯度增強樹狀結構 模型下一頁將會說明這些學習演算法。

  2. 透過觀察和直覺改善超參數。 模型改善指南 會有幫助

  3. 使用超參數調整 來自動測試大量可能的超參數

由於我們尚未看到隨機森林和梯度強化的樹木 演算法。由於樣本數量太少,無法自動執行 超參數調整,您將手動改善模型。

上方顯示的決策樹很小,而 61 範例中的分葉包含 混合了 Adelie 和 Chinstrap 標籤為什麼演算法沒有劃分這個分葉 進一步?有兩個可能的原因:

  • 每個分葉的樣本數量下限 (預設為 min_examples=5 個) 。
  • 樹狀圖可能經過分割後遭到裁切,以免過度配適。

將樣本數量下限減少為 1 個,並查看結果:

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

使用訓練好的 決策樹
min_examples=1。

圖 18.使用 min_examples=1 訓練的決策樹。 ,瞭解如何調查及移除這項存取權。

 

含有 61 個範例的分葉節點已進一步分割為 次。

為了瞭解進一步細分節點是否有價值,我們會評估 產生各種新模型

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

模型品質提高,測試準確率從 0.9167 0.97222。變更超參數是不錯的點子。

決策樹系的前身

透過持續改善超參數 準確度。不過,與其進行人工作業,反之,我們可以訓練 以隨機樹系為例 看看是否比較好

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

隨機樹系的準確度比我們簡單的樹木更加準確。您將 您將在下一頁瞭解原因。

用量與限制

如先前所述,單一決策樹狀圖的品質通常低於現代式 例如隨機森林、梯度增強樹和類神經 更是如此但在以下情況中,決策樹仍然非常實用:

  • 做為評估更複雜做法的簡易基準。
  • 需要在模型品質和可解釋性之間權衡取捨。
  • 用來解釋 決策樹系模型 本課程稍後會深入探討