機器學習實戰之決策樹

2021-07-29 20:16:24 字數 2005 閱讀 9209

在《機器學習實戰》決策樹這一章的時候,有些地方的**有點看不太懂,看了幾篇部落格,還是未解。最後仔細看書,發現自己不懂資料集的組織方式。希望大家看的時候也注意一下。在決策樹函式呼叫的資料要滿足如下要求:

1、資料必須是由列表元素組成的列表,所有的列表元素都要具有相同的資料長度;

2、資料(也就是資料集中的例項)的最後一列或者每個例項的最後乙個元素是當前例項的類別標籤。

滿足如上要求,就可以在資料集的第一行判定當前資料報包含多少特徵屬性。

from math import log

def calshannonent(dataset):

numentries = len(dataset)

labelcounts = {}

for featvec in dataset:

currentlabel = featvec[-1]

if currentlabel not in labelcounts.keys():

labelcounts[currentlabel] = 0

else:

labelcounts[currentlabel] += 1

shannonent = 0.0

for key in labelcounts:

prob = float(labelcounts[key])/numentries

shannonent -= prob*log(prob,2)

return shannonent

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 splitdataset(dataset,axis,value):

retdataset =

for featvec in dataset:

if featvec[axis]==value:

reducedfeatvec = featvec[:axis]

reducedfeatvec.extend(featvec[axis+1:])#等價於刪除featvec[axis],提取剩下的部分

return retdataset

def choosebestfeaturetosplit(dataset):

numfeatures = len(dataset[0])-1 #特徵值數量,因為資料例項的最後乙個元素是當前例項的類別標籤

baseentropy = calshannonent(dataset) # 計算整個資料集的熵

bestinfogain = 0.0;bestfeature = -1 #初始化最好的資訊增益為0.0,最好的劃分資料集的特徵為-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*calshannonent(subdataset)

infogain = baseentropy-newentropy

if(infogain>bestinfogain):

bestinfogain = infogain

bestfeature = i

return bestfeature

機器學習實戰之決策樹

1.熵 entropy h s 用來測量乙個資料集s的不確定程度。h s x x p x log2 p x s 待計算熵的資料集,在id3演算法的每次迭代中會改變 x s中類別的集合 p x 屬於類別x的元素站集合s中總元素的比例 h s 0 集合s 被完全分到乙個類中。在id3中,對每乙個屬性熵,...

機器學習實戰之決策樹

1 演算法概述 1.1 結構分析 決策樹是一種依託決策而建立起來的樹,其中,每乙個內部節點表示乙個屬性上的測試,每乙個分支代表乙個測試的結果輸出,每乙個葉子代表一種類別。如上圖所示就是乙個決策樹,首先分析所給資料集是否為同一類別,如果是,那就不用劃分了,如果不是,就尋找劃分資料集最好的特徵進行劃分 ...

機器學習實戰 決策樹

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