decision tree

ID3 C4.5 CART 比較

ID3(以信息增益為準(zhǔn)則選擇信息增益最大的屬性)

  • 缺點(diǎn)
  1. 信息增益對(duì)==可取值數(shù)目較多的屬性==有所偏好,比如通過(guò)ID號(hào)可將每個(gè)樣本分成一類,但是沒(méi)有意義逢渔。(具體原因請(qǐng)查信息增益的數(shù)學(xué)公式)
  2. ID3只能對(duì)離散屬性(標(biāo)稱型數(shù)據(jù))的數(shù)據(jù)集構(gòu)造決策樹(shù),即只能應(yīng)用于分類問(wèn)題。
  3. ID3對(duì)缺失值敏感

C.5(以信息增益率為準(zhǔn)則選擇信息增益率最大的屬性)

  • 對(duì)ID3的改進(jìn)
  1. 對(duì)于離散值處理與ID3一致宽闲;可以處理連續(xù)數(shù)值型屬性,方法:
  2. C4.5可以允許變量存在缺失值握牧,會(huì)把缺失值單獨(dú)作為一類或者按概率分到每一個(gè)子樹(shù)上容诬。

CART Classification and Regression tree (以基尼不純度為準(zhǔn)則選擇基尼增益最大的屬性)

  • 決策樹(shù)分為分類樹(shù)和回歸樹(shù),即可以處理分類問(wèn)題沿腰,也可以處理回歸問(wèn)題览徒。
  • 實(shí)際場(chǎng)合中CART 用的較多。

決策樹(shù)的遞歸構(gòu)建

  • 終止條件(滿足任意一個(gè)):
  1. 遍歷完所有劃分?jǐn)?shù)據(jù)集的屬性

  2. 每個(gè)分支下的所有實(shí)例都具有相同的分類(熵為0)

    注明:遍歷完所有劃分?jǐn)?shù)據(jù)集的屬性颂龙,類標(biāo)簽仍不唯一习蓬,一般采用多數(shù)表決的方法決定該葉子節(jié)點(diǎn)的分類

決策樹(shù)過(guò)擬合問(wèn)題

  • 表現(xiàn):訓(xùn)練誤差較低但泛化誤差卻比較大的情況
  • 原因:出現(xiàn)噪聲數(shù)據(jù)纽什;缺乏有代表性的樣本
  • 解決辦法:剪枝(預(yù)剪枝,后剪枝)
  • 預(yù)剪枝:在構(gòu)造過(guò)程中躲叼,當(dāng)某個(gè)節(jié)點(diǎn)滿足剪枝條件芦缰,則直接停止此分支的構(gòu)造
  1. 設(shè)置閾值:當(dāng)觀察到的不純性度量的增益(或估計(jì)的泛化誤差的改進(jìn))低于某個(gè)確定的閾值時(shí)就停止擴(kuò)展葉節(jié)點(diǎn)
  2. 設(shè)置樹(shù)的深度限制,設(shè)置samles個(gè)數(shù)限制
  3. ==問(wèn)題==:閾值太高將導(dǎo)致擬合不足的模型枫慷,而閾值太低就不能充分的解決過(guò)擬合的問(wèn)題
  • 后剪枝:先構(gòu)造完整的決策樹(shù)让蕾,再通過(guò)某些條件==自底向上的方式==修剪決策樹(shù)。
  1. 若該結(jié)點(diǎn)對(duì)應(yīng)的子樹(shù)替換為葉結(jié)點(diǎn)能提升決策樹(shù)的泛化能力流礁,則將改子樹(shù)替換為葉結(jié)點(diǎn)涕俗。

決策樹(shù)的局限和優(yōu)勢(shì)

局限

  • 精確度相比其他方法較低
  • 樹(shù)可能非常不健壯:訓(xùn)練集出現(xiàn)小的波動(dòng),影響決策結(jié)果
  • 學(xué)習(xí)最優(yōu)決策樹(shù)的問(wèn)題被認(rèn)為是 NP-complete的:利用啟發(fā)式算法神帅,貪婪算法再姑,容易出現(xiàn)局部最優(yōu)解,非全局最優(yōu)解找御。
  • 容易出現(xiàn)過(guò)擬合的問(wèn)題:決策樹(shù)學(xué)習(xí)者可以創(chuàng)建過(guò)于復(fù)雜的樹(shù)元镀,從訓(xùn)練數(shù)據(jù)中不能很好地推廣。

優(yōu)勢(shì)

  • 易于理解和解釋:人們能夠通過(guò)簡(jiǎn)單的解釋理解決策樹(shù)模型霎桅。樹(shù)也可以以非專家易于解釋的方式以圖形顯示
  • 能夠處理回歸和分類問(wèn)題栖疑。
  • 需要很少的數(shù)據(jù)準(zhǔn)備
  • 使用白盒模型:如果一個(gè)給定的情況在模型中是可觀察的,那么這個(gè)條件的解釋可以用布爾邏輯來(lái)解釋
  • 可以使用統(tǒng)計(jì)測(cè)試來(lái)驗(yàn)證模型
  • 用大數(shù)據(jù)集執(zhí)行效果很好
  • 比其他方法更能反映人類的決策

python 實(shí)現(xiàn)DT

# -*- coding: utf-8 -*-
"""
Created on 2017/12/27

@author: donghao
"""
import numpy as np
from math import log
import operator


def create_dataset():
    dataset = [[1, 1, 'y'],
               [1, 1, 'y'],
               [1, 0, 'n'],
               [0, 1, 'n'],
               [0, 1, 'n']]
    labels = ['no surfacing', 'flippers'] # features_name
    return dataset, labels


def calc_shannon_ent(dataset):
    """
    # 計(jì)算數(shù)據(jù)集的熵
    :param dataset: 待劃分?jǐn)?shù)據(jù)集
    :return: 熵
    """
    num_entries = len(dataset)
    label_counts = {}
    for line in dataset:
        current_label = line[-1]
        if current_label not in label_counts.keys():
            label_counts[current_label] = 0
        label_counts[current_label] += 1
        shannon_ent = 0.0
    for key in label_counts:
        prob = float(label_counts[key])/num_entries
        shannon_ent -= prob*log(prob, 2)
    return shannon_ent

def split_dataset(dataset, axis, value):
    """
    按照給定的特征劃分?jǐn)?shù)據(jù)集
    :param dataset: 待劃分?jǐn)?shù)據(jù)集
    :param axis: 劃分?jǐn)?shù)據(jù)集的特性(f1 or f2)
    :param value: 需要返回的特征值(比如axis取f1時(shí)滔驶,是返回f1=0 or f1=1)
    :return: 返回按axis分遇革,屬于value的子數(shù)據(jù)集
    """
    ret_dataset = []
    for line in dataset:
        if line[axis] == value:
            reduced_line = line[:axis]
            reduced_line.extend(line[axis + 1:])
            ret_dataset.append(reduced_line)  # append and extend
    return ret_dataset


def choose_best_feature_to_split(dataset):
    """
    # 分別計(jì)算按每個(gè)feature的分裂之后的信息增益(ID3),選擇最大的
    :param dataset:
    :return:
    """
    num_features = len(dataset[0]) - 1
    base_entropy = calc_shannon_ent(dataset)
    best_info_gain = 0.0
    best_feature = -1
    for i in range(num_features):
        # 將dataset 的第i列放在一個(gè)list中
        feat_list = [example[i] for example in dataset]
        # list 中不重復(fù)的數(shù)據(jù)
        unique_vals = set(feat_list)
        new_entropy = 0.0
        for value in unique_vals:
            sub_dataset = split_dataset(dataset, i, value)
            prob = len(sub_dataset)/float(len(dataset))
            new_entropy += prob * calc_shannon_ent(sub_dataset)
        info_gain = base_entropy - new_entropy
        if info_gain>best_info_gain:
            best_info_gain = info_gain
            best_feature = i
    return best_feature


def majority_cnt(class_list):
    """
    多數(shù)判決(所有features都使用完了)
    :param class_list:
    :return:
    """
    class_count = {}
    for vote in class_list:
        if vote not in class_count.keys():
            class_count[vote] = 0
            class_count[vote] += 1
        sorted_class_count = sorted(class_count.items(),
                                    key=operator.itemgetter(1),
                                    reverse=True)
        return sorted_class_count[0][0]


def create_tree(dataset, labels):
    class_list = [example[-1] for example in dataset]
    # 類別完全相同 停止繼續(xù)劃分
    if class_list.count(class_list[0]) == len(class_list):
        return class_list[0]
    # 遍歷完所有特征時(shí)返回出現(xiàn)次數(shù)最多的類別揭糕,比如剩('yes'),('yes'),('no')
    if len(dataset[0]) == 1:
        return majority_cnt(class_list)
    best_feature = choose_best_feature_to_split(dataset)
    best_feature_label = labels[best_feature]
    my_tree = {best_feature_label: {}}
    del (labels[best_feature])
    feature_values = [example[best_feature] for example in dataset]
    unique_values = set(feature_values)
    for value in unique_values:
        sub_labels = labels[:]
        my_tree[best_feature_label][value] = create_tree(
            split_dataset(dataset, best_feature, value),
            sub_labels)
    return my_tree


if __name__=='__main__':
    dataset, labels = create_dataset()
    # calc_shannon_ent test
    print(calc_shannon_ent(dataset))

    # split_dataset test
    print(split_dataset(dataset, 1, 1))
    print(split_dataset(dataset, 1, 0))

    # choose_best_feature_to_split test
    print(choose_best_feature_to_split(dataset))

    # create_tree test
    print(create_tree(dataset, labels))


參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝快,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子著角,更是在濱河造成了極大的恐慌揪漩,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吏口,死亡現(xiàn)場(chǎng)離奇詭異奄容,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)产徊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門昂勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人舟铜,你說(shuō)我怎么就攤上這事叁怪。” “怎么了深滚?”我有些...
    開(kāi)封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵奕谭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我痴荐,道長(zhǎng)血柳,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任生兆,我火速辦了婚禮难捌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸦难。我一直安慰自己根吁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布合蔽。 她就那樣靜靜地躺著击敌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拴事。 梳的紋絲不亂的頭發(fā)上沃斤,一...
    開(kāi)封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音刃宵,去河邊找鬼衡瓶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛牲证,可吹牛的內(nèi)容都是我干的哮针。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼坦袍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼十厢!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起键闺,我...
    開(kāi)封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤寿烟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辛燥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筛武,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年挎塌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徘六。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榴都,死狀恐怖待锈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘴高,我是刑警寧澤竿音,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布和屎,位于F島的核電站,受9級(jí)特大地震影響春瞬,放射性物質(zhì)發(fā)生泄漏柴信。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一宽气、第九天 我趴在偏房一處隱蔽的房頂上張望随常。 院中可真熱鬧,春花似錦萄涯、人聲如沸绪氛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枣察。三九已至,卻和暖如春袄琳,著一層夾襖步出監(jiān)牢的瞬間询件,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工唆樊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宛琅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓逗旁,卻偏偏與公主長(zhǎng)得像嘿辟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片效,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • 轉(zhuǎn)自算法雜貨鋪--決策樹(shù)決策樹(shù)和隨機(jī)森林學(xué)習(xí)筆記-歡迎補(bǔ)充 http://www.cnblogs.com/fion...
    明翼閱讀 10,718評(píng)論 1 6
  • 這一篇文章中红伦,討論一種被廣泛使用的分類算法——決策樹(shù)(decision tree)。決策樹(shù)的優(yōu)勢(shì)在于構(gòu)造過(guò)程不需要...
    H2016閱讀 481評(píng)論 0 0
  • 決策樹(shù)理論在決策樹(shù)理論中淀衣,有這樣一句話昙读,“用較少的東西,照樣可以做很好的事情膨桥。越是小的決策樹(shù)蛮浑,越優(yōu)于大的決策樹(shù)”。...
    制杖灶灶閱讀 5,840評(píng)論 0 25
  • 3.1只嚣、摘要 在前面兩篇文章中沮稚,分別介紹和討論了樸素貝葉斯分類與貝葉斯網(wǎng)絡(luò)兩種分類算法。這兩種算法都以貝葉斯定理為...
    chaaffff閱讀 867評(píng)論 0 1
  • 決策樹(shù)是一個(gè)預(yù)測(cè)模型册舞,也是一個(gè)分類器蕴掏,代表對(duì)象屬性和對(duì)象值的一種映射關(guān)系。決策樹(shù)適用于小數(shù)據(jù)的分類。 決策樹(shù)例子圖...
    BadBadBadBoy閱讀 2,323評(píng)論 0 1