機器學習之 決策樹(Decision Tree)

機器學習算法系列python

  1. 機器學習 之線性迴歸
  2. 機器學習 之邏輯迴歸及python實現
  3. 機器學習項目實戰 交易數據異常檢測
  4. 機器學習之 決策樹(Decision Tree)
  5. 機器學習之 決策樹(Decision Tree)python實現
  6. 機器學習之 PCA(主成分分析)
  7. 機器學習之 特徵工程

此次,咱們來看下決策樹算法算法

決策樹(Decision Tree)

決策樹是一種常見的機器學習方法,它是從根節點開始,一步一步決策,直到走到葉子節點。
最終,全部的樣本數據都會落到葉子節點,顯然,決策過程的最終結論對應了咱們所但願的斷定結果 。
它便可以作分類問題,也能夠作迴歸問題。機器學習

決策樹組成

通常,一棵決策樹包含一個根節點,若干個內部節點(非葉子節點)和若干個葉子節點。post

  1. 根節點:第一個選擇點
  2. 內部節點(非葉子節點):中間決策過程
  3. 葉子節點:最終的決策結果

決策樹的訓練流程

如何從給點定的訓練集中去構造一棵決策樹呢? 其實,決策樹的構建就是一個遞歸過程,從根節點開始,根據選擇的特徵,將原始數據集切分爲幾個分支,而後依次遍歷每一個分支,在剩下的特徵集中繼續選擇一個特徵,進行對應劃分,就是這個流程,一直遞歸下去,直到不可再分。
那麼,什麼狀況下會不可再分呢?有三種狀況:性能

  1. 當前節點包含的樣本全屬於同一類別,不須要再劃分
  2. 當前屬性集已爲空,或者 當前節點中的全部樣本在當前所剩屬性集中取值相同,沒法再分
  3. 當前節點包含的樣本集爲空,沒法劃分

具體的算法流程,這塊貼下週志華大佬的《機器學習》中的一個圖,你們能夠看下學習

咱們能夠發現,上述算法中,最重要的一點,就是在每一個節點上,選擇最優的劃分特徵,也就說,每次在節點處劃分時,咱們都須要考慮,選擇剩餘特徵集中的哪一個屬性進行劃分,能夠更好的劃分數據呢?這個,也就是決策樹算法的核心3d

決策樹劃分選擇

經過上述,咱們直到,決策樹算法的核心是,如何選擇最優的劃分特徵,咱們但願隨着劃分的進行,咱們通過每次劃分後的分支節點所包含的樣本儘量的屬於同一類別,也就是節點中所包含的樣本純度愈來愈高。從而,咱們引入信息熵這個衡量標準cdn

信息熵

信息熵表示的是隨機變量不肯定性的度量,熵越大,不肯定性越強,也就是說純度越低;
熵越小,不肯定性越弱,純度越高blog

設置樣本集合D中總共有K類樣本,其中第k類樣本所佔的比例爲p_k(k=1,2,...,K),則D的信息熵定義爲:排序

Ent(D) = -\sum_{k=1}^{K}p_k\,log_2 p_k

對於一個二分類問題,咱們能夠畫出信息熵的圖像看看

上述圖像中,X軸表示正樣本的機率,Y軸表示對應信息熵。能夠看到,當機率爲0.5時,對應信息熵最大,也就是說此時不肯定度最大,大於0.5,或者小於0.5時,信息熵都會減少。

信息增益

那麼,經過信息熵,咱們如何進行決策樹劃分選擇的衡量呢,咱們引入信息增益這個概念

咱們假設特徵集中有一個離散特徵a,它有V個可能的取值\{a^1,a^2,...,a^V\},
若是使用特徵a來對樣本D進行劃分,那麼會產V個分支節點,其中第v個分支節點中包含的樣本集。咱們記爲D^v
因而,可計算出特徵a對樣本集D進行劃分所得到的信息增益爲:

Gain(D,a) = Ent(D) - {\sum_{v=1}^V}\frac{|D^v|}{|D|}Ent(D^v)

解釋下上面公式,其實特徵a對樣本集D進行劃分所得到的信息增益 即爲 樣本集D的信息熵 減去 通過劃分後,各個分支的信息熵之和。因爲每一個分支節點,所包含的樣本數不一樣,全部在計算每一個分支的信息熵時,須要乘上對應權重\frac{|D^v|}{|D|},即樣本數越多的分支節點對應的影響越大

下面,咱們具體看個栗子

上那個那個是某人在某月的1到14號的打球記錄,咱們看下,對應特徵有四個,分別爲天氣(outlook,咱們就認爲是天氣吧- -),溫度,溼度,是否有風。輸出值爲是否打球

