決策樹算法是在已知各種情況發(fā)生概率的基礎上,通過構成決策樹來求取凈現(xiàn)值的期望值大于等于零的概率,評價項目風險,判斷其可行性的決策分析方法。
分類算法是利用訓練樣本集獲得分類函數即分類模型(分類器),從而實現(xiàn)將數據集中的樣本劃分到各個類中。分類模型通過學習訓練樣本中屬性集與類別之間的潛在關系,并以此為依據對新樣本屬于哪一類進行預測。
決策樹算法是直觀運用概率分析的一種圖解法,是一種十分常用的分類方法,屬于有監(jiān)督學習。
決策樹是一種樹形結構,其中每個內部結點表示在一個屬性上的測試,每個分支代表一個測試輸出,每個葉子結點代表一種類別。
決策樹學習是以實例為基礎的歸納學習,它采用自頂向下的遞歸方法,其基本思想是以信息熵為度量構造一顆熵值下降最快的樹,到葉子結點處的熵值為零,此時每個葉子節(jié)點中的實例都屬于同一類。
決策樹學習算法的最大優(yōu)點是,它可以自學習,在學習的過程中不需要使用者了解過多的背景知識,只需要對訓練實例進行較好的標注,就能夠進行學習。
ID3算法
C4.5算法
C5.0算法
CART算法
在機器學習中,決策樹是一種預測模型,它代表的是對象屬性與對象值之間的一種映射關系。
決策樹的目的是擬合一個可以通過指定輸入值預測最終輸出值得模型。
描述
分析
計算
結論
選擇屬性是構建一顆決策樹非常關鍵的一步,被選擇的屬性會成為決策樹的一個節(jié)點,并且不斷遞歸地選擇最優(yōu)的屬性就可以最終構建決策樹。
計算數據集S中的每個屬性的熵 H(xi)選取數據集S中熵值最?。ɑ蛘咝畔⒃鲆孀畲?,兩者等價)的屬性在決策樹上生成該屬性節(jié)點使用剩余結點重復以上步驟生成決策樹的屬性節(jié)點
熵
1948年,香農提出了“信息熵”的概念,熵是接收的每條信息中所包含信息的平均量,是不確定性的量度,而不是確定性的量度,因為越隨機的信源的熵越大。熵被定義為概率分布的對數的相反數。
信息熵的公式:
信息增益
“信息增益”是用來衡量一個屬性區(qū)分數據樣本的能力,當使用某一個屬性作為一棵決策樹的根節(jié)點時,該屬性的信息增益量就越大。決策樹會選擇最大化信息增益來對結點進行劃分。
import numpy as np import math from collections import Counter # 創(chuàng)建數據 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'] # 計算集合信息熵的函數 def calculate_info_entropy(dataset): n = len(dataset) # 我們用Counter統(tǒng)計一下Y的數量 labels = Counter(dataset[:, -1]) entropy = 0.0 # 套用信息熵公式 for k, v in labels.items(): prob = v / n entropy -= prob * math.log(prob, 2) return entropy # 實現(xiàn)拆分函數 def split_dataset(dataset, idx): # idx是要拆分的特征下標 splitData = defaultdict(list) for data in dataset: # 這里刪除了idx這個特征的取值,因為用不到了 splitData[data[idx]].append(np.delete(data, idx)) return list(splitData.values()), list(splitData.keys()) # 實現(xiàn)特征的選擇函數 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): # 根據特征i切分 split_data, _ = split_dataset(dataset, i) new_entropy = 0.0 # 計算切分后的信息熵 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)建函數 def create_decision_tree(dataset, feature_names): dataset = np.array(dataset) counter = Counter(dataset[:, -1]) # 如果數據集值剩下了一類,直接返回 if len(counter) == 1: return dataset[0, -1] # 如果所有特征都已經切分完了,也直接返回 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) # 遞歸調用,對每一個切分出來的取值遞歸建樹 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é)點預測函數 def classify(node, feature_names, data): # 獲取當前節(jié)點判斷的特征 key = list(node.keys())[0] node = node[key] idx = feature_names.index(key) # 根據特征進行遞歸 pred = None for key in node: # 找到了對應的分叉 if data[idx] == key: # 如果再往下依然還有子樹,那么則遞歸,否則返回結果 if isinstance(node[key], dict): pred = classify(node[key], feature_names, data) else: pred = node[key] # 如果沒有對應的分叉,則找到一個分叉返回 if pred is None: for key in node: if not isinstance(node[key], dict): pred = node[key] break return pred
優(yōu)點:小規(guī)模數據集有效
缺點
決策樹算法是一種非常經典的算法,其訓練過程中主要依靠獲得數據間的熵及信息增益作為劃分依據,分類效果較好。但一般情況下我們訓練決策樹均是在數據量較小的數據集進行,當訓練分類器所用的訓練數據足夠大時,決策樹會出現(xiàn)樹身過高、擬合效果差等問題。因此,如何高效準確的構建決策樹成為模式識別領域的一項研究熱點。
使用增量訓練的方式迭代訓練決策樹
融合Bagging與Boosting技術訓練多棵決策樹
對于波動不大、方差較小的數據集, 可以探尋一種比較穩(wěn)定的分裂準則作為解決辦法
到此這篇關于Python機器學習算法之決策樹算法的文章就介紹到這了,更多相關Python決策樹算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!