一、演算法簡介
決策樹一般都是自上而下來生成的,每個決策後事件(即自然狀態)都可能引出兩個或多個事件,導致結果的不同,把這種結構分支畫成形狀很像一棵樹的枝幹,故稱為決策樹。
決策樹能夠讀取資料集合,並且決策樹很多任務都是為了資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取一系列規則,機器學習演算法最終將使用這些機器從資料集中創造的規則。
決策樹就是將決策過程各個階段之間的結構繪製成一張箭線圖,我們可以用下圖來表示:
二、構成要素
決策樹由節點和有向邊組成,節點的型別有兩種,分別為內部節點和葉子節點,其中,內部節點表示乙個特徵或屬性的測試條件(用於分開具有不同特性的記錄),葉子節點表示乙個分類。
三、演算法思想
(1)樹以代表訓練的樣本的單個節點開始
(2)如果樣本都在同乙個類,則該節點成為樹葉,並用該類標記
(3)否則,演算法選擇最有分類能力的屬性作為決策樹的當前節點
(4)根據當前節點屬性取值的不同,將訓練樣本資料集分為若干子集,每個取值形成乙個分支,有幾個取值形成幾個分支,一旦乙個屬性出現在乙個節點上,就不必在該節點的任何衍生子集在考慮它。
(5)遞迴劃分步驟僅當下列條件之一成立時停止:
沒有剩餘屬性可以用來進一步劃分樣本,在這種情況下,使用多數表決,將給定的節點轉換成樹葉,並以樣本中元組個數最多的類別作為類別標記,同時也可以存放該節點樣本的類別分布
現在我們已經大致了解決策樹可以完成哪些任務,接下來我們將學習如何從一堆原始資料中構造決策樹。
四、資訊理論基礎
(1)熵:熵度量了事物的不確定性,越不確定的事物,它的熵就越大。具體的,隨機變數x的熵的表示式如下:
其中n代表x的n種不同的離散取值。而pi代表了x取值為i的概率,log為以2為底的對數。
舉個例子,比如x有2個可能的取值,而這兩個取值各為1/2時
(2)條件熵:它度量了我們的x在知道y以後剩下的不確定性,表示式如下:
(3)特徵增益:資訊增益特徵選擇中的乙個重要指標,它定義為乙個特徵能夠為分類系統帶來多少資訊,帶來的資訊越多,該特徵越重要,表示式如下:
h(x) - h(x|y)
五、**詳情
from math import log
import operator
def createdataset():
dataset =[[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']]
labels = ['no su***cing','flippers']
return dataset,labels
def calcshannonent(dataset):
numentries = len(dataset)
lablecounts = {}
for featvec in dataset:
currentlable = featvec[-1]
if currentlable not in lablecounts.keys():
lablecounts[currentlable] = 0
lablecounts[currentlable] += 1
shannonent = 0
for key in lablecounts:
prob = float(lablecounts[key])/numentries
shannonent -= prob * log(prob,2)
return shannonent
def splitdataset(dataset,axis,value):
retdataset =
for featvec in dataset:
if featvec[axis] == value:
reducedfeatvec = featvec[:axis]
reducedfeatvec.extend(featvec[axis+1:])
return retdataset
def choosebestfeaturetosplit(dataset):
numfeatures = len(dataset[0]) - 1#因為資料集的最後一項是標籤
baseentropy = calcshannonent(dataset)
bestinfogain = 0.0
bestfeature = -1
for i in range(numfeatures):
featlist = [example[i] for example in dataset]
uniquevals = set(featlist)
newentropy = 0.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):
classcount = {}
for vote in classlist:
if vote not in classcount.keys():
classcount[vote] = 0
classcount[vote] += 1
return max(classcount)
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
def main():
data,label = createdataset()
mytree = createtree(data,label)
print mytree
if __name__=='__main__':
main()
六、輸出結果
}}}
七、演算法小結
決策樹分類器就像帶有終止塊的流程圖,終止塊表示分類結果。開始處理資料時,我們首先需要測量集合中資料的不一致性,也就是熵,然後尋找最優方案劃分資料集,直到資料集中的所有資料屬於同一分類。id3演算法可以用於劃分標稱型資料集。構建決策樹時,我們通常採用遞迴的方法將資料集轉化為決策樹。
有很多構建決策樹的方法,包括id3、c4.5、cart等,這裡我用的是id3演算法。
機器學習 決策樹
一 基本概念 決策樹 decision tree 是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示屬於特徵對例項進行分類的過程,它可以認為是if then規則的集合,也可以認為是電議在特徵空間與類空空上的條件概率分布,其主要優點是模型具有可讀性,分類速度快。決策樹的學習通常包括3...
機器學習 決策樹
我覺得決策樹是機器學習所有演算法中最可愛的了 沒有那麼多複雜的數學公式哈哈 下圖是一棵決策樹,用來判斷西瓜是好瓜還是壞瓜 決策過程中提出的每個判定問題都是都對某個屬性的測試,每個測試結果要麼推導出最終結論,要麼匯出進一步判斷的問題,在上次決策結果限定的範圍內做進一步判斷。從上圖可以看出,葉節點對應決...
機器學習 決策樹
一 理論 ref3 chapter 9 ref1 chapter 4 1.總是搞不清幾種決策樹的名字 名字 劃分選擇 id3 資訊增益 c4.5 增益率 與id3類似,校正了id3偏向於選擇取值較多的特徵的問題 cart 基尼係數 學的是二叉樹,用於 回歸 如最小二乘回歸樹 分類 2.決策樹學習三個...