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