1. 程式人生 > >決策樹-機器學習實戰h5三公平臺安裝

決策樹-機器學習實戰h5三公平臺安裝

set {} 樹形 www. www example import trie 分類

決策樹h5三公平臺安裝(h5.hxforum.com) 聯系方式170618633533企鵝2952777280 源碼出售 房卡出售 後臺出租有意者私聊扣扣
決策樹模型是一種描述對實例進行分類的樹形結構,決策樹由節點和有向邊組成,節點有兩種類型:內部節點和葉節點。內部節點表示一個特征或屬性,葉節點表示一個類。
??通常決策樹的學習包括3個步驟:特征選擇、決策樹的生成和決策樹的修剪。
??特征選擇:選取對訓練數據具有分類能力的特征
??通常的準則是信息增益或者信息增益比

  1. 信息增益

熵:表示隨機變量不確定性的度量。
??設X是一個取有限個值得離散隨機變量,其概率分布為:P(X=xi)=pi,i=1,2,...n, 則X的熵定義為:H(X)=?∑ni=1pilogpi。

熵越大,隨機變量的不確定性越大。
計算給定數據集的熵demo:

from math import log

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 createDataSet():
dataSet = [[1, 1, ‘yes‘], [1, 1, ‘yes‘], [1, 0, ‘no‘], [0, 1, ‘no‘], [0, 1, ‘no‘]]
labels = [‘no surfacing‘, ‘flippers‘]
return dataSet, labels

myDat,labels = createDataSet()

print calcShannonEnt(myDat)

輸出結果:
這裏寫圖片描述
條件熵:H(Y|X) 表示在已知隨機變量X的條件下隨機變量Y的不確定性。
H(Y|X)=?∑ni=1piH(Y|X=xi)。

信息增益: g(D,A)=H(D)?H(D|A)
??經驗熵 H(D) 表示對數據集D進行分類的不確定性,經驗條件熵H(D|A)表示在特征A給定的條件下對數據集D進行分類的不確定性。(http://yhgj8004.com) (http://www.yhgj8004.com) 兩者的差為信息增益,表示由於特征A而使得對數據集D的分類不確定減少的程度。

2.劃分數據集

??對每個特征劃分數據集的結果計算一次信息熵, 然後判斷按照哪個特征劃分數據集是最好的劃分方式

#按照給定的特征劃分數據集
def splitDataSet(dataSet, axis, value):
#新建list
retDataSet = []
for featVec in dataSet:
#抽取符合特征的數據
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet

註意:

Python語言不用考慮內存分配問題 。

Python語言在函數中傳遞的是列表的引用, 在函數內部對列表對象的修改, 將會影響該列表對象的整個生存周期。為了消除這個不良影響 ,我們需要在函數的開始聲明一個新列表對象。

list.extend()和 list.append()區別
這裏寫圖片描述
執行a.append(b)結果為包含4個元素的list,其中第4個元素也是一個list;
這裏寫圖片描述
執行a.extend(b)結果為包含6個元素的list.

??遍歷整個數據集,循環計算熵和splitDataSet函數,找到最好的特征劃分方式(信息增益最大的特征)。

#找到信息增益最大的特征
def chooseBestFeaToSplit(dataSet):
numFeas = len(dataSet[0])-1
#計算整個數據集的經驗熵
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeas = -1
#遍歷數據集中所有特征
for i in range(numFeas):
#數據集中第i個特征值寫入新的list
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
bestFeas = i
return bestFeas

結果返回第0個特征的信息增益最大:
這裏寫圖片描述

3.構建決策樹

由於特征值可能多於兩個,第一次劃分後數據被傳遞到樹分支的下一個節點,在這個節點上,再次劃分數據,采用遞歸的方式處理數據。
遞歸結束的條件是:遍歷完所有劃分數據集的屬性,或者每個分支下的所有實例都具有相同的分類,如果所有實例具有相同的分類,則得到一個葉子節點。如果數據集已經處理了所有的屬性,但是類標簽依然不唯一,通常采用多數表決方法決定葉子節點的分類。

#多數表決
def majorityCnt(classList):
classCount = {}
#記錄每個類標簽出現的頻率
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1
#排序字典
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
return sortedClassCount[0][0]

通過遞歸構決策樹:

#構造決策樹
def createTree(dataSet,labels):
#數據集所有類標簽的列表
classList = [example[-1] for example in dataSet]
#所有類標簽相同
if classList.count(classList[0]) == len(classList):
return classList[0]
#所有類標簽便利完成
if len(dataSet[0]) == 1:
return majorityCnt(classList)

bestFeat = chooseBestFeaToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
#樹的信息用字典存儲
myTree = {bestFeatLabel: {}}
del(labels[bestFeat])

featValues = [example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
#遍歷當前特征值包含的屬性值
for value in uniqueVals:
    #復制類標簽存儲在新list
    subLabels = labels[:]
    #遞歸
    myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,bestFeat,value),subLabels)
return myTree

返回嵌套字典:其中第一個關鍵字’no surfacing’是第一個劃分的特征,第二個關鍵字是’no surfacing’劃分的數據集,這些關鍵字的值為’no surfacing’的子節點,值有可能是類標簽,也有可能是一個數據字典。

決策樹-機器學習實戰h5三公平臺安裝