機器學習實戰 筆記二 決策樹

2021-07-07 05:23:20 字數 2407 閱讀 3154

要理解決策樹演算法需要首先明確資訊增益及資訊熵的概念:

對於乙個分類集中的分類xi,其熵為 l(

xi)=

−log

2p(x

i)對於所有類別的資訊熵總和: h=

−∑ni

=1p(

xi)l

og2p

(xi)

計算夏農熵的函式:

from math import log

defcalcshannonent

(dataset):

numentries = len(dataset) #類別個數

labelcount = {}

for featvec in dataset: #對每一條資料

currentlabel = featvec[-1] #currentlabel為當前資料的類別

if currentlabel not

in labelcount.keys(): #計數

labelcount[currentlabel] = 0

labelcount[currentlabel] += 1

shannonent = 0.0

for key in labelcount.keys():

prob = float(labelcount[key]) / float(numentries)

shannonent -= prob * float(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

a= [1,2,3]

a .extend(b)

[1, 2, 3, 4, 5, 6]

選擇最佳資料集劃分方式:

def

choosebestfeaturetosplit

(dataset):

numfeatures = len(dataset[0]) - 1

#屬性個數,需要減去最後一列的類別

baseentropy = calcshannonent(dataset)

bestinfogain = 0.0

bestfeture = -1

for i in range(numfeatures):

featlist = [example[i] for example in dataset] 取出屬性列中的所有屬性值

uniquevals = set(featlist) #set函式建立乙個無重複項的集合

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 > newentropy):

bestinfogain = infogain

bestfeture = i

return bestfeture

使用要求:

選擇出現最多類別:

def

majoritycnt

(classlist):

classcount = {}

for vote in classlist:

if vote not

in classcount.keys():classcount[vote] = 0

classcount[vote] += 1

sortedclasscount = sorted(classcount.iteritems(),

key = operator.itemgetter(1), reverse=true) #注意sorted函式的用法

return sortedclasscount[0][0]

sorted函式及operator.itemgetter函式的用法詳解

機器學習實戰筆記二 決策樹

決策樹例項,決策樹優點 缺點 可能會產生過度匹配問題 適用資料型別 數值型和標稱型 決策樹一般流程 1 收集資料 2 準備資料 3 分析資料 4 訓練資料 5 測試資料 6 使用演算法 from numpy import import operator from os import listdir ...

機器學習實戰 決策樹

決策樹 2 python語言在函式中傳遞的是列表的引用,在函式內部對列表物件的修改,將會影響該列表物件的整個生存週期。為了消除這個不良影響,我們需要在函式的開始宣告乙個新列表物件。在本節中,指的是在劃分資料集函式中,傳遞的引數dataset列表的引用,為了不影響dataset我們重新宣告了乙個ret...

機器學習實戰決策樹

這幾天一直在學習機器學習實戰python 實現,在程式清單的3 6 獲取及誒單數程式,書上的程式是這樣的 def getnumleafs mytree numleafs 0.0 firststr list dict.keys mytree 0 seconddict mytree firststr p...