在對資料進行分類的時候,如何判斷演算法A的分類結果和演算法B的分類結果哪個結果更優?
可以使用“夏農熵”。其公式如下:
計算出來的數值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的最後一列是代表著該條資料的型別。
夏農熵的計算公式中與dataSet中前兩列的‘0’,‘1’沒有關係。只是單純的計算‘yes’佔40%,‘no’佔60%,這就是公式中的p(xi)。然後做log2計算,然後把它們的負值加在一起。
上圖的資料計算結果是:0.9709505944546686
如果資料是:
計算結果是:0.7219280948873623
數值變小了,說明分類結果更好了。
如果資料是:
計算結果是:1.5219280948873621
數值更大了,說明分類更不準確了,也就是所使用的分類演算法效果不好。
當然最完美的資料是:
期計算結果應該比之前所有結果都小,是:0.0