1. 程式人生 > >決策樹演算法--ID3

決策樹演算法--ID3

原創: 袁恆  Refinitiv創新實驗室ARGO  9月17日

稽核: 施天璐 單華 傅佳  編輯:張翔

一 什麼是決策樹

決策樹是機器學習方法中的一種監督學習演算法,表示根據特徵對樣本進行分類的樹形結構,可以用於分類和迴歸。

它的思路大概是這樣的:從根節點開始,按照訓練資料的每個特徵進行計算,根據每個特徵的不確定性將訓練資料分配到其子節點(分支),沿著該分支可能達到葉子節點或者到達另一個內部節點,然後對剩餘的特徵遞迴執行下去,直到抵達一個葉子節點。當都到達葉子節點時,我們便得到了最終的分類結果。把這種決策分支畫成圖形很像一棵樹的枝幹,也就是決策樹。

假如有一份關於跳槽的調查問卷,整理後發現,工資漲幅,公司性質,加班多少,距離遠近4個指標對員工跳槽的影響比較大,從中抽取出14條資料,並且已知每條記錄都有是否跳槽的結果。

工資漲幅

公司性質

加班

距離

跳槽

外企

外企

外企

一般

國企

一般

網際網路公司

一般

網際網路公司

網際網路公司

國企

網際網路公司

一般

國企

國企

國企

外企

一般

國企

假如你是IT窮屌絲一枚,有一個跳槽的機會:工資漲幅—高,公司性質—網際網路公司,加班—多,距離—遠,那麼你猶豫是否應該跳呢?這個問題可以通過決策樹來實現。

那決策樹有哪些特點?決策樹在sklearn中如何使用?帶著這個問題請繼續往下看,決策樹怎麼幫助我們解決現實生活中的問題的。

二 決策樹的學習過程

  1. 特徵選擇

    特徵選擇是指從訓練資料的特徵中選擇一個特徵作為當前節點的分裂點,怎麼選擇特徵有著很多不同量化評估標準標準,從而衍生出不同的決策樹演算法。

  2. 決策樹生成

    根據選擇的特徵評估標準,從上至下遞迴地生成子節點,直到資料集不可分則停止決策樹停止生長。樹結構來說,遞迴結構是最容易理解的方式。

  3. 剪枝

    決策樹容易過擬合,一般來需要剪枝,縮小樹結構規模、緩解過擬合。剪枝技術有前剪枝和後剪枝兩種。

三 基本概念

1. 資訊熵

資訊熵是度量隨機變數的不確定性。

定義:假設隨機變數的可能取值有,對於每一個可能的取值,其概率,因此隨機變數的熵:

  1. 在分類問題中的意義:資訊熵表示分類的不確定性。樣本集純度越高,熵越小;反之,成分越複雜,純度越低,則熵越大。

  2. 資訊增益(ID3演算法)

  3. 以某特徵劃分資料集前後的熵的差值公式:

    是劃分前的資訊熵,是按照特徵X下的條件熵:

    在決策樹中的意義:資訊增益作為決策樹選擇特徵(ID3演算法)的衡量指標,目的是為了要建立一個能夠準確分類而且儘可能矮的樹。在建立決策樹的過程中,一個特徵的資訊增益越大,表明特徵對樣本的熵減少的能力越強,這個特徵使得資料由不確定性變成確定性的能力越強。

    缺點:資訊增益偏向取值較多的特徵。

  4. 剪枝

    決策樹很容易過擬合,往往是因為太過“茂盛”,也就是節點過多,分類過細,所以需要裁剪(Prune Tree)枝葉。主要有前置剪枝和後置剪枝兩種策略。

    前剪枝就是在樹的構建過程(只用到訓練集),設定一個閾值,使得在當前分裂節點中分裂前和分裂後的誤差超過這個閾值則分裂,否則不進行分裂操作。

    後剪枝是是在用訓練集構建好一顆決策樹後,利用測試集進行的操作。 

    由於剪枝比較複雜,暫時不在此文中具體介紹。

四 ID3演算法

