Python機器學習演算法實踐 決策樹(ID3)

2021-07-27 10:36:49 字數 4480 閱讀 7993

決策樹是一種通過對特徵屬性屬性分類對樣本進行分類的樹形結構,包括邊和三類節點

上面就是乙個簡單的二叉決策樹

決策樹學習本質就是對樣本總結乙個分類規則,既能對已知樣本進行合理的擬合分類,也能對未知樣本進行正確的分類**,這其中就有兩個關鍵:

在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.許多機器學習系統所解決都是無法直接使用固定規則或者流程 完成的問題,通常這類問題對於人來說十分簡單。比如電腦程式裡的計算方法都有著清晰固定的計算流程,不屬於具備智慧型的系統。但是如果要求一台機器去辨別一張 中的人或物體,機器就很難做到,但對人來說是一件很容易的任務...