我的《機器學習實戰》讀書筆記(2)

我是綠色大米呀發表於2017-11-20

在對資料進行分類的時候,如何判斷演算法A的分類結果和演算法B的分類結果哪個結果更優?
可以使用“夏農熵”。其公式如下:

圖1.png
圖1.png

計算出來的數值H越大,代表分類越不準確。用Python的實現如下:

from math import log

# 結果數值越大,說明資料集約雜亂(有其他分類混進來)
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    # 建立一個字典,記錄各個型別的出現的次數,dataset的最後一列是型別
    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複製程式碼

其中featVec[-1]是取最後一個值。假設我們通過某種演算法,把下面的5條資料分成了一類,明顯‘yes’和‘no’混在了一起,但是我們也要給這種分類‘打個分’,即夏農熵。注意,dataSet的最後一列是代表著該條資料的型別。

圖2.png
圖2.png

夏農熵的計算公式中與dataSet中前兩列的‘0’,‘1’沒有關係。只是單純的計算‘yes’佔40%,‘no’佔60%,這就是公式中的p(xi)。然後做log2計算,然後把它們的負值加在一起。
上圖的資料計算結果是:0.9709505944546686
如果資料是:
圖3.png
圖3.png

計算結果是:0.7219280948873623
數值變小了,說明分類結果更好了。
如果資料是:
圖4.png
圖4.png

計算結果是:1.5219280948873621
數值更大了,說明分類更不準確了,也就是所使用的分類演算法效果不好。
當然最完美的資料是:
圖5.png
圖5.png

期計算結果應該比之前所有結果都小,是:0.0

相關文章