您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)python決策樹算法怎么實(shí)現(xiàn),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
1、步驟
計(jì)算數(shù)據(jù)集S中的每個(gè)屬性的熵 H(xi)
選取數(shù)據(jù)集S中熵值最小(或者信息增益最大,兩者等價(jià))的屬性
在決策樹上生成該屬性節(jié)點(diǎn)
使用剩余結(jié)點(diǎn)重復(fù)以上步驟生成決策樹的屬性節(jié)點(diǎn)
2、實(shí)例
import numpy as np import math from collections import Counter # 創(chuàng)建數(shù)據(jù) def create_data(): X1 = np.random.rand(50, 1)*100 X2 = np.random.rand(50, 1)*100 X3 = np.random.rand(50, 1)*100 def f(x): return 2 if x > 70 else 1 if x > 40 else 0 y = X1 + X2 + X3 Y = y > 150 Y = Y + 0 r = map(f, X1) X1 = list(r) r = map(f, X2) X2 = list(r) r = map(f, X3) X3 = list(r) x = np.c_[X1, X2, X3, Y] return x, ['courseA', 'courseB', 'courseC'] # 計(jì)算集合信息熵的函數(shù) def calculate_info_entropy(dataset): n = len(dataset) # 我們用Counter統(tǒng)計(jì)一下Y的數(shù)量 labels = Counter(dataset[:, -1]) entropy = 0.0 # 套用信息熵公式 for k, v in labels.items(): prob = v / n entropy -= prob * math.log(prob, 2) return entropy # 實(shí)現(xiàn)拆分函數(shù) def split_dataset(dataset, idx): # idx是要拆分的特征下標(biāo) splitData = defaultdict(list) for data in dataset: # 這里刪除了idx這個(gè)特征的取值,因?yàn)橛貌坏搅? splitData[data[idx]].append(np.delete(data, idx)) return list(splitData.values()), list(splitData.keys()) # 實(shí)現(xiàn)特征的選擇函數(shù) def choose_feature_to_split(dataset): n = len(dataset[0])-1 m = len(dataset) # 切分之前的信息熵 entropy = calculate_info_entropy(dataset) bestGain = 0.0 feature = -1 for i in range(n): # 根據(jù)特征i切分 split_data, _ = split_dataset(dataset, i) new_entropy = 0.0 # 計(jì)算切分后的信息熵 for data in split_data: prob = len(data) / m new_entropy += prob * calculate_info_entropy(data) # 獲取信息增益 gain = entropy - new_entropy if gain > bestGain: bestGain = gain feature = i return feature # 決策樹創(chuàng)建函數(shù) def create_decision_tree(dataset, feature_names): dataset = np.array(dataset) counter = Counter(dataset[:, -1]) # 如果數(shù)據(jù)集值剩下了一類,直接返回 if len(counter) == 1: return dataset[0, -1] # 如果所有特征都已經(jīng)切分完了,也直接返回 if len(dataset[0]) == 1: return counter.most_common(1)[0][0] # 尋找最佳切分的特征 fidx = choose_feature_to_split(dataset) fname = feature_names[fidx] node = {fname: {}} feature_names.remove(fname) # 遞歸調(diào)用,對每一個(gè)切分出來的取值遞歸建樹 split_data, vals = split_dataset(dataset, fidx) for data, val in zip(split_data, vals): node[fname][val] = create_decision_tree(data, feature_names[:]) return node # 決策樹節(jié)點(diǎn)預(yù)測函數(shù) def classify(node, feature_names, data): # 獲取當(dāng)前節(jié)點(diǎn)判斷的特征 key = list(node.keys())[0] node = node[key] idx = feature_names.index(key) # 根據(jù)特征進(jìn)行遞歸 pred = None for key in node: # 找到了對應(yīng)的分叉 if data[idx] == key: # 如果再往下依然還有子樹,那么則遞歸,否則返回結(jié)果 if isinstance(node[key], dict): pred = classify(node[key], feature_names, data) else: pred = node[key] # 如果沒有對應(yīng)的分叉,則找到一個(gè)分叉返回 if pred is None: for key in node: if not isinstance(node[key], dict): pred = node[key] break return pred
python常用的庫:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。
關(guān)于“python決策樹算法怎么實(shí)現(xiàn)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。