顯然,咱們的樣本總類K = 2, ,其中,正例佔比p_1 = \frac{9}{14},負例佔比p_1 = \frac{5}{14}首先,咱們看下,根節點所包含的樣本集D對應的信息熵爲:

Ent(D) = -\frac{9}{14}log_2\frac{9}{14} - \frac{5}{14}log_2\frac{5}{14} = 0.940

而後,咱們須要計算當前特徵集合(天氣,溫度,溼度,風級)中每一個特徵的信息增益。
以天氣這個特徵爲例,若是以天氣劃分,則可將數據集D劃分爲三個子集,分別標記爲:D^1(outlook= sunny),D^2(outlook = overcast),D^3(outlook = rainy)

劃分之後,三個分支節點的熵值分別爲:

\begin{align*}
&Ent(D1) = -\frac{3}{5}log_2\frac{3}{5} - \frac{2}{5}log_2\frac{2}{5} = 0.971\\
&Ent(D2) = 0 \\
&Ent(D3) = -\frac{2}{5}log_2\frac{2}{5} - \frac{3}{5}log_2\frac{3}{5} = 0.971\\
\end{align*}

而後,咱們能夠算出,特徵outlook(天氣)對應的信息增益是:

\begin{align*}
Gain(D,outlook) &= Ent(D) - \sum_{v=1}^3 \frac{|D^v|}{|D|}Ent(D^v) \\
&= 0.940 - (\frac{5}{14}*0.971+\frac{4}{14}*0+\frac{5}{14}*0.971) \\
&= 0.247
\end{align*}

一樣的,咱們能夠依次算出其餘特徵所對應的信息增益,而後判斷哪一個信息增益最大,則就以此特徵來做爲當前節點的劃分。
假設最後算得,採用outlook來進行當前根節點的劃分,則對於生成的三個節點分支,依次再對應每一個分支節點進行上述流程(算在此分支節點的數據集上,剩餘的特徵集合中哪一個信息增益最大,做爲當前分支節點的分割特徵,一直遞歸下去)

這其實就是ID3算法,以信息增益做爲準則來進行劃分特徵

信息增益率

咱們思考下,上面說的以信息增益做爲準則來進行劃分屬性,有什麼缺點沒?

假設對於上面的數據集,咱們增長一列特徵,爲 data(日期),針對上面的14個樣本數據,對應的值爲(1,2,3,4,5,6,7,8,9,10,11,12,13,14),根據上式可計算出,data(日期)所對應的的信息增益爲:Gain(D,data) = 0.940,
咱們發現,它所對應的信息增益遠大於其餘特徵,因此咱們要以data特徵,做爲第一個節點的劃分依據嗎?這樣劃分的話,將產生14個分支,每一個分支對應只包含一個樣本,能夠看到,每一個分支節點的純度已達到最大,也就是說每一個分支節點的結果都很是肯定。可是,這樣的決策樹,確定不是咱們想要的,由於它根本不具有任何泛化能力。

這就是ID3算法,也就是信息增益準則的一個缺點,它在選擇最優劃分特徵時,對可取數目比較多的特徵有所偏好,如何避免這個問題呢,咱們引入增益率這個概念,改成使用增益率來做爲最優劃分特徵的標準,一樣,選擇增益率最大的那個特徵來做爲最優劃分特徵,這也就是C4.5決策樹算法

一樣假設有數據集D,以及特徵a,它有V個可能的取值\{a^1,a^2,...,a^V\},

若是數據集D在以特徵a做爲劃分特徵時,增益率定義爲:

Gain\_ratio(D,a) = \frac{Gain(D,a)}{IV(a)}

其中

IV(a) = - \sum_{v=1}^V \frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|}

咱們來看下上述增益率公式,其實IV(a) 就是特徵a自己的信息熵,也就說對應根據特徵a的可能取值,所對應求得的信息熵,
舉個栗子,對於outlook這個特徵,總共有三個類別(sunny,overcast,rainy),所對應類別的數據的個數爲爲(5,4,5) 則outlook自己的信息熵爲:

IV(a) = - \sum_{v=1}^3 \frac{|D^v|}{|D|}log_2\frac{|D^v|}{|D|} = -\frac{5}{14}log_2\frac{5}{14}-\frac{4}{14}log_2\frac{4}{14} - \frac{5}{14}log_2\frac{5}{14} = ...

特徵a的對應種類越多,也就是說V越大,則IV(a)的值一般會越大,從而增益率越小。這樣,就能夠避免信息增益中對可取數目比較多的特徵有所偏好的缺點

