機器學習筆記之資訊熵、資訊增益和決策樹(ID3演算法)

決策樹演算法:

優點:計算複雜度不高,輸出結果易於理解,對中間值的缺失不敏感,可以處理不相關的特徵資料。
缺點:可能會產生過度匹配問題。
適用資料型別:數值型和標稱型。
演算法原理:
決策樹是一個簡單的為輸入值選擇標籤的流程圖。這個流程圖由檢查特徵值的決策節點和分配標籤的子葉節點組成。為輸入值選擇標籤,我們以流程圖的初始決策節點(即根節點)開始。此節點包含一個條件,檢查輸入值的特徵之一,基於該特徵的值選擇一個分支。沿著這個描述我們輸入值的分支,我們到到了一個新的決策節點,有一個關於輸入值的特徵的新條件。我們繼續沿著每個節點的條件選擇的分支,直到到達葉節點,它為輸入值提供了一個標籤。
演算法流程:
收集資料:即建立訓練測試資料集。
準備資料:決策樹構造演算法只適用於標稱型資料,因此數值型資料必須是離散化的。
分析資料:建立構造數,構造樹完成後我們檢查圖形是否符合預期。
訓練資料:完善構造樹的資料結構。
測試資料:使用經驗樹計算。
使用演算法:對實際資料進行預測。
那麼問題來了我們是如何確定有多少個樹杈節點呢?這裡我們採用ID3演算法來構造決策樹。
ID3演算法:
ID3演算法(Iterative Dichotomiser 3,迭代二叉樹3代)是一種貪心演算法,用來構造決策樹。ID3演算法起源於概念學習系統(CLS),以資訊熵的下降速度為選取測試屬性的標準,即在每個節點選取還尚未被用來劃分的具有最高資訊增益的屬性作為劃分標準,然後繼續這個過程,直到生成的決策樹能完美分類訓練樣例。
為了實現ID3演算法我們還需要了解這個高富帥提出的三個概念:資訊、資訊熵和資訊增益。
那麼我們就需要認識認識一下這些概念的提出者美國高(高智商)富帥數學家夏農
克勞德·艾爾伍德·夏農(Claude Elwood Shannon ,1916年4月30日—2001年2月24日)是美國數學家、資訊理論的創始人。
這個帥哥提出了下面三個概念
  
    並且由上面的公式我們可以看出其實資訊熵就是資訊的期望值,所以我們可知,資訊熵越越小,資訊的純度越高,也就是資訊越少,在分類領域來講就是裡面包含的類別越少,所以我們可以得出,與初始資訊熵的差越大分類效果越好。
   下面我們來舉個例子:
    我一般買蘋果的時候,從外觀上評判一個蘋果甜不甜有兩個依據:紅不紅  和  圓不圓 (原諒我淺薄的挑蘋果經驗吧。。。)
         蘋果編號    紅不紅  圓不圓   甜不甜
               1               1         1           yes
               2               1         1           yes
               3               1         0           no
               4               0         1           no
               5               0         1           no
下面我來算一下啊這5個蘋果是不是好蘋果的資訊熵:
下面給出python求資訊熵的程式碼
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #資料集大小
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]   #獲取分類標籤
if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
labelCounts[currentLabel]  = 1  #每個類中資料個數統計
shannonEnt = 0.0
for key in labelCounts:  #資訊熵計算
prob = float(labelCounts[key])/numEntries
shannonEnt -= prob * log(prob,2) 
return shannonEnt

我們來用程式求一下我們這個小例子的結果:

和我們的筆算結果完全一致。。。
接下來我們要尋找怎麼分類比較好也就是決策樹的叉,我們的例子中可以按兩個方式分類,紅不紅和圓不圓。。到的按哪個分更好一點呢,這下就用到資訊增益了:
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1  #計算分類依據的個數
baseEntropy = calcShannonEnt(dataSet)   #計算原始分類的資訊熵
bestInfoGain = 0.0; bestFeature = -1
for i in range(numFeatures):    #對apple進行分類
featList = [example[i] for example in dataSet]
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:  #計算該種分類的資訊熵
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy  = prob * calcShannonEnt(subDataSet)     
infoGain = baseEntropy - newEntropy  #計算當前分類的資訊增益
if (infoGain > bestInfoGain):  #比較那種分類的資訊增益最大並返回
bestInfoGain = infoGain
bestFeature = i    
return bestFeature

按紅不紅分類的各項資料結果

我們可以看出,這種分類的資訊熵是0.5509775,它的資訊增益是0.419973
如果按照圓不圓來分類:

我們可以看出,這種分類的資訊熵是0.8,它的資訊增益是0.17095

顯然第一種分類的資訊增益較大
我們來看一下啊兩個劃分的結果集:
確實第一種方法劃分的較好。
這樣我們的決策樹也就構建好了: