決策樹的ID3演算法實現

2021-09-29 21:52:47 字數 4857 閱讀 3162

下表是乙個有關挑選西瓜的經驗資料,其中分類屬性是d(是否好瓜)

編號 c1(色澤) c2(根蒂) c3(敲聲) c4(紋理) c5(臍部) c6(觸感) d(好瓜)

x1 青綠 蜷縮 濁響 清晰 凹陷 硬滑 是

x2 烏黑 蜷縮 沉悶 清晰 凹陷 硬滑 是

x3 烏黑 蜷縮 濁響 清晰 凹陷 硬滑 是

x4 青綠 蜷縮 沉悶 清晰 凹陷 硬滑 是

x5 淺白 蜷縮 濁響 清晰 凹陷 硬滑 是

x6 青綠 稍蜷 濁響 清晰 稍凹 軟粘 是

x7 烏黑 稍蜷 濁響 稍糊 稍凹 軟粘 是

x8 烏黑 稍蜷 濁響 清晰 稍凹 硬滑 是

x9 烏黑 稍蜷 沉悶 稍糊 稍凹 硬滑 否

x10 青綠 硬挺 清脆 清晰 平坦 軟粘 否

x11 淺白 硬挺 清脆 模糊 平坦 硬滑 否

x12 淺白 蜷縮 濁響 模糊 平坦 軟粘 否

x13 青綠 稍蜷 濁響 稍糊 凹陷 硬滑 否

x14 淺白 稍蜷 沉悶 稍糊 凹陷 硬滑 否

x15 烏黑 稍蜷 濁響 清晰 稍凹 軟粘 否

x16 淺白 蜷縮 濁響 模糊 平坦 硬滑 否

x17 青綠 蜷縮 沉悶 稍糊 稍凹 硬滑 否

以上述資料為訓練資料,採用id3演算法(利用資訊增益選擇屬性)構建一棵決策樹,寫出構建步驟。

演算法分析:

輸入:訓練集dataset(d),特徵集a

輸出:決策樹t

step1若訓練集dataset中所有例項屬於同一類 ,則t為單結點樹,並將類 作為該節點的類標記,返回t; ps:遞迴終止條件

step2:若a=ø,則t為單結點樹,並將d中例項數最大的類 作為該節點的類標記,返回t;ps:遞迴終止條件

step3:否則,計算a中n個特徵對d的資訊增益,選擇資訊增益最大的特徵 ,

並將其作為節點返回 t;

step4:如果 的資訊增益小於閾值ε,則t為單節點樹,並將訓練集dataset中例項數最大的類 作為該節點的類標記,返回t ps:無閾值則忽略,遞迴終止條件

(剪枝)

step5:否則,對 的每一種可能值 ,依 將d分割為若干非空子集 ,將 中例項數最大的類作為標記,構建子結點,由結點及其子樹構成樹t,返回t (剪枝)

step6:對第i個子節點,以 為訓練集,以 為特徵集合,遞迴呼叫step1~step5,得到子樹 ,返回 ;

python原始碼

from math import log

import operator

def calcshannonent(dataset): # 計算資料的熵(entropy)

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

for key in labelcounts:

prob = float(labelcounts[key])/numentries # 計算單個類的熵值

shannonent -= prob*log(prob, 2) # 累加每個類的熵值

return shannonent

def createdataset1(): # 創造示例資料

