「距離小於某個值嗎?」如果是,再問一個問題;如果不是,往另一條路走。決策樹把這樣的判斷接起來,最後在葉節點給出預測。
規則看起來簡單,真正要學的是:問題問哪個欄位、在哪裡切、何時停止。這些選擇來自訓練資料與評分準則,不是模型先理解了業務因果。
這篇用六筆自訂資料比較第一個切點,再搭配原圖看資訊增益、迴歸與剪枝。讀完應能解釋一棵小樹的預測路徑,也知道為什麼把訓練資料分得很乾淨,仍不等於值得部署。
從根節點一路走到葉節點
圖1|Root是起點,decision node依特徵作判斷,leaf給出最終預測。來源:Jared Wilber、Lucía Santamaría/Amazon MLU-Explain,Decision Trees,CC BY-SA 4.0。沿原SVG調整文字色與描邊、增加白邊,節點與線未改。
訓練時,模型把到達目前節點的樣本分成幾群,尋找能改善目標的規則;預測時,新輸入只依已學好的規則往下走,不會一邊查詢一邊重訓。
以常見的數值二元切分為例:
若 xⱼ ≤ t,往左
否則往右
兩個特徵的平面中,這相當於一條垂直或水平的線。接著在某個子區域繼續切,就能形成不規則但仍由軸向區塊組成的分類區域;不是每一步都在整個平面重新畫一條線。
圖2|來源有150個教學點,apple、cherry、oak各50個;橫軸Diameter、縱軸Height。這裡的tree是待分類的植物,decision tree則是分類器,不要把兩者混成同一件事。來源與SVG改作同圖1;本篇未重新訓練這組來源資料。
單棵小樹通常容易追蹤路徑,但大樹可能有很多分支,規則也會隨訓練樣本改變。可讀的形式不自動證明規則合理或具有因果意義。
模型怎麼知道哪一刀比較好
先只看一個節點。若裡面全是同一類,分類已很單純;混著幾類,則還有不確定性。常見的Gini impurity與entropy都用來量化這種混合程度。
pₖ = 目前節點中類別k的樣本比例
Gini = 1 − Σₖpₖ²
Entropy = −Σₖpₖ log₂(pₖ)
本篇的手算熵以log₂為底,單位是bits,並約定0×log₂0=0。兩類各半時Gini=0.5、熵=1 bit;全屬同一類時兩者都是0。對固定類別數,越平均通常越混雜,但兩個準則的數值尺度與切分排序不必完全一樣。
圖3|原畫面選中正類3、負類3,來源程式使用log₂,熵為1 bit。圖兩側Add/Remove是原互動頁的控制標籤,本篇保留的SVG是靜態圖,不能點選增加樣本。來源與SVG改作同圖1。
一刀切下去,不能只看其中一邊變純。需要依兩邊的樣本數加權:
切後不純度 = (n左/n)×I左 + (n右/n)×I右
改善量 = I父 − 切後不純度
若用熵,改善量就是information gain。假設只把一個點隔離得很純,卻讓另外99個點幾乎不變,加權就能避免把這種切分誤當成整批資料大幅改善。
六筆資料,完整比較第一刀
以下是本站自訂的一維分類資料,x沒有業務單位,y只有0與1:
- 0
- 0
- 1
- 0
- 1
- 1
父節點有三個0、三個1,Gini=0.5。對相鄰不同x取中點,第一刀候選為1.5、2.5、3.5、4.5、5.5。
以t=2.5為例:左邊兩個0,Gini=0;右邊為1、0、1、1,正類比例3/4,Gini=0.375。
切後Gini = (2/6)×0 + (4/6)×0.375 = 0.25
Gini改善 = 0.5 − 0.25 = 0.25
切後Entropy = (4/6)×[−0.75log₂0.75 − 0.25log₂0.25]
≈ 0.540852 bits
資訊增益 = 1 − 0.540852 ≈ 0.459148 bits
| 切點t | Gini改善 | 熵的資訊增益(bits) |
|---|---|---|
| 15 | 0.1 | 約0.190875 |
| 25 | 0.25 | 約0.459148 |
| 35 | 約0.055556 | 約0.081704 |
| 45 | 0.25 | 約0.459148 |
| 55 | 0.1 | 約0.190875 |
2.5與4.5並列最好。因此,資料與準則不一定導出唯一一棵樹。本篇程式自訂「同分選較小切點」,所以選2.5;這不是宣稱所有工具都有相同的平手規則。
選完第一刀後,演算法只對各子節點收到的資料重複比較。這叫貪婪搜尋:每次選當前較好的切分,不是窮舉所有可能的整棵樹,不能保證最後得到全域最優結構。
回到原圖:切點、曲線與單位要一起讀
圖4|這是圖2同一組150點。來源初始化的直徑切點為0.444,原文以約0.45敘述;左邊97點、右邊53點,不能把敘述的近似值當作精確重算條件。來源與SVG改作同圖1。
圖5|藍線為左區entropy、粉線為右區entropy、黑線為information gain。選中0.444時,來源顯示左0.693、右0.218、增益0.574;這組預計算值使用自然對數,單位是nats,和圖3及本篇手算的bits不同。來源與SVG改作同圖1。
對原始點計數可驗算:0.444左側有47個apple、50個cherry;右側有3個apple、50個oak。以自然對數重算,加權後資訊增益約0.573830 nats,對應0.827862 bits,和來源三位小數一致。
固定資料、所有候選一致換底時,熵與資訊增益都乘上同一個正數,因此排序不變;但不能把0.574 nats直接與前面六筆例子的0.459148 bits比較大小,更不能直接相減。原圖保留它的單位與數值,我們在文字中把條件講清楚。
原圖的曲線是沿「直徑」這一個特徵比較候選切點,沒有證明高度或其他特徵都較差,也不證明貪婪選到的整棵樹一定最佳。
葉節點怎麼給預測,迴歸又有哪裡不同
若前面的六點例只切第一刀就停,左葉全為0;右葉有三個1、一個0,分類選1,未加權的正類比例為0.75。新輸入依規則落到某葉,就得到這個葉的預測。
這個0.75只是訓練葉內的比例,不是已驗證的可靠機率。小葉可能出現0或1的極端比例,換一批資料就不同;若拿來作風險決策,還需檢查機率校準。
迴歸樹把分類標籤換成連續目標。例如在平方誤差準則下,葉通常輸出該葉訓練目標的平均,選切點時比較誤差下降。若改用絕對誤差,葉的代表值可變成中位數;不是所有迴歸樹都固定用平均。
圖6|來源使用80個一維帶噪正弦訓練點;藍線max_depth=2、綠線max_depth=5。藍綠線都是葉內常數造成的階梯,不是各葉另外擬合線性迴歸。這是來源訓練擬合與查詢網格示意,不能僅看圖就宣稱某深度在所有測試集較好。來源:scikit-learn developers,Decision Tree Regression,BSD 3-Clause,原圖未改。
基本常數葉的迴歸樹也不擅長延續訓練範圍外的趨勢。輸入走到邊緣葉後,仍得到同一個值;這和線性模型的外推方式不同,但兩者的外推都需要額外驗證。
長到多深才停:限制生長與事後剪枝
更多分支通常能降低訓練不純度,卻可能學到雜訊。常見限制包括最大深度、最大葉數、每葉最少樣本,以及切分至少需要多少改善;它們都應用開發資料選擇,不是照別人的預設值就完成驗證。
預先限制與事後剪枝是兩種不同操作。Cost-complexity pruning則在已長出的樹中,權衡葉的不純度與葉數:
Rα(T) = R(T) + α × 葉數
α ≥ 0
在scikit-learn的這個方法裡,R(T)使用樣本加權的葉不純度總量;不是把任意測試錯誤直接代進來。較大α對多葉付出較高代價,傾向剪成較小的子樹。
圖7|來源為breast-cancer範例;橫軸effective alpha,縱軸是training leaves的總不純度,不是測試損失或分類錯誤率。剪掉分支後,葉混合更多類別是可以預期的取捨。來源:scikit-learn developers,Post pruning decision trees with cost complexity pruning,BSD 3-Clause,原圖未改。
圖8|上面是節點數,下面是深度;α增加,這組路徑中的樹逐漸簡化。來源略去最後只剩單節點的極端樹,不能說圖中最後一個點就是完整路徑終點。來源同圖7,原圖未改。
圖9|原圖確實標train與test,未替它改名。這組來源實驗中,適度剪枝改善保留資料的表現,過度剪枝又變差;不是所有資料都在約0.015最佳。來源同圖7,原圖未改。
原頁用test曲線展示哪個α較好;自己的評估流程不能一邊看最後測試結果,一邊選α。應在訓練/開發資料上用驗證集或交叉驗證選擇,確認後再碰保留的最終測試集。這個區別見基準與交叉驗證。
用Python重算六筆資料的第一刀
下面只用標準函式庫,枚舉前面五個候選。它沒有建立多層樹,也沒有重跑MLU或sklearn的來源實驗。
from collections import Counter
from math import log2
rows = list(zip([1, 2, 3, 4, 5, 6], [0, 0, 1, 0, 1, 1]))
def impurity(labels, kind):
probabilities = [n / len(labels) for n in Counter(labels).values()]
if kind == "gini":
return 1 - sum(p * p for p in probabilities)
return -sum(p * log2(p) for p in probabilities)
labels = [y for _, y in rows]
results = []
for threshold in (1.5, 2.5, 3.5, 4.5, 5.5):
left = [y for x, y in rows if x <= threshold]
right = [y for x, y in rows if x > threshold]
gains = []
for kind in ("gini", "entropy"):
after = (len(left) * impurity(left, kind)
+ len(right) * impurity(right, kind)) / len(rows)
gains.append(impurity(labels, kind) - after)
results.append((threshold, gains[0], gains[1]))
print(threshold, round(gains[0], 6), round(gains[1], 6))
best = max(results, key=lambda result: (result[1], -result[0]))
print("chosen threshold:", best[0], "(Gini ties choose smaller threshold)")
輸出會對上前表,並選2.5。這份程式只考慮明確列出的非空左右切分;真實資料還要處理重複值、缺失、樣本權重與停止條件。
規則看得見,仍需要查資料與穩定性
數值軸向樹通常不像距離模型那樣依賴標準化,單調且保留排序的轉換常不改變可用分區,但這不表示所有前處理都可以省略。類別編碼、缺失值支援與新類別處理,仍要依具體工具與資料設計。
也不要把「分支先用了某欄位」直接解釋成因果或最重要業務因素。高基數特徵可能得到較多候選切分,相關特徵會互相替代,資料洩漏欄位更可能產生漂亮卻無用的樹。先回查特徵工程與資料切分。
最後,換一批樣本或稍改標籤,根節點就可能不同。下一篇會說明Random Forest如何透過多棵樹與隨機化降低部分不穩定性;在此之前,先確定你能讀懂每條路徑在依據什麼資料作預測。
來源與圖片授權
本站新增六筆自訂例、候選切點表與可執行重算;未宣稱在真實業務或來源資料上重訓完整模型。MLU兩種熵單位及0.444切點另從其公開程式與150個原始點核對。
- Jared Wilber、Lucía Santamaría/Amazon MLU-Explain:Decision Trees,來源程式與授權說明。圖1–5為來源自有SVG的可讀改作:移除文字描邊、改深色文字與增加白邊;資料、公式標籤、曲線、節點及連線未重畫。改作圖依相同CC BY-SA 4.0公開;本文其餘原創教學敘述另行撰寫。
- scikit-learn developers:Decision Trees、Decision Tree Regression、Cost complexity pruning。圖6–9依BSD 3-Clause使用,完整聲明如下。
BSD 3-Clause License
Copyright (c) 2007-2026 The scikit-learn developers.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
封面沿用圖1的MLU可讀SVG改作,轉為JPEG並等比縮放加白邊,節點與標籤不變;仍依CC BY-SA 4.0使用。
留言0
登入後就能留言。
登入