03-機器學習-決策樹-Decision Tree

三哥平凡創作生活 發佈 2024-04-27T15:22:12.303756+00:00

其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。

決策樹:

決策樹(decision tree)是一個樹結構(可以是二叉樹或非二叉樹)。其每個非葉節點表示一個特徵屬性上的測試,每個分支代表這個特徵屬性在某個值域上的輸出,而每個葉節點存放一個類別。使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特徵屬性,並按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。

構建樹的原則

我們構建一棵決策樹的基本想法就是,我們希望決策樹每個葉子節點包含的樣本儘可能屬於同一個類別,即結點的「純度」越來越高

決策樹劃分選擇的方法

根據構建樹的原則來看,即使得每個結點的純度儘可能小,那麼我們需要一些指標評價「純度」這個概念。信息熵和基尼指數是兩個常用的指標。

決策樹算法

1、熵(Entropy)

信息熵(information entropy)是度量樣本集合純度的常用指標;

在資訊理論與概率統計中,熵是表示隨機變量不確定性的度,熵越大,隨機變量的不確定性就越大,反之則不確定性越小;

假定當前樣本集合D中第k類樣本所占的比例為 pk(k=1,2,…,|Y|) ,則D的信息熵為:

()=−∑=1||2���(�)=−∑�=1|�|�����2��

Ent(D)的值越小,D的純度越高(約定:若p=0則plog2p=0)

數據集:

2、信息增益(Information Gain)

一般而言,信息增益越大,則意味著用屬性a來進行劃分所獲得的純度提升越大:

ID3就是以信息增益為準則來選擇劃分屬性的

舉例:

3、增益率

實際上,信息增益對可取值數目較多的屬性有所偏好(如編號,在西瓜集中若以編號為劃分屬性,則其信息增益最大),為減少由於偏好而帶來的不利影響,C4.5算法使用增益率(gain ratio)來選擇最優劃分屬性:

其中:

稱為屬性a的固有值(intrinsic value),屬性a的可能數目越多,則IV(a)的值通常越大

  • 信息增益率準則對可取值數目較少的屬性有所偏好,
  • C4.5採用的是先從候選劃分屬性中尋找出信息增益率最高的屬性

舉例:

4、基尼指數(Gini Index)

CART(Classification and Regression Tree)使用基尼指數(Gini index)來選擇劃分屬性,數據集的純度可用基尼值來度量

屬性a的基尼指數定義為:

在屬性集合A中尋找:

CART決策樹使用基尼指數作為屬性劃分的標準

我們使用色澤屬性進行舉例,計算此時的基尼指數:

5、剪枝處理

剪枝(pruning)是決策樹學習算法對付過擬合的主要手段,基本策略有預剪枝(prepruning)和後剪枝(post-pruning)

  • 預剪枝:在決策樹的生成過程中,對每個節點在劃分前先進行估計,若當前節點的劃分不能帶來泛化性能提升則停止劃分
  • 後剪枝:先生成一個完整的樹,然後自底向上對非葉節點考察,若將該節點對應的子數替換為葉節點能提升泛化性能則替換

5.1 預剪枝

預剪枝的關鍵在於是否繼續進行劃分:

  • 在上面的西瓜的例子當中,在劃分前,我們將其類別標記為訓練樣例最多的類別「好瓜」。那麼在驗證集用「臍部」這個結點進行劃分,則編號{4,5,8}被劃分正確,其劃分進度為 3/7*100%=42.9%
  • 如果我們使用「臍部」進行劃分,那麼圖中②、③和⑥分別包含編號為{1 , 2 , 3 , 14} 、{6 , 7 , 15 , 17} 和{10 , 16} 的訓練樣例,
  • 因此這3個結點分別被標記為葉結點「好瓜」、"好瓜"、"壞瓜"(按其訓練樣例最多類別歸屬),此時,驗證集中編號為{4 , 5 , 8 ,11, 12} 的樣例被分類正確,驗證集精度為5/7 x 100% = 71.4% > 42.9%。於是,用"臍部"進行劃分得以確定。

預剪枝使決策樹的很多分支都沒有展開,不僅降低了過擬合的風險,還顯著減少了訓練時間和測試時間,但是可能會引起過擬合

5.2 後剪枝

