《機器學習實戰》第三章 3 1 決策樹的構造

2021-08-13 17:47:58 字數 3764 閱讀 2676

《機器學習實戰》第三章 3.1 決策樹的構造

# -*- coding: utf-8 -*-

"""created on sat oct 28 09:57:29 2017

@author: xu li

"""#參考部落格

>

# coding=utf-8

# 缺點:可能會產生過度匹配問題

# 適用資料型別:數值型和標稱型

# 建立分支的偽**:

# 監測資料集的每乙個子項是否屬於同一類:

# if so return 類標籤

# else

# 尋找劃分資料集的最好特徵

# 劃分資料及

# 建立分支節點

# for 每個劃分的子集

# 呼叫createbranch並增加返回結果到分支節點中

# return 分支節點

# 標稱型:標稱型目標變數的結果只在有限目標集中取值,如真與假(標稱型目標變數主要用於分類)

# 數值型:數值型目標變數則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目標變數主要#用於回歸分析)

from math import log

import operator

defcreatedataset

(): dataset=[[1,1,'yes'],

[1,1,'yes'],

[1,0,'no'],

[0,1,'no'],

[0,1,'no']]

labels = ['no su***ceing','flippers']

return dataset, labels

#計算夏農熵

defcalcshannonent

(dataset):

numentries = len(dataset)

labelcounts = {}

for featvec in dataset:

currentlabel = featvec[-1]

if currentlabel not

in labelcounts:

labelcounts[currentlabel] = 0

labelcounts[currentlabel] += 1

shannonent = 0.0

for key in labelcounts:

prob = float(labelcounts[key])/numentries

shannonent -= prob * log(prob, 2)

return shannonent

#按照給定特徵劃分資料集

defsplitdataset

(dataset,axis,value):

retdataset =

#建立乙個新的列表

for featvec in dataset:

if featvec[axis] == value:

reducedfeatvec = featvec[:axis]

reducedfeatvec.extend(featvec[axis+1:])

return retdataset

#選擇最好的資料劃分方式

defchoosebestfeaturetosplit

(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

defmajoritycnt

(classlist):

classcount = {}

#字典for vote in classlist:

if vote not

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

# when the key votelabel is not in dictionary classcount, get()will return 0

classcount[vote] += 1

sortedclasscount = sorted(classcount.iteritems(),\

key = operator.itemgetter(1),reverse = true)

return sosortedclasscount[0][0]

#the max voted class will return

#建立樹的函式**

defcreatetree

(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

機器學習實戰 決策樹(三)

構造決策樹之後,將用於實際資料的分類。執行資料分類時需要使用決策樹以及用於構造決策樹的標籤向量。如下 該函式的inputtree是已經生成的決策樹,是字典集,featlabels是要測試的資料特徵的列表,testvec是與featlabels的特徵列表中對應的特徵值,注意位置需要對應。輸入形式如 c...

機器學習實戰 決策樹

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

機器學習實戰決策樹

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