親手實(shí)現(xiàn)決策樹(二)

決策樹圖像化顯示及剪枝

1.決策樹可視化

在上一節(jié)(親手實(shí)現(xiàn)決策樹(一))中婆誓,我們利用print_tree進(jìn)行了文字輸出決策樹:

3:21?
T->0:google?
  T->{'Premium': 3}
  F->{'Basic': 3}
F->2:yes?
  T->0:slashdot?
    T->{'None': 2}
    F->{'Basic': 3}
  F->{'None': 4}

下面將介紹如何圖形化顯示決策樹

def draw_tree(tree, jpeg='tree.jpeg'):
    w = get_width(tree) * 100
    h = get_depth(tree) * 100 + 120

    img = Image.new('RGB', (w,h), color=(255, 255, 255))
    draw = ImageDraw.Draw(img)

    draw_node(draw, tree, w/2, 20)
    img.save(jpeg, 'JPEG')

利用到的輔助函數(shù)get_width如下:

def get_width(tree):
    if tree.tb is None and tree.fb is None:
        return 1
    return get_width(tree.tb) + get_width(tree.fb)

利用到的輔助函數(shù)get_depth如下:

def get_depth(tree):
    if tree.tb is None and tree.fb is None:
        return 0
    return max(get_depth(tree.tb), get_width(tree.fb)) + 1

利用到的輔助函數(shù)draw_node如下:

def draw_node(draw, tree, x, y):
    if tree.results is None:
        # 得到每個(gè)分支的寬度
        w1 = get_width(tree.fb) * 100
        w2 = get_width(tree.tb) * 100

        # 確定此節(jié)點(diǎn)所要占據(jù)的總空間
        left = x - (w1 + w2) / 2
        right = x + (w1 + w2) / 2

        # 繪制判斷條件字符串
        draw.text((x-20, y-10), str(tree.col) + ":" + str(tree.value), (0, 0, 0))

        # 繪制到分支的連線
        draw.line((x, y, left + w1/2, y + 100), fill=(255, 0, 0))
        draw.line((x, y, right - w2/2, y + 100), fill=(255, 0, 0))

        # 繪制分支的節(jié)點(diǎn)
        draw_node(draw, tree.fb, left+w1/2, y+100)
        draw_node(draw, tree.tb, right-w2/2, y+100)
    else:
        txt = ' \n'.join(['%s:%d' % v for v in tree.results.items()])
        draw.text((x - 20, y), txt, (0, 0, 0))

畫出來(lái)的結(jié)果為:


決策樹

2.決策樹的剪枝

為了避免過(guò)擬合,需要對(duì)決策樹進(jìn)行剪枝选浑,如果對(duì)某個(gè)節(jié)點(diǎn)分類后的子節(jié)點(diǎn)信息增益小于給定閾值,則不進(jìn)行細(xì)化抡谐。

def prune(tree, min_gain):
    # 如果分支不是葉節(jié)點(diǎn)嗅辣,則對(duì)其進(jìn)行剪枝操作
    if tree.tb.results is None:
        prune(tree.tb, min_gain)
    if tree.tb.results is None:
        predict(tree.fb, min_gain)

    # 如果兩個(gè)子分支都是葉子節(jié)點(diǎn),則判斷它們是否需要合并
    if tree.tb.results is not None and tree.fb.results is not None:
        # 構(gòu)造合并后的數(shù)據(jù)集
        tb, fb = [], []
        for v, c in tree.tb.results.items():
            tb += [[v]] * c
        for v, c in tree.tb.results.items():
            fb += [[v]] * c

        # 檢查熵的減少情況
        delta = entropy(tb + fb) - (entropy(tb) + entropy(fb))/2
        if delta < min_gain:
            # 合并分支
            tree.tb, tree.fb = None, None
            tree.results = unique_counts(tb + fb)

剪枝后的結(jié)果如下:

剪枝后的決策樹
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冷离,一起剝皮案震驚了整個(gè)濱河市吵冒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酒朵,老刑警劉巖桦锄,帶你破解...
    沈念sama閱讀 212,294評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔫耽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)留夜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門匙铡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碍粥,你說(shuō)我怎么就攤上這事鳖眼。” “怎么了嚼摩?”我有些...
    開封第一講書人閱讀 157,790評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵钦讳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我枕面,道長(zhǎng)愿卒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評(píng)論 1 284
  • 正文 為了忘掉前任潮秘,我火速辦了婚禮琼开,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枕荞。我一直安慰自己柜候,他們只是感情好搞动,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渣刷,像睡著了一般鹦肿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辅柴,一...
    開封第一講書人閱讀 49,906評(píng)論 1 290
  • 那天箩溃,我揣著相機(jī)與錄音,去河邊找鬼碌识。 笑死碾篡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的筏餐。 我是一名探鬼主播开泽,決...
    沈念sama閱讀 39,053評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魁瞪!你這毒婦竟也來(lái)了穆律?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤导俘,失蹤者是張志新(化名)和其女友劉穎峦耘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旅薄,經(jīng)...
    沈念sama閱讀 44,250評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辅髓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了少梁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洛口。...
    茶點(diǎn)故事閱讀 38,711評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凯沪,靈堂內(nèi)的尸體忽然破棺而出第焰,到底是詐尸還是另有隱情,我是刑警寧澤妨马,帶...
    沈念sama閱讀 34,388評(píng)論 4 332
  • 正文 年R本政府宣布挺举,位于F島的核電站,受9級(jí)特大地震影響烘跺,放射性物質(zhì)發(fā)生泄漏湘纵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評(píng)論 3 316
  • 文/蒙蒙 一液荸、第九天 我趴在偏房一處隱蔽的房頂上張望瞻佛。 院中可真熱鬧,春花似錦、人聲如沸伤柄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)适刀。三九已至秤朗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笔喉,已是汗流浹背取视。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留常挚,地道東北人作谭。 一個(gè)月前我還...
    沈念sama閱讀 46,461評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奄毡,于是被迫代替她去往敵國(guó)和親折欠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 決策樹理論在決策樹理論中吼过,有這樣一句話锐秦,“用較少的東西,照樣可以做很好的事情盗忱。越是小的決策樹酱床,越優(yōu)于大的決策樹”。...
    制杖灶灶閱讀 5,840評(píng)論 0 25
  • 決策樹模型與學(xué)習(xí) 決策樹模型 分類決策樹模型是一種描述對(duì)實(shí)例進(jìn)行分類的樹形結(jié)構(gòu)趟佃。決策樹由結(jié)點(diǎn)和有向邊組成扇谣。結(jié)點(diǎn)有兩...
    文子軒閱讀 1,622評(píng)論 0 3
  • 今天我們常說(shuō)“牌品看人品”,葉嘉瑩說(shuō)“觀人于揖讓闲昭,不若觀人于游戲”揍堕。為什么會(huì)這么說(shuō)呢?因?yàn)橐粋€(gè)人在揖讓進(jìn)退的時(shí)候汤纸,...
    冷蘭子閱讀 1,737評(píng)論 0 0
  • 佳麗,我本就沒(méi)說(shuō)要怎么樣芹血,也沒(méi)想麻煩你們贮泞,我說(shuō)了是我又犯傻了,這個(gè)男的不說(shuō)話一點(diǎn)事兒沒(méi)有幔烛,不過(guò)你現(xiàn)在真讓我刮目相看...
    修得一顆恒定心閱讀 181評(píng)論 0 0
  • 官方安裝方法 centos7 安裝方法 添加如下信息 啟動(dòng)關(guān)閉重啟 配置信息 語(yǔ)法規(guī)則: 匹配規(guī)則與順序 例子啃擦,有...
    citystar閱讀 176評(píng)論 0 0