按照給定特徵劃分資料集(當我們按照某個特徵劃分資料集時,就需要將所有符合要求的元素抽取出來)
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.決策樹的...