要理解決策樹演算法需要首先明確資訊增益及資訊熵的概念:
對於乙個分類集中的分類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...