文章原創(chuàng),最近更新:2018-08-19
本章節(jié)的主要內(nèi)容是:
重點(diǎn)介紹項(xiàng)目案例1:判定魚類和非魚類測(cè)試算法:測(cè)試和存儲(chǔ)分類器的代碼。
1.決策樹項(xiàng)目案例介紹:
項(xiàng)目案例1:
判定魚類和非魚類
項(xiàng)目概述:
- 根據(jù)以下 2 個(gè)特征,將動(dòng)物分成兩類:魚類和非魚類。
- 特征: 1. 不浮出水面是否可以生存 2. 是否有腳蹼
開發(fā)流程:
- 收集數(shù)據(jù):可以使用任何方法
- 準(zhǔn)備數(shù)據(jù):樹構(gòu)造算法只適用于標(biāo)稱型數(shù)據(jù),因此數(shù)值型數(shù)據(jù)必須離散化
- 分析數(shù)據(jù):可以使用任何方法,構(gòu)造樹完成之后,我們應(yīng)該檢查圖形是否符合預(yù)期
- 訓(xùn)練算法:構(gòu)造樹的數(shù)據(jù)結(jié)構(gòu)
- 測(cè)試算法:使用決策樹執(zhí)行分類
- 使用算法:此步驟可以適用于任何監(jiān)督學(xué)習(xí)算法,而使用決策樹可以更好地理解數(shù)據(jù)的內(nèi)在含義
數(shù)據(jù)集介紹

2.測(cè)試算法:使用決策樹執(zhí)行分類代碼
依靠訓(xùn)練數(shù)據(jù)構(gòu)造了決策樹之后,我們可以將它用于實(shí)際數(shù)據(jù)的分類。在執(zhí)行數(shù)據(jù)分類時(shí),需要決策樹以及用于決策樹的標(biāo)簽向量。然后,程序比較測(cè)試數(shù)據(jù)與決策樹上的數(shù)值,遞歸執(zhí)行該過程直到進(jìn)入葉子結(jié)點(diǎn);最后將測(cè)試數(shù)據(jù)定義為葉子結(jié)點(diǎn)所屬的類型。
使用決策樹分類的函數(shù):
def classify(inputTree, featLabels, testVec):
# 因?yàn)椴⒉恢腊刺卣鞣诸惖南群箜樞?,所以要寫一個(gè)分類器
"""classify(給輸入的節(jié)點(diǎn),進(jìn)行分類)
Args:
inputTree 是輸入的決策樹對(duì)象
featLabels Feature是我們要預(yù)測(cè)的特征值的label,如:['throat','mustache']
testVec 是要預(yù)測(cè)的特征值向量,如[0,0]
Returns:
classLabel 分類的結(jié)果值,需要映射label才能知道名稱
"""
# 存儲(chǔ)決策樹第一個(gè)節(jié)點(diǎn)
firstStr=list(inputTree.keys())[0]
"""
myTree={'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
labels=['no surfacing', 'flippers']
print(firstStr)的結(jié)果為:
'no surfacing'
"""
# 將第一個(gè)節(jié)點(diǎn)的值存到secondDict字典中
secondDict = inputTree[firstStr]
"""
print(secondDict)的結(jié)果為:
{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}
"""
# 判斷根節(jié)點(diǎn)名稱獲取根節(jié)點(diǎn)在label中的先后順序,這樣就知道輸入的testVec怎么開始對(duì)照樹來做分類
featIndex = featLabels.index(firstStr)
"""
print(featIndex)的結(jié)果為:
0
"""
for key in secondDict.keys():
"""
print(secondDict.keys())的結(jié)果為:
dict_keys([0, 1])
"""
if testVec[featIndex]==key:
# 判斷分枝是否結(jié)束:判斷secondDict[key]是否是dict類型,如果是就遞歸,不是就輸出當(dāng)前鍵值為結(jié)果
if type(secondDict[key]).__name__ == 'dict':
classLabel = classify(secondDict[key], featLabels, testVec)
else:
classLabel = secondDict[key]
return classLabel
測(cè)試代碼以及結(jié)果如下:
import trees
myDat, labels = trees.createDataSet()
myTree = trees.createTree(myDat, labels[:])
Out[35]: trees.classify(myTree, labels, [1, 0])
'no'
Out[36]: trees.classify(myTree, labels, [1, 1])
'yes'
3.使用算法:決策樹的存儲(chǔ)
可以使用Python模塊pickle序列化對(duì)象,參見下面的程序。序列化對(duì)象可以在磁盤上保存對(duì)象,并在需要的時(shí)候讀取出來。
def storeTree(inputTree,filename):
import pickle
# wb二進(jìn)制寫模式
fw = open(filename,"wb")
pickle.dump(inputTree,fw)
fw.close()
def grabTree(filename):
import pickle
# rb二進(jìn)制文件讀取
fr=open(filename,"rb")
return pickle.load(fr)
測(cè)試代碼及其結(jié)果如下:
import trees
myDat, labels = trees.createDataSet()
myTree = trees.createTree(myDat, labels[:])
storeTree(myTree,'classifierStorage.txt')
grabTree('classifierStorage.txt')
Out[51]: {'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}
4.相關(guān)知識(shí)點(diǎn)
知識(shí)點(diǎn)1:dict.keys()
具體語法如下:
dict.keys()
- 參數(shù):NA。
- 返回值:返回一個(gè)字典所有的鍵。
具體案例如下:
dict = {'Name': 'Zara', 'Age': 7}
dict.keys()
Out[20]: dict_keys(['Name', 'Age'])
知識(shí)點(diǎn)2:_name_
_name_:表示模塊,類等的名字;
知識(shí)點(diǎn)3:pickle
學(xué)習(xí)參考鏈接:pickle 保存數(shù)據(jù)
pickle 保存
pickle 是一個(gè) python 中, 壓縮/保存/提取 文件的模塊. 最一般的使用方式非常簡(jiǎn)單. 比如下面就是壓縮并保存一個(gè)字典的方式. 字典和列表都是能被保存的.
import pickle
a_dict = {'da': 111, 2: [23,1,4], '23': {1:2,'d':'sad'}}
# pickle a variable to a file
file = open('pickle_example.pickle', 'wb')
pickle.dump(a_dict, file)
file.close()
wb 是以寫的形式打開 ‘pickle_example.pickle’ 這個(gè)文件, 然后 pickle.dump 你要保存的東西去這個(gè)打開的 file. 最后關(guān)閉 file 你就會(huì)發(fā)現(xiàn)你的文件目錄里多了一個(gè) ‘pickle_example.pickle’ 文件, 這就是那個(gè)字典了.
pickle 提取
提取的時(shí)候相對(duì)簡(jiǎn)單點(diǎn), 同樣我們以讀的形式打開那個(gè)文件, 然后 load 進(jìn)一個(gè) python 的變量.
# reload a file to a variable
with open('pickle_example.pickle', 'rb') as file:
a_dict1 =pickle.load(file)
print(a_dict1)
知識(shí)點(diǎn)4:list.index(obj)
學(xué)習(xí)參考鏈接:list.index(obj)
從列表中找出某個(gè)值第一個(gè)匹配項(xiàng)的索引位置
index()方法語法:
list.index(obj)
- 參數(shù):obj -- 查找的對(duì)象。
- 返回值:該方法返回查找對(duì)象的索引位置,如果沒有找到對(duì)象則拋出異常。
具體小案例如下:
aList = [123, 'xyz', 'zara', 'abc']
aList.index('xyz')
Out[53]: 1
aList.index(123)
Out[54]: 0