資料探勘 Python實現ID3演算法

2021-08-01 19:42:46 字數 3370 閱讀 1934

import math

defcreatedataset

(): dataset = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]#資料集的最後一列稱作value,label稱作attr

labels = ['no su***cing', 'flippers']

return dataset, labels

defcreatetree

(dataset, labels):

values = [value[-1] for value in dataset]# 獲取當前資料集的value

if values.count(values[0]) == len(values):#樹的葉子節點是同乙個類別的資料

return values[0]

if len(dataset[0]) == 1:#所有屬性都用完

return select(values)

labelno = calmaxgain(dataset)# 獲取本次要使用的label編號

label = labels[labelno] # 獲取本次要使用的label

del (labels[labelno]) # 刪除本次使用的label

allnewset = splitdataset(dataset, labelno)

tree = }

for newdataset in allnewset.items():#原資料集已被拆分,newdataset[0]是allnewset的key,newdataset[1]是value

tree[label][newdataset[0]]=createtree(newdataset[1],labels)

return tree

defsplitdataset

(dataset, labelno):

'''根據所選屬性,將資料集拆分成多個新資料集,返回值為字典,包含所有的新資料集:key為被拆分的屬性值,value為拆分的新資料集'''

values=[value[labelno] for value in dataset]

uniqueval=list(set(values))

allnewset={}

for i in range(len(uniqueval)):

newdataset =

for data in dataset:

if(data[labelno]==uniqueval[i]):

newline=data[:labelno]

newline=newline+data[labelno+1:]#製作新資料集中的一行資料

allnewset[uniqueval[i]]=newdataset

return allnewset

defselect

(list):

'''選擇出現次數最多的value'''

dict = {}

values = set(list)

for val in values:

#計算每種value的數量

dict[val] = list.count(val)

sortdict = sorted(dict.items(), key=lambda item: item[1], reverse=true)# 根據value的數量進行排序

return sortdict[0][0] # 返回字典中第乙個key的value值

defcalinfo

(dataset):

'''計算info(t)'''

values = [value[-1] for value in dataset]

uniqueval = set(values)

prob =

for val in uniqueval:

#計算p

return cali(prob)

defcali

(prob):

'''計算i'''

i = 0.0

for p in prob:

if p != 0: # p=0時不能計算log

i += -p * math.log(p, 2)

return i

defcalattrinfo

(dataset, label):

'''計算info(attr,t)'''

attr = [value[label] for value in dataset]

values = [value[-1] for value in dataset]

uniqueattr = set(attr)

uniqueval = set(values)

family = * len(uniqueattr)# 每個類別的yes和no集合

pattr = * len(uniqueattr)# 每個類別yes和no的prob

pt = # 每種類別的prob

for j in uniqueattr:

#遍歷屬性的全部類別

for i in range(len(attr)):

#根據屬性類別分割values

if j == attr[i]:

family[j] = family[j] + [values[i]]

for val in uniqueval:

pattr[j] = pattr[j] + [family[j].count(val) / float(len(family[j]))]

i =

for p in pattr:

#計算i

info = 0

for j in range(len(pt)):

info += pt[j] * i[j]

return info

defcalmaxgain

(dataset):

'''返回當前擁有最大gian的label'''

infot = calinfo(dataset)

gain = {}

for i in range(len(dataset[0]) - 1):

gain[i] = infot - calattrinfo(dataset, i)

sortgain = sorted(gain.items(), key=lambda item: item[1], reverse=true)#選取最大gain

return sortgain[0][0]

dataset, labels = createdataset()

print(createtree(dataset, labels))

輸出決策樹

}}}

ID3演算法的Python實現

本篇文章的 是在 id3演算法的原理及實現 python 的基礎上進行新增和修改實現的,感謝原作者。1 新增的功能 1 拆分檔案,使得函式的呼叫更加清晰 2 增加了gui,增加了資料的讀取和 功能 3 增加了乙個遞迴終止條件 2 gui介面展示 以檔案中給出的資料集為例,填充如下 注 這裡類標籤的位...

用python實現ID3演算法

coding utf 8 from math import log import operator 資料樣本 編號 用腮呼吸 是否有腳蹼 屬於魚類 1 是 是 是 2 是 否 是 3 是 否 否 4 否 是 否 5 否 是 否 def createdataset dataset 1,1,yes 1,...

資料探勘演算法 決策樹ID3演算法

id3演算法是一種分類 演算法,其核心思想是 資訊熵 id3演算法通過計算每個屬性的資訊增益,認為資訊增益高的是好屬性,每次劃分選取資訊增益最高的屬性為劃分標準,重複這個過程,直至生成乙個能完美分類訓練樣例的決策樹。該決策樹方法先根據訓練集資料形成決策樹,如果該樹不能對所有物件給出正確地分類那麼選擇...