決策樹是一種通過對特徵屬性屬性分類對樣本進行分類的樹形結構,包括邊和三類節點
上面就是乙個簡單的二叉決策樹
決策樹學習本質就是對樣本總結乙個分類規則,既能對已知樣本進行合理的擬合分類,也能對未知樣本進行正確的分類**,這其中就有兩個關鍵:
在id3中,特徵屬性的選擇是由目標函式決定的,目標函式代表的是特徵屬性的混亂程度(也就是特徵屬性越混亂越不好分類,該特徵屬性的分類順序越靠後),這個目標函式就是資訊增益,資訊增益是由熵計算出來的:
熵:entropy(t)=−∑kp(ck|t)logp(ck|t)
資訊增益:
δ=h(c)−∑i=1nn(ai)nh(c|ai)
=h(c)−∑inp(ai)h(c|ai)
=h(c)−h(c|a)
其中h(c)表示父節點的熵值,h(c|a)表示該父節點下特徵屬性的熵的加權和
1.如果節點滿足停止**的條件,則將其設為葉節點;
2.如果節點不滿足停止**的條件,則選擇資訊增益最大的屬性**;
3.重複1-2動作直到分類完成
c4.5與id3的區別就是屬性的選擇條件為資訊增益比
# -*- coding=utf-8 -*-
"""author:xuwf
created:2017-2-10
purpose:實現決策樹演算法c4.5
"""from numpy import *
'''裝載文字'''
defload
(): data=loadtxt('d:/myproject/data/destree.txt',delimiter=',',dtype=str)
return data
'''熵計算'''
defcalcshan
(dataset):
rows=dataset.shape[0]
shannon=0.0
#熵值 datacount=datainfo(dataset)
for i in datacount:
temp=datacount[i]/float(rows) #計算概率
shannon-=temp*(log2(datacount[i])-log2(rows)) #計算熵
return shannon
'''統計資料'''
defdatainfo
(dataset):
info={}
for i in dataset:
info[i]=info.get(i,0)+1
#計算每個資料出現的次數(dict.get方法獲取)
return info
'''最大增益比計算'''
defcalcgain
(dataset):
rows,cols=dataset.shape
shan=calcshan(dataset[:,cols-1]) #計算總熵
shanpro=zeros(cols-1) #每個屬性的熵增益比
for i in range(cols-1):
datacount=datainfo(dataset[:,i])
for j in datacount.keys():
temp=datacount[j]/float(rows)
shanpro[i]+=temp*calcshan(dataset[dataset[:,i]==j,cols-1])
shanpro[i]=(shan-shanpro[i])/shan
return argsort(-shanpro)[0]
'''計算分支熵'''
defcalcshanbranch
(dataset,i):
rows,cols=dataset.shape
shanbranch={}
datacount=datainfo(dataset[:,i])
for j in datacount.keys():
shanbranch[j]=calcshan(dataset[dataset[:,i]==j,cols-1])
return shanbranch
'''建樹幹'''
defbuildtree
(dataset,label,tree):
sortratio=calcgain(dataset) #找出熵增益最大的那個下標,從這個下標開始分類
shanbranch=calcshanbranch(dataset,sortratio) #計算分支的熵,判斷是否為同一類
tree=}
for i in shanbranch.keys():
datanew=dataset[dataset[:,sortratio]==i,:]
datanew=datanew[:,dataset[0,:]!=dataset[0,sortratio]]
labelnew=label[label!=label[sortratio]]
if shanbranch[i]==0:
#如果分支的熵為0,說明該分支下的類別為同一類,該分支分類完成
tree[label[sortratio]][i]=dataset[dataset[:,sortratio]==i,-1][0]
else:
if label.shape[0]==2:
#如果到了最後的一組就返回資料
return tree
else:
#沒有到最後一組就繼續迴圈
tree[label[sortratio]][i]=buildtree(datanew,labelnew,tree)
return tree
'''主函式'''
defmain
(): data=load()
label=data[0,:]
data=data[1:,:]
tree={}
tree=buildtree(data,label,tree)
return tree
if __name__=='__main__':
main()
# -*- coding=utf-8 -*-
"""author:wfxu
create:2017-02-22
purpose:實現plt畫圖
"""import matplotlib.pyplot as plt
import destree
defcyc
(tree,x,y,coord,ax):
for i in tree:
x1=x #起點座標
y1=y
ax.text(x1,y1,i,fontsize=20,va='center',ha='center',bbox=dict(facecolor='red', alpha=0.5)) #起點
x2=x-1
#終點座標
y2=y-1
for j in tree[i]:
if (x2,y2) in coord:
x2+=1
ax.text((x1+x2)/2.0,(y1+y2)/2.0,j,fontsize=10,va='center',ha='center') #中間點
ax.arrow(x1,y1,x2-x1,y2-y1,width=0.05,length_includes_head=true,overhang=0.3,head_length=0.1)
#print (j,(x1+x2)/2.0,(y1+y2)/2.0),(tree[i][j],x2,y2)
x2+=1
if tree[i][j] in ('yes','no'):
#判斷有沒有屬性點重合的,如果有就向右移動一位
ax.text(x2-1,y2,tree[i][j],fontsize=20,va='center',ha='center',bbox=dict(facecolor='blue', alpha=0.5)) #終點
else:
cyc(tree[i][j],x2-1,y2,coord,ax)
defmain
(): fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot((5,1.5),(3.5,0.5),'b+')
tree=destree.main()
x=3y=3
coord=
cyc(tree,x,y,coord,ax)
fig.show()
if __name__=='__main__':
main()
決策樹效果
用plt畫的圖:
pyhton機器學習入門基礎(機器學習與決策樹)
scikit learn資料探勘工具包 1 scikit learn是基於python的資料探勘和機器學習的工具包 方便實現資料的資料分析與高階操作,是資料分析裡面非常重要的工具包。2 scikit learn是資料探勘重要的工具包,其官網為可以方便地進行進行相關用法的查詢。3 scikit lea...
機器學習 線性回歸python實踐 1
寫在最前面 線性回歸是機器學習最簡單的模型,用來尋找最佳擬合曲線。我曾經在數模比賽時用過,雖然只拿了省二。優點是 易於理解,計算簡單 缺點是 對於非線性的資料擬合效果不好 適用資料型別 數值型和標稱型資料 今天簡單介紹下最小二乘法 ordinary least squares 這是一組樣例資料的的散...
Python機器學習及實踐第一講 機器學習綜述
我們可以總結機器學習有以下特點 1.許多機器學習系統所解決都是無法直接使用固定規則或者流程 完成的問題,通常這類問題對於人來說十分簡單。比如電腦程式裡的計算方法都有著清晰固定的計算流程,不屬於具備智慧型的系統。但是如果要求一台機器去辨別一張 中的人或物體,機器就很難做到,但對人來說是一件很容易的任務...