利用資訊熵構建決策樹

2021-09-12 13:18:54 字數 1684 閱讀 4460

決策樹演算法普遍存在於我們的日常生活中,我們在不經意間就會使用到決策樹。比如你在糾結是否要去一家公司工作時,可能會用到下面的決策樹:

整個決策過程是這樣的:如果公司待遇高,你可能就願意去;如果待遇不高,你可能會繼續考慮公司的平台好不好。如果連平台都不好,那就直接拒絕。如果平台很好,你就會繼續考慮自己在這個平台上是否有成長空間,如果沒有,你就會拒絕。如果有成長空間,你會覺得即便待遇不高,也可以答應。

這樣的決策過程最終形成一棵樹,在這棵樹上,每乙個你提出的問題,都叫做決策結點,在最頂部的那個問題叫做根結點。每乙個結論(同意or拒絕)叫做葉子結點。

在上面那張圖的右邊,標出了乙個depth,指的是決策樹的深度。這棵決策樹的depth=3,意思最多用3次判斷,就能得出結論。根據奧卡姆剃刀定律,決策樹越簡單越好,depth自然也是越小越好。

在上面這個例子中,每乙個決策結點都是能用「是」或者「否」來判斷的疑問句,而實際上我們拿到的真實資料集,內容往往是一些具體的數值,所以在決策結點一般會有乙個閾值,我們將資料集中具體的數值和這個閾值進行比較,來劃分出分支。

理解了什麼是決策樹,接下來的問題就是:如何構建決策樹?從上面的例子可以看出來,構建決策樹的關鍵在於:每乙個決策結點上,你應該問什麼問題,也就是放置什麼樣的判斷條件。這個判斷條件由兩部分組成:

還是拿上面那個例子來舉例,比如根結點用工資這個維度來劃分,閾值是1萬。那如果乙份工作的工資是2萬,大於閾值,這份工作就可以接受。

我們在構建決策樹時,就是在做這樣兩件事情:找到合適的決策維度,以及合適的閾值。能解決這兩個問題的方法很多,其中乙個方法就是利用資訊熵。

想一想我們利用決策樹究竟在做一件什麼事情。是不是在把一件原本非常不確定的事情,逐步劃分,直到得出乙個確定的分類結果。

一件事情的不確定程度,我們可以用資訊熵來表示。資訊熵越大,我們就認為這件事越不確定。所以構建決策樹的過程,就是資訊熵逐漸減少的過程。

資訊熵是資訊理論的乙個基礎概念,用數學公式表示如下:

公式的意思是,在某個事件中,有k種可能的結果,i是其中的一種,p指的是i發生的概率。我們對這個概率求一下log,然後再和這個概率本身相乘一下,得到的值,還得取一下負,最後把所有這樣的值(一共有k個),加在一起求個和,就是這個事件的資訊熵。

舉個例子:

左邊事件有三種可能性,每乙個都是三分之一的概率,它算出來的資訊熵是1.0986。右邊這個事件算出來的資訊熵是0.8018。右邊的資訊熵更小,所以右邊事件的確定性更高。事實上也是如此,右邊事件中有一種可能性的概率高達70%,這就比較確定了。

最確定的情況,則如下圖所示:

這種情況的資訊熵等於零,它的三種可能性中,第乙個可能性的概率為1,也就是百分之百發生。這就很確定了。

所以如果想讓資訊熵降低,其實就是把可能性往某一種分類結果上推。如果還不清楚,我們可以用二分類的問題來畫一張資訊熵的變化圖,直觀的看一下。

所謂二分類問題,就是事件只有兩種情況,其中一種情況的概率是x,那麼另一種情況的概率就是(1 - x),那資訊熵的計算公式就可以變成如下圖所示:

我們把x的概率從0.01取到0.99,就可以繪製出下面這張圖:

可以看出,x的概率在0.5的時候,資訊熵的值最大,也就是說當二分類問題五五開時,不確定度最高。所以當把概率向某一種可能性推的時候,資訊熵就會下降,直到某一種情況概率為1時,事件就確定了。

所以在利用資訊熵構建決策樹時,就是去比較每乙個判斷條件帶來的資訊熵遞減程度。選出導致資訊熵遞減程度最大的判斷條件,然後把它放到根結點的位置。接著重複執行這樣的步驟,直到構建出完整的決策樹為止。

決策樹 資訊熵增益

from math import log import operator defcreatedateset dataset 青年 否 否 一般 否 青年 否 否 好 否 青年 是 否 好 是 青年 是 是 一般 是 青年 否 否 一般 否 中年 否 否 一般 否 中年 否 否 好 否 中年 是 是 ...

決策樹資訊熵數理剖析

決策樹資訊熵數理剖析 資訊熵記錄拓展決策樹 張 極 2019年年3 月9日 假如有乙個集合為a 1,2,3,4,5 另 乙個集合為b 1,2,3,2,2,4 那麼我們對應的應該如何獲取兩個資料集的資訊熵呢,首先我們需要了了解資訊熵的 定義,在數學上,資訊熵作為資料集混亂程度的計算量化指標,我們獲得最...

決策樹 夏農熵

熵 entropy 是表示隨機變數不確定性的度量.所以熵越小越好 之所以po出來是因為裡面好多小函式自己找了好久 r語言用的人太少了 好痛苦 computing shannonent calshannonent function dataset t null shannonent 0 for i i...