dataset = [[『青綠』, 『蜷縮』, 『濁響』, 『清晰』, 『凹陷』, 『硬滑』, 『是』],

[『烏黑』, 『蜷縮』, 『沉悶』, 『清晰』, 『凹陷』, 『硬滑』, 『是』],

[『烏黑』, 『蜷縮』, 『濁響』, 『清晰』, 『凹陷』, 『硬滑』, 『是』],

[『青綠』, 『蜷縮』, 『沉悶』, 『清晰』, 『凹陷』, 『硬滑』, 『是』],

[『淺白』, 『蜷縮』, 『濁響』, 『清晰』, 『凹陷』, 『硬滑』, 『是』],

[『青綠』, 『稍蜷』, 『濁響』, 『清晰』, 『稍凹』, 『軟粘』, 『是』],

[『烏黑』, 『稍蜷』, 『濁響』, 『稍糊』, 『稍凹』, 『軟粘』, 『是』],

[『烏黑』, 『稍蜷』,『濁響』, 『清晰』, 『稍凹』, 『硬滑』, 『是』],

[『烏黑』, 『稍蜷』, 『沉悶』, 『稍糊』, 『稍凹』, 『硬滑』, 『否』],

[『青綠』, 『硬挺』, 『清脆』, 『清晰』, 『平坦』, 『軟粘』, 『否』],

[『淺白』, 『硬挺』, 『清脆』, 『模糊』, 『平坦』, 『硬滑』, 『否』],

[『淺白』, 『蜷縮』, 『濁響』, 『模糊』, 『平坦』, 『軟粘』, 『否』],

[『青綠』, 『稍蜷』, 『濁響』, 『稍糊』, 『凹陷』, 『硬滑』, 『否』],

[『淺白』, 『稍蜷』, 『沉悶』, 『稍糊』, 『凹陷』, 『硬滑』, 『否』],

[『烏黑』, 『稍蜷』, 『濁響』, 『清晰』, 『稍凹』, 『軟粘』, 『否』],

[『淺白』, 『蜷縮』, 『濁響』, 『模糊』, 『平坦』, 『硬滑』, 『否』],

[『青綠』, 『蜷縮』, 『沉悶』, 『稍糊』, 『稍凹』, 『硬滑』, 『否』]

]labels = [『色澤』, 『根蒂』, 『敲聲』, 『紋理』, 『臍部』, 『觸感』] #6個特徵

return dataset, labels

def choosebestfeaturetosplit(dataset): # 選擇最優的分類特徵

numfeatures = len(dataset[0])-1

baseentropy = calcshannonent(dataset) # 原始的熵

bestinfogain = 0

bestfeature = -1

for i in range(numfeatures):

featlist = [example[i] for example in dataset]

uniquevals = set(featlist)

newentropy = 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

def majoritycnt(classlist): #按分類後類別數量排序,比如:最後分類為2男1女,則判定為男;

classcount={}

for vote in classlist:

if vote not in classcount.keys():

classcount[vote] = 0

classcount[vote] += 1

sortedclasscount = sorted(classcount.items(), 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

ifname== 『main』:

dataset, labels = createdataset1() # 創造示列資料

print(createtree(dataset, labels)) # 輸出決策樹模型結果

輸出結果

}}}, 『蜷縮』: 『是』}},

『稍糊』:

}}}例如:紋理模糊的是壞瓜。

紋理清晰,根蒂稍蜷,色澤青綠的是好瓜。

紋理清晰,根蒂稍蜷,色澤烏黑,觸感硬滑是好瓜

參考:

決策樹 ID3演算法

id3演算法通過計算每個屬性的資訊增益,認為資訊增益越大屬性越優,每次劃分選取資訊增益最大的屬性為劃分標準,重複這個過程,直到構成一棵決策樹。資訊熵是描述事件給我們的驚訝程度,如果所有事件的概率均等,那熵值大,驚訝程度低。如果有一事件的概率極高而其他極低,熵值便低,驚訝程度大。其計算公式如下 資訊增...

決策樹 ID3演算法

一 決策樹基本概念 在機器學習中,決策樹是乙個 模型,它代表的是物件屬性與物件值之間的一種對映關係。本質上決策樹是通 過一系列規則對資料進行分類的過程。下圖為經典決策樹例項。如圖所示,例項是由 屬性 值 對表示的 例項是用一系列固定的屬性和他們的值構成。目標函式具有離散的輸出值 上圖給每個例項賦予乙...

決策樹ID3演算法

typeerror dict keys object does not support indexing 9.typeerror dict keys object does not support indexing 這個問題是python版本的問題 如果使用的是python2 firststr my...