0417學習筆記 3 1決策樹的構造 劃分資料集

2021-08-18 22:38:55 字數 3950 閱讀 7596

按照給定特徵劃分資料集(當我們按照某個特徵劃分資料集時,就需要將所有符合要求的元素抽取出來)

def splitdataset(dataset, axis, value): #建立新的list物件(為了不修改原始資料集)

retdataset =

for featvec in dataset:

if featvec[axis] == value: #抽取符合特徵的資料

reducedfeatvec = featvec[:axis]

reducedfeatvec.extend(featvec[axis+1:])

return retdataset

a=[1,2,3]

b=[4,5,6]

a》[1, 2, 3, [4, 5, 6]] #第四個元素也是個列表

a=[1,2,3]

a.extend(b)

a》[1, 2, 3, 4, 5, 6]

測試函式:

p38選擇最好的資料集劃分方式

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] #建立新列表

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

測試:

p39after度量資訊熵,有效劃分資料集,

then將這些函式功能放一起,構建決策樹

3.1.3遞迴構建決策樹

import operator
def majoritycnt(classlist):

classcount={} #用來儲存classlist中每個類標籤出現的頻率

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 = choosebestfeaturetosplit(dataset) #存當前資料集選取的最好特徵

bestfeatlabel = labels[bestfeat]

mytree = } #得到列表的所有屬性值

del(labels[bestfeat])

featvalues = [example[bestfeat] for example in dataset]

uniquevals = set(featvalues)

for value in uniquevals:

sublabels = labels[:] #複製類標籤

mytree[bestfeatlabel][value] = createtree(splitdataset\

(dataset, bestfeat, value),sublabels)

return mytree

3.2繪製樹形圖

31.matplotlib註解工具:annotations

使用文字註解繪製樹節點

# author:j.kong

import matplotlib.pyplot as plt

decisionnode = dict(boxstyle="sawtooth", fc="0.8") #定義文字框和箭頭格式

leafnode = dict(boxstyle="round4", fc="0.8") #

arrow_args = dict(arrowstyle="

def plotnode(nodetxt, centerpt, parentpt, nodetype): #執行實際的繪圖功能,繪製帶箭頭的注釋

createplot.ax1.annotate(nodetxt, xy=parentpt,xycoords='axes fraction',

xytext=centerpt, textcoords='axes fraction',

va="center", ha="center", bbox=nodetype, arrowprops=arrow_args)

def createplot(): #建立新圖形並清空繪圖區,並畫兩個代表不同型別的樹節點

fig = plt.figure(1, facecolor='white')

fig.clf()

createplot.ax1 = plt.subplot(111, frameon=false)

plotnode('a decision node', (0.5, 0.1), (0.1, 0.5), decisionnode) #決策節點

plotnode('a leaf node', (0.8, 0.1), (0.3, 0.8), leafnode) #葉節點

plt.show()

測試結果:

3.2.2構造註解樹

我們要知道葉節點的數量-確定x軸長度-getnumleafs()

樹有多少層-確定y軸高度-gettreedepth()

3 1 決策樹演算法

什麼是決策樹 判定樹 decision tree 判定樹是乙個類似於流程圖的樹結構 其中,每個內部結點表示在乙個屬性上的測試,每個分支代表乙個屬性輸出,而每個樹葉結點代表類或類分布。樹的最頂層是根結點。機器學習中分類方法中的乙個重要演算法 構造決策樹的基本演算法 3.1 熵 entropy 概念 資...

3 1決策樹演算法

0.機器學習中分類和 演算法的評估 準確性,速度,強壯性,可規模性,課解釋性。1.什麼是決策樹 判定樹 decision tree 判定樹是乙個類似於流程圖的樹結構 其中,每個內部結點表示在乙個屬性上的測試,每個分支代表乙個屬性輸出,而每個樹葉結點代表類或類分布。樹的最頂層是根結點。3.構造決策樹的...

決策樹學習筆記

模型 監督學習中的分類演算法 決策樹演算法的思路 利用樹的結構,將資料集中的特徵 屬性 劃分為樹中的分支節點 資料集中類別標籤對應樹的葉節點。構建決策樹的三要素 1.特徵選擇 資訊熵或資訊增益gini係數來選擇特徵 2.決策樹的生成 id3演算法 資訊增益 c4.5演算法 gini係數 3.決策樹的...