那直接以信息增益率做爲劃分的衡量標準,有沒有什麼缺點呢,其實也有,增益率準則通常對可取數目較少的屬性有所偏好。
因此,C4.5中的作法是:先從當前全部特徵中找出信息增益高於平均值的的部分特徵,再從中選擇增益率最高的做爲最優劃分特徵

基尼指數

還有一種決策樹算法,稱爲CART決策樹,它是使用基尼值來做爲衡量標準的。具體流程其實和信息增益的衡量標準相似,只是將信息熵,改成了基尼值

Gini(D) = \sum_{k=1}^{K}p_k(1-p_k) = 1-\sum_{k-1}^{K}p_k^2

Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不同的機率,因此,Gini(D)越小。則數據集的純度越高

連續型特徵處理

前面咱們所講的都是基於離散型特徵進行劃分生成決策樹,那對於連續性特徵,咱們須要怎麼來處理呢?這個時候就須要用到連續型特徵離散化的方法。最簡單的即爲二分法。下面咱們來具體看下

給定樣本集D和連續特徵a, 假設特徵a在樣本集中總共有n個不一樣的取值。

  1. n個取值進行從小到大排序,記爲A{a^1,a^2,...a^n}
  2. 基於一個劃分點t,將A劃分爲兩部分,其中不大於t的部分對應的數據集爲D_t^{-},大於t的部分對應的數據集爲D_t^{+}
  3. 咱們知道,對於將{a^1,a^2,...a^n}進行二分,咱們有n-1種分法,另外對於相鄰的屬性取值a^ia^{i+1}來講
    t在區間[a^i,a^{i+1})中取任意值產生的劃分結果相同,依次,t的取值集合爲:
T_a = \{ \frac{a^i+a^{i+1}}{2} \,\,, 1<=i<=n-1 \}
  1. 而後,對於每一個劃分點,咱們進行信息增益的計算,選擇最大的信息增益對應的那個劃分點,做爲連續型特徵a的劃分點。公 式爲:
    \begin{align*}
Gain(D,a) &= \max_{t\in{T_a}} Gain(D,a,t) \\
&=\max_{t\in{T_a}}  \{ Ent(D) - (\frac{|D_t^{-}|}{|D|}Ent(D_t^{-}) + \frac{|D_t^{+}|}{|D|}Ent(D_t^{+})) \}
\end{align*}

決策樹剪枝操做

咱們想一想,若是咱們不加限制,最後訓練出來的決策樹,每一個葉子節點的數據都會分紅純淨的,這樣真的好嗎?要知道,咱們是但願訓練出的決策樹模型,對於新給的數據,可以準確預測出對應結果。

因此,決策樹,很是容易出現過擬合問題。爲了不這個問題,提供決策樹的泛化能力,咱們須要進行剪枝操做。通常有兩種剪枝操做,「預剪枝」和「後剪枝」

預剪枝

預剪枝便是指在決策樹的構造過程當中,對每一個節點在劃分前須要根據不一樣的指標進行估計,若是已經知足對應指標了,則再也不進行劃分,不然繼續劃分。

那麼,具體指標都有哪些呢?

  1. 直接指定樹的深度
  2. 直接指定葉子節點個數
  3. 直接指定葉子節點的樣本數
  4. 對應的信息增益量
  5. 拿驗證集中的數據進行驗證,看分割先後,精度是否有提升。

因爲預剪枝是在構建決策樹的同時進行剪枝處理,因此其訓練時間開銷較少,同時能夠有效的下降過擬合的風險
可是,預剪枝有一個問題,會給決策樹帶來欠擬合的風險,1,2,3,4指標,不用過多解釋,對於5指標來講,
雖然,當前劃分不能致使性能提升,可是,或許在此基礎上的後續劃分,卻能使性能顯著提升呢?

後剪枝

後剪枝則是先根據訓練集生成一顆完整的決策樹,而後根據相關方法進行剪枝。

經常使用的一種方法是,自底向上,對非葉子節點進行考察,一樣拿驗證集中的數據,來根據精度進行考察。看該節點劃分前和劃分後,精度是否有提升,若是劃分後精度沒有提升,則剪掉此子樹,將其替換爲葉子節點。

相對於預剪枝來講,後剪枝的欠擬合風險很小,同時,泛化能力每每要優於預剪枝,可是,由於後剪枝先要生成整個決策樹後,而後才自底向上依次考察每一個非葉子節點,因此訓練時間長。

以上,就是決策樹算法的基本原理,下一篇文章,咱們將經過python來具體實現一個決策樹算法

歡迎關注個人我的公衆號 AI計算機視覺工坊,本公衆號不按期推送機器學習,深度學習,計算機視覺等相關文章,歡迎你們和我一塊兒學習,交流。

相關文章
相關標籤/搜索