.png)

雖然決策樹(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 繪製決策樹圖
有關編程和資料集,請查看此處。