下表是乙個有關挑選西瓜的經驗資料,其中分類屬性是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...