決策樹有三種比較經典的演算法: ID3, C4.5和CART。

由於ID3是這三個演算法的基礎,而且其他兩個演算法是ID3的改進,因此本文主要以ID3為例.

輸入:m個樣本,每個樣本有n個離散特徵,特徵集合為A,樣本輸出集合為D,採用前剪枝,資訊增益的閾值為ϵ

輸出:決策樹T。

演算法的流程圖如下:

 

五 例項理解演算法

還記得開篇的例子嗎?現在我們怎麼使用構建決策樹呢?

計算方法如下:

1. 第一次迭代(即根節點的構建):

分類之前的資訊熵:

按距離分類,特徵值有兩種(遠和近),資訊熵分別為:

   

在特徵“距離”下的條件熵為:

因此按距離分類,資訊增益為:

同理可得,

Gain(S|加班)=0.151

Gain(S|公司性質)= 0.029

Gain(S|工資漲幅)=0.247

經過第一次迭代,Gain(S|工資漲幅)的資訊增益是最大的,因此工資漲幅作為根節點。此時樹按照工資漲幅分成了三類(低,一般,高):

 

工資漲幅

公司性質

加班

距離

跳槽

外企

外企

國企

網際網路公司

國企

一般

國企

一般

網際網路公司

一般

網際網路公司

一般

國企

一般

國企

外企

網際網路公司

國企

外企

 

2. 接下來按照工資漲幅的每個特徵進行再分類:

對於工資漲幅低的,一共有5個樣本,首先計算該樣本集的資訊熵:

計算距離特徵的條件熵:

計算出資訊增益:

同理可得:

Gain(S|加班)=0.971

Gain(S|公司性質)= 0.771

由此可見,Gain(公司性質)的資訊增益是最大的,因此”公司性質”作為特徵值”工資低”的子樹。

同理對於特徵值”工資一般”,Gain(距離)的資訊增益是最大的,因此距離作為特徵值”工資一般”的子樹。

對於工資高,4個樣本都屬於同一分類(是),停止計算。

3. 第三次迭代,按照特徵向量”加班”繼續進行分類

對加班的每個特徵進行再分類:

但此時”多”都屬於同一類(否),”少”都屬於同一類(是),停止分類

同理距離的每個特徵也都屬於同一類,”近”屬於是,”遠”屬於否

至此,所有的特徵都抵達葉子節點,停止分類,遞迴結束

此時樹結構圖如下:

因此文章開頭的資料(工資漲幅—高,公司性質—網際網路公司,加班—多,距離—遠)的資料,當然是去了。這也許是網際網路公司為什麼加班多、離家遠也有很多人想去的原因吧,哈哈。

注:此例子純屬虛構

六 ID3演算法的優缺點

優點:

1.  決策樹易於理解和解釋,可以視覺化分析。

2.  決策樹分類器的構造不需要任何領域知識或引數設定,

3.  適合高維資料

4.  可以同時處理標稱型和數值型資料

5.  計算複雜度不高

缺點:

1.  容易出現過擬合

2.  對缺失資料處理比較困難

3.  忽略資料集中屬性的相關性

4.  ID3演算法計算資訊增益時偏向數值較多的特徵

5.  不支援增量學習

七 Python怎麼實現決策樹演算法

通過呼叫sklearn庫中的sklearn.tree.DecisionTreeClassifier類來實現決策樹演算法Python實現如下:

from sklearn import tree
model = tree.DecisionTreeClassifier(criterion='gini',splitter="best",max_depth=None,min_samples_leaf=2,min_weight_fraction_leaf=0,max_features=None,random_state=None,max_leaf_nodes=None,min_impurity_decrease=0,min_impurity_split=None,class_weight=None,presort=False)
model.fit(train_X, train_y)

[criterion]:string型別,可選(預設為"gini"),支援的標準有"gini"代表的是Giniimpurity(不純度)與"entropy"代表的是information gain(資訊增益)。

[splitter]:string型別,可選(預設為"best")一種用來在節點中選擇分類的策略。支援的策略有"best",選擇最好的分類,"random"選擇最好的隨機分類。

