top of page

機器學習 - 決策樹 (Desicion Tree):從概念到應用

Sep 9, 2024

5 min read

0

109

0

雖然決策樹(Desicion Tree)在機器學習(Machine Learning)中的使用已經有一段時間,但這一技術仍然強大且受歡迎。這篇文章會首先提供該方法的入門理解,然後展示如何構建決策樹、計算重要的分析參數,以及繪製結果樹。




決策樹是我學習過的一種流行且強大的機器學習算法。它是一種非參數的監督學習方法,可用於分類和回歸任務。目標是創建一個模型,通過從數據特徵中推斷的簡單決策規則來預測目標變量的值。對於分類模型,目標值是離散的,而對於回歸模型,目標值則由連續值表示。與神經網絡等黑箱類算法不同,決策樹相對容易理解,因為它分享了內部決策邏輯(您將在接下來的部分中找到詳細信息)。


儘管許多數據科學家認為這是一種舊方法,並可能對其準確性因過擬合問題有所懷疑,但最近基於樹的模型,例如隨機森林(袋裝方法)、梯度提升(提升方法)和XGBoost(提升方法)都是建立在決策樹算法之上的。因此,理解決策樹背後的概念和算法是非常值得的!決策樹算法有四種流行類型:ID3、CART(分類和回歸樹)、卡方檢驗和方差減少。在這篇文章中,我將僅關注分類樹以及ID3和CART的解釋。



想像一下,您每週日都打網球,並邀請您的好朋友Clare每次都來參加。Clare有時會來,有時卻不會。對於她來說,這取決於多個因素,例如天氣、溫度、濕度和風。我要使用下面的數據集來預測Clare是否會來打網球。一種直觀的方法是通過決策樹來實現。

在這個決策樹圖中,我們有:

  • 根節點 (Root Node):第一個分割,決定整個群體或樣本數據應進一步分為兩個或多個同質集合。在我們的例子中是“展望”節點。

  • 分割 (Splitting):將一個節點分為兩個或多個子節點的過程。

  • 決策節點 (Decision Node):該節點決定子節點是否/何時分割為進一步的子節點。在這裡我們有“展望”節點、“濕度”節點和“風”節點。

  • 葉子 (Leaf):預測結果的終端節點(類別或連續值)。彩色節點,即“是”和“否”節點,即為葉子。


問題:基於哪個屬性(特徵)進行分割?最佳分割是什麼?
答案:使用信息增益或基尼增益最高的屬性。


ID3決策樹算法使用信息增益來決定分割點。為了測量我們獲得了多少信息,我們可以使用熵來計算樣本的同質性。

問題:什麼是“熵” (Entropy)?它的作用是什麼?
答案:它是數據集中的不確定性的量度。熵控制決策樹如何決定分割數據。它實際上影響決策樹劃定邊界的方式。

熵(Entropy)的公式:

概率分布的對數是作為熵的量度而有用的。

定義:決策樹中的熵代表同質性


如果樣本完全同質,熵為0(概率= 0或1);如果樣本在類別中均勻分佈,則熵為1(概率=0.5)。下一步是進行分割以最小化熵。我們使用信息增益來確定最佳分割。讓我向您展示如何逐步計算信息增益,以打網球的情況為例。這裡我將僅展示如何計算“展望”的信息增益和熵。


步驟1:計算一個屬性的熵——預測:Clare會打網球/Clare不會打網球在這個例子中,我將使用這個列聯表來計算我們目標變量的熵:打過?(是/否)。共有14個觀測值(10個“是”和4個“否”)。‘是’的概率(p)為0.71428(10/14),而‘否’的概率為0.28571(4/14)。然後您可以使用上面的公式計算我們目標變量的熵。



步驟2:使用列聯表計算每個特徵的熵為了說明,我用“展望”作為例子說明如何計算其熵。共有14個觀測值。通過對行求和,我們可以看到有5個屬於“晴天”,4個屬於“陰天”,5個屬於“雨天”。因此,我們可以找到“晴天”、“陰天”和“雨天”的概率,然後使用上述公式逐一計算它們的熵。計算步驟如下:


註:計算特徵2(Outlook)的熵的例子


定義:信息增益是當節點被分割時熵值的減少或增加。

註:信息增益來自X對Y的影響


註:outlook的信息增益為0.147



為了可視化如何使用信息增益構建決策樹,我簡單地應用sklearn.tree.DecisionTreeClassifier來生成圖示。sklearn.tree.DecisionTreeClassifier中的“熵”表示信息增益。


步驟3:選擇信息增益最大的屬性作為根節點“濕度”的信息增益最高,為0.918。濕度是根節點。

步驟4:熵為0的分支是葉子節點,而熵大於0的分支需要進一步分割。

步驟5:在ID3算法中,節點以遞歸方式生長,直到所有數據被分類。


您可能聽說過C4.5算法,這是ID3的一種改進,使用增益比作為信息增益的擴展。使用增益比的優勢在於通過使用分割信息來歸一化信息增益,從而解決偏差問題。我不會在這裡詳細介紹C4.5。


CART(分類和回歸樹)


另一個決策樹算法CART使用基尼方法來創建分割點,包括基尼指數(基尼不純度)和基尼增益。 基尼指數的定義:隨機選擇標籤時,將錯誤標籤分配給樣本的概率,也用來衡量樹中特徵的重要性。

註: 基尼指數的公式


讓我向您展示如何計算基尼指數(Gini Index)和基尼增益 (Gini Gain)


在為每個屬性計算基尼增益後,sklearn.tree.DecisionTreeClassifier將選擇基尼增益最大的屬性作為根節點。基尼為0的分支是葉子節點,而基尼大於0的分支則需要進一步分割。節點以遞歸方式生長,直到所有數據被分類(見下面的詳細信息)。


如前所述,CART還可以使用不同的分割標準來處理回歸問題:均方誤差(MSE)來確定分割點。回歸樹的輸出變量是數字型的,而輸入變量允許連續和類別變量的混合。


太好了!您現在應該了解如何計算熵、信息增益、基尼指數和基尼增益!

問題:那麼…我應該使用哪一個?基尼指數(Gini Idex)還是熵(Entropy)?
答案:一般來說,結果應該是相同的……我個人更喜歡基尼指數((Gini Idex)),因為它不涉及計算上更為繁重的對數。但為什麼不兩者都試試呢?

讓我們用表格的形式總結一下吧!


使用 Scikit Learn 構建決策樹

Scikit Learn 是一個免費的機器學習庫,適用於 Python 程式語言。


第1步:加入數據

import numpy as np
import pandas as pd
df = pd.read_csv('weather.csv')

第2步:將分類變數轉換為虛擬變數/指標變數

df_getdummy=pd.get_dummies(data=df, columns=['Temperature', 'Outlook', 'Windy'])

第3步:分離訓練集和測試集

from sklearn.model_selection import train_test_split
X = df_getdummy.drop('Played?',axis=1)
y = df_getdummy['Played?']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=101)

第4步:透過sklean導入決策樹分類器

from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier(max_depth=3)
dtree.fit(X_train,y_train)
predictions = dtree.predict(X_test)

第5步: 視化決策樹圖

from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier(max_depth=3)
dtree.fit(X_train,y_train)
predictions = dtree.predict(X_test)
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16,12))
a = plot_tree(dtree, feature_names=df_getdummy.columns, fontsize=12, filled=True,
class_names=['Not Play', 'Play'])


總結:現在你應該知道

  • 如何建構決策樹

  • 如何計算“熵”和“資訊增益”

  • 如何計算“基尼指數”和“基尼增益”

  • 最好的分割是什麼?

  • 如何用 Python 繪製決策樹圖


有關編程和資料集,請查看此處 

Sep 9, 2024

5 min read

0

109

0

Comments

Share Your ThoughtsBe the first to write a comment.
bottom of page