決策樹和隨機森林以及bagging vs boosting

前言

信息是用來消除隨機不確定性的東西。 ------香農(nóng)

隨機森林的特點這里就不說了,它就相當(dāng)于機器學(xué)習(xí)領(lǐng)域的Leatherman(多面手),你幾乎可以把任何東西扔進去,它基本上都是可供使用的。在估計推斷映射方面特別好用,以致都不需要像SVM那樣做很多參數(shù)的調(diào)試。

而想要了解隨機森林,首先要了解決策樹:

1)信息、熵以及信息增益的概念
  這三個基本概念是決策樹的根本,是決策樹利用特征來分類時,確定特征選取順序的依據(jù)。理解了它們,決策樹也就了解了大概。
  假設(shè)我們有一個數(shù)據(jù)集 S,每個數(shù)據(jù)元素都標(biāo)明了所屬的類別,即元素屬于有限類別C 1 ,…, C n 中的一種。如果所有數(shù)據(jù)點都屬于同一類別,那么也就不存在不確定性了,這就屬于我們喜聞樂見的低熵情形。如果數(shù)據(jù)點均勻地分布在各個類別中,那么不確定性就較大,這時我們說具有較大的熵。從數(shù)學(xué)的角度來講,如果 p i 表示 c i 類別中的數(shù)據(jù)所占的比例,那么可以把熵定義為:

2)決策樹
  決策樹是一種樹形結(jié)構(gòu),其中每個內(nèi)部節(jié)點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節(jié)點代表一種類別。常見的決策樹算法有C4.5、ID3和CART。
 3)集成學(xué)習(xí) 
  集成學(xué)習(xí)通過建立幾個模型組合的來解決單一預(yù)測問題。它的工作原理是生成多個分類器/模型,各自獨立地學(xué)習(xí)和作出預(yù)測。這些預(yù)測最后結(jié)合成單預(yù)測,因此優(yōu)于任何一個單分類的做出預(yù)測。
  隨機森林是集成學(xué)習(xí)的一個子類,它依靠于決策樹的投票選擇來決定最后的分類結(jié)果。

我們直接將其寫成函數(shù):

def entropy(class_probabilities):
    return sum(-p * math.log(p, 2) for p in class_probabilities if p)
def partition_entropy(subsets):
    total_count = sum(len(subset) for subset in subsets)
    
    return sum( data_entropy(subset) * len(subset) / total_count
                for subset in subsets )
def group_by(items, key_fn):
    groups = defaultdict(list)
    for item in items:
        key = key_fn(item)
        groups[key].append(item)
    return groups
    
def partition_by(inputs, attribute):
    return group_by(inputs, lambda x: x[0][attribute])    

def partition_entropy_by(inputs,attribute):
    partitions = partition_by(inputs, attribute)
    return partition_entropy(partitions.values())

id3根據(jù)信息增益,運用自頂向下的貪心策略建立決策樹。信息增益用于度量某個屬性對樣本集合分類的好壞程度,下面給出代碼

def classify(tree, input):
    if tree in [True, False]:
        return tree
    attribute, subtree_dict = tree
    subtree_key = input.get(attribute)
    if subtree_key not in subtree_dict: 
        subtree_key = None
    subtree = subtree_dict[subtree_key]
    return classify(subtree, input)

def build_tree_id3(inputs, split_candidates=None):
    if split_candidates is None:
        split_candidates = inputs[0][0].keys()
    num_inputs = len(inputs)
    num_trues = len([label for item, label in inputs if label])
    num_falses = num_inputs - num_trues
    
    if num_trues == 0:                  
        return False                    
        
    if num_falses == 0:                 
        return True                     

    if not split_candidates:
        return num_trues >= num_falses  
    best_attribute = min(split_candidates,
        key=partial(partition_entropy_by, inputs))
    partitions = partition_by(inputs, best_attribute)
    new_candidates = [a for a in split_candidates 
                      if a != best_attribute]
    
    subtrees = { attribute : build_tree_id3(subset, new_candidates)
                 for attribute, subset in partitions.iteritems()
               }
    subtrees[None] = num_trues > num_falses 
    return (best_attribute, subtrees)

到這里,我們的決策樹就構(gòu)建完成了,接下來我們看看隨機森林的構(gòu)建

隨機森林的生成

首先介紹Bootstraping,即自助法(bagging):它是一種隨機有放回的抽樣方法(可能抽到重復(fù)的樣本)。