[max_features]:int,float,stringor None 可選(預設為None),在進行分類時需要考慮的特徵數。如果是int,在每次分類是都要考慮max_features個特徵。如果是float,那麼max_features是一個百分率並且分類時需要考慮的特徵數是int(max_features*n_features,其中n_features是訓練完成時發特徵數)。

[max_depth]:int or None,可選(預設為"None")表示樹的最大深度。如果是"None",則節點會一直擴充套件直到所有的葉子都是純的或者所有的葉子節點都包含少於min_samples_split個樣本點。忽視max_leaf_nodes是不是為None。

[min_samples_split]:int,float,可選(預設為2)區分一個內部節點需要的最少的樣本數。如果是int,min_samples_split為最小的樣本數。如果是float,min_samples_split是一個百分率並且ceil(min_samples_split*n_samples)是每個分類需要的樣本數。

[min_samples_leaf]:int,float,可選(預設為1)一個葉節點所需要的最小樣本數:如果是int,則其為最小樣本數;如果是float,則它是一個百分率並且ceil(min_samples_leaf*n_samples)是每個節點所需的樣本數。

[min_weight_fraction_leaf]:float,可選(預設為0)一個葉節點的輸入樣本所需要的最小的加權分數。

[max_leaf_nodes]:int,None 可選(預設為None)在最優方法中使用max_leaf_nodes構建一個樹。最好的節點是在雜質相對減少。如果是None則對葉節點的數目沒有限制。如果不是None則不考慮max_depth.

八 知識擴充套件

不知道大家看到資訊熵、資訊增益那些數學公式的時候是什麼感覺,我會有以下幾個疑問:

1. 熵是怎麼來的?

決策樹的數學公式不是平白出現的,而是從概率論推到出來的,公式的推導過程請參考:

https://blog.csdn.net/xsqlx/article/details/51120485

不過需要注意的是:資訊熵的公式是假設各個特徵值是相互獨立的,因此如果特徵之間相互關聯,最好不要選擇決策樹;如果使用決策樹,要選擇相互獨立的特徵值。

注:其實C4.5和CART樹也是一樣的,都是以各個特徵值是相互獨立為前提條件的

2. 為什麼資訊增益偏向取值較多的特徵?

資訊增益的公式為:

因為H(Y)是固定的(如果不太理解,請參考例項理解演算法那一部分),所以G(Y,X)的增減性要看-H(Y|X),也就是變化後的資訊熵。

想象兩個極端情況:假設特徵X中有兩個特徵的樣本特別不純(等分為m類),即不會偏向任何一個特徵值,那X的條件熵:

 

是單調遞增函式,m是樣本個數,m的取值為大於1的整數,所以

而如果的樣本特別純(都屬於同一類),即這個類的特徵取值較多,則H(Y|X)=log(1)=0,那麼:G(Y,X)=H(Y)。因此資訊增益偏向取值較多的特徵。

3. 為什麼引入C4.5?

當然是解決問題2的缺點了,那麼怎麼解決呢?

C4.5引入了資訊增益率作為特徵選擇的衡量指標。資訊增益率:是在資訊增益的基礎之上乘上一個懲罰引數。特徵個數較多時,懲罰引數較小;特徵個數較少時,懲罰引數較大。

公式:

其中

其實ID3和C4.5可以對比路程與速度的概念。

比如:甲跑了1000米,用了5分鐘;乙跑了200米,用了0.5分鐘,問誰跑的快?

ID3的意思就是按路程1000米和200米做比較,當然選擇1000了;

而C4.5的意思是求速度:

(注:沒轉換成m/s是為了計算簡便)

這時可以看出

 

本期的決策樹-ID3演算法就介紹到這了,歡迎大家批評指正並關注我們的公眾號。Refinitiv Argo

 

參考:

https://www.cnblogs.com/muzixi/p/6566803.html 

https://blog.csdn.net/qq_36330643/article/details/77415451

http://scikit-learn.org/dev/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier