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

決策樹圖像化顯示及剪枝

1.決策樹可視化

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

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:
        # 得到每個分支的寬度
        w1 = get_width(tree.fb) * 100
        w2 = get_width(tree.tb) * 100

        # 確定此節(jié)點所要占據(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é)點
        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))

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


決策樹

2.決策樹的剪枝

為了避免過擬合,需要對決策樹進行剪枝,如果對某個節(jié)點分類后的子節(jié)點信息增益小于給定閾值,則不進行細化。

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

    # 如果兩個子分支都是葉子節(jié)點,則判斷它們是否需要合并
    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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 決策樹理論在決策樹理論中,有這樣一句話,“用較少的東西,照樣可以做很好的事情。越是小的決策樹,越優(yōu)于大的決策樹”。...
    制杖灶灶閱讀 6,073評論 0 25
  • 決策樹模型與學(xué)習(xí) 決策樹模型 分類決策樹模型是一種描述對實例進行分類的樹形結(jié)構(gòu)。決策樹由結(jié)點和有向邊組成。結(jié)點有兩...
    文子軒閱讀 1,737評論 0 3
  • 今天我們常說“牌品看人品”,葉嘉瑩說“觀人于揖讓,不若觀人于游戲”。為什么會這么說呢?因為一個人在揖讓進退的時候,...
    冷蘭子閱讀 1,952評論 0 0
  • 佳麗,我本就沒說要怎么樣,也沒想麻煩你們,我說了是我又犯傻了,這個男的不說話一點事兒沒有,不過你現(xiàn)在真讓我刮目相看...
    修得一顆恒定心閱讀 216評論 0 0
  • 官方安裝方法 centos7 安裝方法 添加如下信息 啟動關(guān)閉重啟 配置信息 語法規(guī)則: 匹配規(guī)則與順序 例子,有...
    citystar閱讀 203評論 0 0

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