後剪枝通常比預剪枝保留更多的分值,一般情況下,後剪枝欠擬合風險很小,泛化性能優於預剪枝,但其訓練時間比未剪枝和預剪枝都要大得多

  • 我們基於信息增益算法進行劃分決策樹,最後在驗證集的劃分精度為42.9%,我們基於這顆完整的樹進行後剪枝
  • 我們先考慮結點6 「紋理」,將其替換為葉結點,替換後的結點包含樣本{7,15},因此將其標記為「好瓜」,則此時決策樹在驗證集的精度提升至57.1%,因此進行剪枝

連續與缺失值

連續值處理

在C4.5決策樹算法當中,使用二分法對連續的數值進行處理:我們可以考察包含n-1個元素的候選劃分點集合

我們將每個區間的中位點作為候選劃分點,然後我們使用想離散值屬性一樣來考察這些劃分點,選取最優的劃分點進行樣本集合的劃分,例如:

對上圖表格當中的例子而言,設置密度為:

根據Gain的計算公式可以得到屬性」密度「的信息增益位0.262,對應於劃分點0.381。同時按照之前的離散值的計算方法,計算離散屬性的信息增益的值:

Gain(D ,色澤) = 0.109; Gain(D ,根蒂) = 0.143;

Gain(D ,敲聲) = 0.141; Gain(D ,紋理) = 0.381;

Gain(D ,臍部) = 0.289; Gain(D , 觸感) = 0.006;

Gain(D ,密度) = 0.262; Gain(D ,含糖率) = 0.349.

可以發現紋理的信息增益是最大的,所以我們選擇」紋理「作為根節點作為劃分屬性,然後每個結點劃分過程遞歸進行,最終生成如圖所示的決策樹:

缺失值的處理

一些數據由於敏感等原因,部分數據可能會出現缺失的情況,例如下面的情況:

在決策樹的C4.5算法當中,我們使用了沒有缺失值的樣本子集進行樹的構建。以上述表格為例子舉例,沒有缺失值的樣例子集包含編號為{2,3,4,6,7,8,9,10,11,12,14,15,16,17}的14個樣例(總共有17個樣例)。那麼相應的信息熵為:

其分別在」色澤「屬性上取值為」青綠「,」烏黑「以及」淺白「的樣本子集,那麼有:

因此在樣本子集上,其信息增益為:

那麼在樣本集上的」色澤「的信息增益為,要乘以其沒有缺失的樣例數量除以全部的樣例數量:

在上述文章提及的變量為,其中每個樣本的權重wk為1:

決策樹算法優缺點

優點:

  • 決策樹具有高度可解釋性;
  • 需要很少的數據預處理;
  • 適用於低延遲應用。

劣勢:

  • 很可能對噪聲數據產生過擬合。決策樹越深,由噪聲產生過擬合的可能性就越大。一種解決方案是對決策樹進行剪枝。

代碼演示-Decision Tree

  • 數據集 iris
  • sklearn
  • 可視化決策樹插件 Download:https://graphviz.org/download/
  • 決策樹插件安裝文檔:https://blog.csdn.net/u012744245/article/details/103360769
# -*- coding: utf-8 -*-
 
from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os
#用於劃分訓練集與測試集
os.environ["PATH"]+=os.pathsep+'C:/Program Files/Graphviz/bin/' #指定路徑
from sklearn.model_selection  import train_test_split 
from sklearn.metrics import classification_report 
 
 
#加載數據
iris = load_iris()
#劃分訓練集與測試集
(training_inputs, testing_inputs, training_classes, testing_classes)=train_test_split(iris.data, iris.target,test_size=0.4, random_state=1)
# 構建模型
clf = tree.DecisionTreeClassifier()
clf = clf.fit(training_inputs, training_classes)
#測試值預測
y_predict = clf.predict(testing_inputs)
#預測值和測試值打分
score = classification_report(testing_classes, y_predict)
print(score)
# 保存模型
with open("iris.dot", 'w') as f:
    f = tree.export_graphviz(clf, out_file=f)
    
# 畫圖,保存到pdf文件
# 設置圖像參數
dot_data = tree.export_graphviz(clf, out_file=None,
                         feature_names=iris.feature_names,
                         class_names=iris.target_names,
                         filled=True, rounded=True,
                         special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
# 保存圖像到pdf文件
graph.write_pdf("irsi.pdf")

決策樹示意圖:

關鍵字: