3-6節(jié) 決策樹|測(cè)試和存儲(chǔ)分類器|機(jī)器學(xué)習(xí)實(shí)戰(zhàn)-學(xué)習(xí)筆記

文章原創(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第 3 章 決策樹 [TOC] 本章內(nèi)容 決策樹簡(jiǎn)介 在數(shù)據(jù)集中度量一致性 使用遞歸構(gòu)造決策樹 使用 Matplo...
    涼秋_不見春暖閱讀 1,711評(píng)論 1 3
  • 文/黃小妞 最近在讀《曾國潘家書》,被曾國潘的教子之道深受感染。 他在多封寫給孩子的信中提到:“勤苦節(jié)儉,早晨早起...
    黃小妞兒閱讀 1,239評(píng)論 0 4
  • 劉小超 出了景洪市,車程30分鐘;經(jīng)過一段蜿蜒曲折的山路,便來到了猴山上的傣王宮。這里是傣族文化的發(fā)...
    燕牛牛閱讀 628評(píng)論 0 0
  • 去了凸透鏡他咯樓……起來了
    28ebb773035e閱讀 273評(píng)論 0 0
  • 盡管這世界有種種快樂,但我總覺得如果缺少了"書香"之樂,精神家園將會(huì)怎樣的黯淡? 文字是一朵朵蓓...
    字花閱讀 301評(píng)論 0 0

友情鏈接更多精彩內(nèi)容