Quo的隨手筆記之決策樹

2021-10-07 18:19:12 字數 4549 閱讀 4594

決策樹是一種監督學習演算法,之前大火的小愛同學猜人名就是用這樣的演算法實現,通過不停的詢問,即不停的分類,最終到無法進行分類的時候就鎖定了結果。現實中有諸多應用,比如植物、動物的分類,本部落格中的決策樹分類方法叫做id3,除此之外主流決策樹演算法還有cart和c4.5等

具體定義請參考:

目標:為了分辨一種物種是否為魚類,實驗人員收集了一組資料,希望能夠從中找出分類的依據,幫忙判斷新的物種是否能被認為是魚類。

資料集如下鱗片鰭

是否是魚類有有

是有有是

無有否有

無否無有

否1計算熵,**如下

// by quo &peter harrington

from math import log

import operator

#計算熵

defcalculateentropy

(dataset)

: numentries=

len(dataset)

labelcounts=

#對於結構性資料進行分類的數目統計

for featvec in dataset :

#對於每一行的最後一列資料進行類別的統計

currentlabel=featvec[-1

]if currentlabel not

in labelcounts:

labelcounts[currentlabel]=0

labelcounts[currentlabel]+=1

entropy=

0for key in labelcounts:

#本選項被選擇的概率

prob=

float

(labelcounts[key]

)/numentries

#對於每一項不重複的key進行熵的求和(因為分數進行對數運算之後是負數,所以就是求減)

entropy= entropy-prob*log(prob,2)

return entropy

defcreatedateset()

:#構建初始資料

dataset=[[

1,1,

'yes'],

[1,1

,'yes'],

[1,0

,'no'],

[0,1

,'no'],

[0,1

,'no']]

labels =

['no su***cing'

,'flippers'

]return dataset,labels

2.選取最優熵

因為不同維度的分類的熵是不一樣的,所以我們需要選出熵最大的進行優先篩選,**如下

#選擇最好的分類方式

defchoosebestfeature2split

(dataset)

: numfeatures=

len(dataset[0]

)-1 baseentropy=calculateentropy(dataset)

bestinfogain=

0 bestfeature=

0for i in

range

(numfeatures)

:#分別對每一列進行分類操作之後求資訊期望值,

featlist=

[example[i]

for example in dataset]

#取得第i列的資料變成乙個list

uniquevalues=

set(featlist)

#去重 得到值域

newentropy=

0for value in uniquevalues:

subdataset=splitdataset(dataset,i,value)

prob=

len(subdataset)

/float

(len

(dataset)

) newentropy=newentropy+prob*calculateentropy(subdataset)

#以上為計算資訊期望值的公式,即每乙個選項被選中的概率乘以熵的總和

infogain=baseentropy-newentropy

if(infogain >bestinfogain)

: baseentropy=infogain

bestfeature=i

#以上為判斷大小,資訊期望值越大,就代表是更好的資料集的劃分方式

return bestfeature

#返回的為列的標號

對單條件進行分類

即得到最優解的標號之後,拿出此列作為分類依據並在資料集中去除此列,以便於下次分類

#用以去除每一行中特定列符合要求的值

defsplitdataset

(dataset,axis,value)

: result=

for featvec in dataset:

if featvec[axis]

==value:

reducedfeatvec=featvec[

:axis]

reducedfeatvec.extend(featvec[axis+1:

])return result

當分類到最後乙個分支之後,還不能夠將資料進行統一的分類,則返回剩下資料的頻率比表示其可能性。

#用來對list中元素出現的頻率進行排序

defmajoritycnt

(classlist)

: classcount=

for vote in classlist:

if vote not

in classcount.keys():

classcount[vote]=0

classcount[vote]+=1

sortedclasscount=

sorted

(classcount.items(

),key=operator.itemgetter(1)

,reverse=

true

)return sortedclasscount[0]

[0]

構造樹,核心思想為,首先計算傳入矩陣的不同維度的熵,取熵最大的一列資料並進行樹結構的構造,根據取值來決定分支個數,然後去除本列資料,將剩餘的矩陣進行遞迴處理,直至得到乙個不可再分的矩陣並返回其樹結構。

python**如下:

// by quo&peter harrington

from math import log

import operator

# 決策樹**例項

defcreatetree

(dataset,labels)

: classlist=

[example[-1

]for example in dataset]

#取最後一列為list

if classlist.count(classlist[0]

)==len(classlist)

:#如果第一行在資料中一直反覆出現(即沒有進行再次分類的必要了),則返回第一行

return classlist[0]

iflen

(dataset[0]

)==1:

#用來標識遍歷結束時返回最多出現的類別

return majoritycnt(classlist)

bestfeature=choosebestfeature2split(dataset)

bestfeatlabel=labels[bestfeature]

# 獲取最高資訊期望值的分類位置,和對應的標籤

mytree=

}#得到標籤之後構建樹

del(labels[bestfeature]

)#刪除已使用的標籤

featvalues=

[example[bestfeature]

for example in dataset]

#提出最合適的分類列

uniquevals=

set(featvalues)

#去重,提取值域

for value in uniquevals:

sublabels=labels[:]

mytree[bestfeatlabel]

[value]

=createtree(splitdataset(dataset,bestfeature,value)

,sublabels)

#對於每乙個值域中的值,樹結構中新建結構

# 即對於和value匹配的資料,刪除已用作分類的bestfeatlabel之後的結構

return mytree

mydata,label=createdateset(

)print

(createtree(mydata,label)

)

隨手筆記之VC 七

tcp udp ip 協議 應用層 處理網路應用 表示層 資料表示 會話層 主機間的通訊 傳輸層 端到端的鏈結 tcp udp 網路層 定址和最短路勁 ip 資料鏈路層 介質訪問 物理層 二進位制傳輸 telnet 遠端登入協議。ftp 檔案傳輸協議 http 超文字傳輸協議 dns 網域名稱服務 ...

決策樹筆記

決策樹學習的常用演算法有id3 c4.5與cart。其中id3特徵選擇的準則是資訊增益,c4.5的是資訊增益率,cart是基尼指數。熵 entropy 介紹資訊增益之前需要先引入熵的概念 熵表示的是隨機變數的不確定性程度,表示式為 其中pi表示離散變數x取xi的概率。log一般以2和e為底。而熵越大...

SparkDataSource的隨手筆記分享

真的只是個隨手筆記。記錄下一些操作過程。最近需要實現一些spark邏輯計畫和物理計畫的優化,遂打算寫一點簡單的資料來源來測試。突然想到了oracle常見的scott tiger裡的資料。遂打算使用該資料。畢竟裝oracle是個大工程,沒有必要為了做個測試單獨安裝乙個oracle,於是用docker,...