構造決策樹之後,將用於實際資料的分類。執行資料分類時需要使用決策樹以及用於構造決策樹的標籤向量。**如下:
'''
該函式的inputtree是已經生成的決策樹,是字典集,featlabels是要測試的資料特徵的列表,
testvec是與featlabels的特徵列表中對應的特徵值,注意位置需要對應。
輸入形式如:classify(mytree,['no su***cing','flippers'],[1,0])
'''def classify(inputtree,featlabels,testvec):
firststr = list(inputtree.keys())[0]
#得到決策樹根節點對應的值分支字典
seconddict = inputtree[firststr]
#獲取根節點對應特徵名在特徵列表中的索引值
featindex = featlabels.index(firststr)
#遍歷特徵值字典的鍵
for key in seconddict.keys():
if testvec[featindex] == key:
#如果鍵對應的特徵值是字典則遞迴下一層
if type(seconddict[key]).__name__ == 'dict':
classlabel = classify(seconddict[key],featlabels,testvec)
else:
classlabel = seconddict[key]
return classlabel
注釋較為詳細,不多介紹,值得注意的是需要獲取根節點的特徵在特徵列表中的位置,然後在遍歷過程中需要判斷標籤值列表中的項是否和特徵的值是否相同,相同則繼續判斷是否繼續遞迴。最後返回葉子節點的值。另外需要注意後兩個列表引數的值對應關係。
構造決策樹很耗時,如果使用已經建立好的決策樹多次解決分類問題則會節省很多時間。為此使用了pickle模組來進行儲存。序列化物件可以在磁碟上儲存物件,並在需要時讀出來。任何物件都可以執行序列化操作,字典物件也不例外,關於該模組的具體資訊參考pickle。
#使用pickle模組儲存決策樹
def storetree(inputtree,filename):
import pickle
fw = open(filename,'wb')
pickle.dump(inputtree,fw)
fw.close()
def graptree(filename):
import pickle
fr = open(filename,'rb')
return pickle.load(fr)
filename是要儲存和讀取的檔名,在呼叫函式時進行指定。此外注意讀寫方式均為二進位制方式讀寫,否則無法寫進。
**眼鏡資料集包含了很多患者眼部狀況的觀察條件以及醫生的推薦眼鏡型別。
#使用決策樹****眼鏡型別
def predicteyes(filename):
import treeplotter
fr = open(filename)
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
lenseslabels = ['age','prescript','astigmatic','tearrate']
lensestree = createtree(lenses,lenseslabels)
print(lensestree)
treeplotter.createplot(lensestree)
fr.close()
得到的結果如下:
機器學習實戰 決策樹
決策樹 2 python語言在函式中傳遞的是列表的引用,在函式內部對列表物件的修改,將會影響該列表物件的整個生存週期。為了消除這個不良影響,我們需要在函式的開始宣告乙個新列表物件。在本節中,指的是在劃分資料集函式中,傳遞的引數dataset列表的引用,為了不影響dataset我們重新宣告了乙個ret...
機器學習實戰決策樹
這幾天一直在學習機器學習實戰python 實現,在程式清單的3 6 獲取及誒單數程式,書上的程式是這樣的 def getnumleafs mytree numleafs 0.0 firststr list dict.keys mytree 0 seconddict mytree firststr p...
機器學習實戰 決策樹
class sklearn.tree.decisiontreeclassifier criterion gini splitter best max depth none,min samples split 2,min samples leaf 1,min weight fraction leaf ...