算法思想
- 從數據集中找到一個特征,這個特征在劃分數據分類中起決定性作用.為了找到這個特征,就要評估每個特征,找到區分度對好的呢個特征,將數據集分開.
- 劃分數據集之前,之后信息發生的變化成為信息增益.每個特征劃分數據獲取的信息增益,越大的,表示區分效果越好
信息增益(Information Gain)
- 熵定義為信息的期望值. 越不確定的事件的信息熵越大,因為一定的事情沒有信息量
(地球繞著太陽轉)
得了解的信息論基本概念
自信息量:一個事件(消息)本身所包含的信息量,由事件的不確定性決定的。
隨機事件Xi發生概率為P(xi),則隨機事件的自信息量定義為:
自信息量計算公式
信息熵(Entropy):隨機變量自信息量I(xi)的數學期望(平均自信息量),用H(X)表示,即為熵的定義:
信息熵計算公式
動手實踐
2票同意,3票不同意
同意的占40%,不同意的占60%,此時信息熵是0.970
將一個同意改為不確定的時候
{yes:2,no:3} -> {yes:1,not sure:1,no:3}
同意的占20%,不確定的占20%,不同意的占60%,此時信息熵是1.370
劃分數據集
通過計算信息熵,可以衡量數據的無序程度
現在要計算,通過每個特征值劃分后的數據集的信息熵,然后判斷那個特征劃分后的數據集
選取信息熵最大的特征值,這相當于讓剩下是數據更具確定性
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
featList = [example[i] for example in dataSet] # 每一列的值,即一個feature所有的數據
print featList
uniqueVals = set(featList)
print uniqueVals
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet,i,value)
print "subDataSet : %s" % subDataSet
prob = len(subDataSet)/float(len(dataSet))
print "prob : %f" % prob
print "calcShannonEnt: %f" % calcShannonEnt(subDataSet)
newEntropy += prob * calcShannonEnt(subDataSet)
print "new entropy : %f" % newEntropy
infoGain = baseEntropy - newEntropy
print "infoGain : %f" % infoGain
if (infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
動手實現一遍
原始數據
Paste_Image.png
處理為屬性和標簽的形式
Paste_Image.png
計算該矩陣對應的基準信息熵(Base Entropy) = 0.97
算法開始
1.選取特征A
Paste_Image.png
2.選取特征B
Paste_Image.png
3.因為IG(A) = 0.42 > IG(B) = 0.17,所以對數據集最具有區分度的特征為第0個特征A.以此為依據構建決策樹
Paste_Image.png
決策樹最終狀態
Paste_Image.png