從這里我們可以知道:每棵樹的訓(xùn)練集都是不同的,而且里面包含重復(fù)的訓(xùn)練樣本。

  • Bagging是并行式集成學(xué)習(xí)代表方法。基于“自助采樣法”(bootstrap sampling)。自助采樣法機制:給定包含m個樣本的數(shù)據(jù)集,我們先隨機取出一個樣本放入采樣集中,再把該樣本放回初始數(shù)據(jù)集,使得下一次采樣時該樣本還會被采到。這樣,經(jīng)過m次樣本采集,我們得到包含m個樣本的采樣集。采樣集中,有的樣本出現(xiàn)過很多次,有的沒有出現(xiàn)過。Bagging機制:我們采樣出T個含m個樣本的采樣集。然后基于每個采樣集訓(xùn)練出一個學(xué)習(xí)器,再將學(xué)習(xí)器進行結(jié)合。對分類任務(wù)使用投票法,對回歸任務(wù)采用平均值法。
# 如果已經(jīng)存在了幾個足夠的劃分候選項, 就查看全部
if len(split_candidates) <= self.num_split_candidates:
    sampled_split_candidates = split_candidates
# 否則選取一個隨機樣本
else:
    sampled_split_candidates = random.sample(split_candidates,
     self.num_split_candidates)
# 現(xiàn)在僅從這些候選項中選擇最佳屬性
best_attribute = min(sampled_split_candidates,
    key=partial(partition_entropy_by, inputs))
partitions = partition_by(inputs, best_attribute
  • Boosting是一族可以將若學(xué)習(xí)器提升為強學(xué)習(xí)器的算法,代表算法為AdaBoost。該算法的工作機制:先從初始訓(xùn)練集訓(xùn)練出一個基學(xué)習(xí)器,再根據(jù)基學(xué)習(xí)器的表現(xiàn)對訓(xùn)練樣本分布進行調(diào)整,使得先前基學(xué)習(xí)器做錯的訓(xùn)練樣本在后續(xù)受到更多關(guān)注,然后基于調(diào)整后的樣本分布來訓(xùn)練下一個基學(xué)習(xí)器。如此反復(fù)進行,直至學(xué)習(xí)器數(shù)目達到事先指定的值T,最終將這T個基學(xué)習(xí)器進行加權(quán)結(jié)合。Boosting我是參考的這個說實話,數(shù)學(xué)公式真的沒怎么看懂。

GBDT算法

GBDT是一個應(yīng)用很廣泛的算法,可以用來做分類、回歸。在很多的數(shù)據(jù)上都有不錯的效果。

而Gradient Boost與傳統(tǒng)的Boost的區(qū)別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的簡歷是為了使得之前模型的殘差往梯度方向減少,與傳統(tǒng)Boost對正確、錯誤的樣本進行加權(quán)有著很大的區(qū)別。
對于大量的數(shù)學(xué)推到,我是看不懂,推薦這個,講的算通俗易懂的。

根據(jù)實際測試(就是直接調(diào)用sklearn等庫對一些應(yīng)用其他回歸算法的數(shù)據(jù)應(yīng)用GBDT準(zhǔn)確性很高~這個真的算神器!)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,296評論 2 376

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

  • 決策樹理論在決策樹理論中,有這樣一句話,“用較少的東西,照樣可以做很好的事情。越是小的決策樹,越優(yōu)于大的決策樹”。...
    制杖灶灶閱讀 5,893評論 0 25
  • 翻譯自analyticsvidhya 基于樹的學(xué)習(xí)算法被認(rèn)為是最好的和最常用的監(jiān)督學(xué)習(xí)(supervised le...
    珞珈村下山閱讀 6,068評論 1 19
  • 隨機森林和GBDT算法的基礎(chǔ)是決策樹 而建立決策樹的算法由很多,ID3,C4.5,CART等, ID3:ID3算法...
    michaelgbw閱讀 2,516評論 0 5
  • 有一個角落,舒服,安靜,陣陣芬芳,陽光灑滿地板。。。我和我腦海中的空間里的你,可以說說話,不知道有多幸福愜意。什么...
    桃木鐲閱讀 288評論 0 0
  • 今天已經(jīng)沒怎么下雨了,可是天氣濕漉漉的,讓人覺得心情不太好。昨天晚餐后,就開始覺得整個人好沒勁,明明是吃了我很愛的...
    彗彗有心心閱讀 498評論 0 50