機器學習 決策樹

2021-08-03 23:35:33 字數 4235 閱讀 4400

一、演算法簡介

決策樹一般都是自上而下來生成的,每個決策後事件(即自然狀態)都可能引出兩個或多個事件,導致結果的不同,把這種結構分支畫成形狀很像一棵樹的枝幹,故稱為決策樹。

決策樹能夠讀取資料集合,並且決策樹很多任務都是為了資料中所蘊含的知識資訊,因此決策樹可以使用不熟悉的資料集合,並從中提取一系列規則,機器學習演算法最終將使用這些機器從資料集中創造的規則。

決策樹就是將決策過程各個階段之間的結構繪製成一張箭線圖,我們可以用下圖來表示:

二、構成要素

決策樹由節點和有向邊組成,節點的型別有兩種,分別為內部節點和葉子節點,其中,內部節點表示乙個特徵或屬性的測試條件(用於分開具有不同特性的記錄),葉子節點表示乙個分類。

三、演算法思想

(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.決策樹學習三個...