一、前言
本節(jié)我們將使用決策樹構建分類器萄涯,并將其應用到隱形眼鏡類型預測的實際問題中陈肛,最后研究分類分類器的存儲問題妄帘。
二楞黄、使用決策樹執(zhí)行分類
'''
函數(shù)說明:構造使用決策樹的分類函數(shù)
參數(shù):inputTree -- 輸入的決策樹
featLabels -- 數(shù)據(jù)集屬性
testVec -- 需要預測類別的節(jié)點
返回值:預測節(jié)點的類別
'''
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
dataSet,labels = createDataSet()
# print(classify(mytree,labels,[1,1]))
預測結(jié)果為:
現(xiàn)在我們已經(jīng)根據(jù)決策樹構造出了分類器,但每次使用分類器時抡驼,必須重新構造決策樹鬼廓,因此,我們考慮將決策樹分類器存儲起來致盟。
三碎税、決策樹的存儲
'''
函數(shù)說明:決策樹分類器的存儲
參數(shù):inputTree -- 決策樹
filename -- 文件名
返回值:無
'''
#決策樹的存儲
#寫
def storeTree(inputTree,filename):
import pickle
fw = open(filename,'wb') #b代表二進制形式,因為pickl要求二進制形式
pickle.dump(inputTree,fw)
fw.close()
#讀
def grabTree(filename):
import pickle
fr = open(filename,'rb') #以二進制形式存馏锡,故以二進制形式取
return pickle.load(fr)
# storeTree(mytree,'classifierStorage.txt')
# print(grabTree('classifierStorage.txt'))
決策樹的存儲:
決策樹的讀闰悸肌:
四、決策樹實戰(zhàn)之隱形眼鏡類型預測
本節(jié)我們將根據(jù)一個例子講解決策樹如何預測患者應該佩戴的隱形眼鏡類型眷篇。
首先我們先加載數(shù)據(jù)集 lenses.txt
# 加載隱形眼鏡數(shù)據(jù)集,并將其序列化荔泳,最后生成決策樹
fr = open('D:/py_work/data/chapter3-tree/lenses.txt')
lenses = [inst.strip().split('\t') for inst in fr.readlines()]
# 年齡蕉饼、癥狀、是否散光玛歌、眼淚數(shù)量四個屬性
lensesLabels = ['age','prescript','astigmatic','tearRate','type']
# 根據(jù)隱形眼鏡的數(shù)據(jù)集和屬性標簽構造決策樹
lensesTree = createTree(lenses,lensesLabels)
print(lensesTree)
執(zhí)行結(jié)果:
五昧港、結(jié)語
決策樹分類器就像帶有終止塊的流程圖,終止塊就代表分類結(jié)果支子。對于待處理數(shù)據(jù)创肥,我們首先需要測量集合中數(shù)據(jù)的不一致性,即熵;然后再根據(jù)每個屬性對數(shù)據(jù)集進行劃分并計算劃分后的數(shù)據(jù)集的熵叹侄,得到使得數(shù)據(jù)集信息增益最大的劃分屬性巩搏;根據(jù)步驟二得到?jīng)Q策樹字典;最后使用 matlibplot 的注解功能趾代,將決策樹字典轉(zhuǎn)換為容易理解的樹形圖贯底。