最近看了一些關於決策樹和隨機森林的東西,在這裏簡單整理一下。算法
決策數其實就是一個樹狀模型嘛(用來預測從而進行決策的分析方法),和其它樹模型同樣,分有根節點,葉節點和子節點。bootstrap
它的思想就是來尋找最純淨的劃分方法。方法呢,就是對特徵進行劃分和判斷。網絡
我對此的理解就是,它每一項特徵都得經過,不容許出現「偏科」的狀況。好比說,你要判斷一個學生,他是否是優秀學生。
若是是線性模型的,好比說考試成績40%+思想品德30%+競賽獎項*30%,這樣算出的成績,好比過90分,則說明是個優秀學生。
而決策樹呢,它分紅若干節點,依次判斷。好比,先判斷考試成績,沒過90分,淘汰,過了,進行下一輪判斷,直到所有判斷經過,則證實他是一個優秀學生。
(有點像闖關,沒過這關,死了,過了這關,進入下一關,直到通關。)dom
它運用建樹和剪枝來達到尋找最純淨的劃分的目的(創建模型)。機器學習
1.按次序選擇屬性。就是如何選擇樹結點的前後問題(按重要程度從大到小)。在ID3算法*中,運用信息增益;C4.5算法用信息增益率;cart算法用基尼係數來衡量這些變量的重要性。函數
·ID3算法,基於奧卡姆剃刀原理(「如無必要,勿增實體」,即剔除全部累贅,越簡單越好。)它的基本思路就是認爲,越是小型的決策樹越好(也有例外)。
在信息論中,指望信息越小,那麼信息增益就越大,從而純度就越高。ID3算法的核心思想就是以信息增益*來度量屬性的選擇,選擇分裂後信息增益最大的屬性進行分裂。該算法採用自頂向下的貪婪搜索遍歷可能的決策空間。
信息增益是針對一個一個特徵而言的,就是看一個特徵,系統有它和沒有它時的信息量各是多少,二者的差值就是這個特徵給系統帶來的信息量,即信息增益。
信息熵 H(x); X爲事件,P爲事件的機率
則H(x)=-[P1log2(p1)+p2log2(p2)+……pn*log2(pn)];熵越大,則說明攜帶的信息量越大。性能
C4.5算法,是基於ID3算法後,改進的一種重要算法。相比於ID3:
1.它運用信息增益率。
2.在樹構造過程當中進行剪枝,不容易致使overfitting(過擬合)*。
3.對非離散數據也能夠處理。
4.可以對不完整數據進行處理。學習
cart算法,cart算法是一種二分遞歸分割技術,把當前樣本劃分爲兩個子樣本,使得生成的每一個非葉子結點都有兩個分支,所以cart算法生成的決策樹是結構簡介的二叉樹。因爲cart算法構成的一個二叉樹,它在每一步的決策都只能是「yes」和「no」,即便一個對象有多個取值,也把數據分爲兩個部分。在cart算法中,主要分爲兩個步驟:
1)將樣本遞歸劃分進行建樹過程。
2)用驗證數據進行剪枝。
(Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不一致的機率,所以Gini(D)越小,則數據集D的純度越高。)測試
三種方法對比:
ID3的缺點,傾向於選擇水平數量較多的變量,可能致使訓練獲得一個龐大且深度淺的樹;另外輸入變量必須是分類變量(連續變量必須離散化);最後沒法處理空值。
C4.5選擇了信息增益率替代信息增益。
CART以基尼係數替代熵;最小化不純度而不是最大化信息增益。大數據
決策樹會把全部特徵試一遍,選擇產生純度增益最大的點,做爲父節點。
(在決策樹構造過程當中可能會出現這種狀況:全部屬性都做爲分裂屬性用光了,但有的子集還不是純淨集,即集合內的元素不屬於同一類別。在這種狀況下,因爲沒有更多信息可使用了,通常對這些子集進行「多數表決」,即便用此子集中出現次數最多的類別做爲此節點類別,而後將此節點做爲葉子節點。)
如何中止分裂
下面這六種狀況都會中止分裂。樹的剪枝分爲預剪枝和後剪枝,預剪枝,及早的中止樹增加控制樹的規模,方法能夠參考以下6點中止分類的條件。後剪枝在已生成過擬合決策樹上進行剪枝,刪除沒有意義的組,能夠獲得簡化版的剪枝決策樹,包括REP(設定必定的誤分類率,減掉對誤分類率上升不超過閾值的多餘樹)、PEP,還有一種CCP,即給分裂準則—基尼係數加上懲罰項,此時樹的層數越深,基尼係數的懲罰項會越大。
http://images2015.cnblogs.com...
http://images2015.cnblogs.com...
優勢
決策樹易於理解和實現,人們在在學習過程當中不須要使用者瞭解不少的背景知識,這同時是它的可以直接體現數據的特色,只要經過解釋後都有能力去理解決策樹所表達的意義。
對於決策樹,數據的準備每每是簡單或者是沒必要要的,並且可以同時處理數據型和常規型屬性,在相對短的時間內可以對大型數據源作出可行且效果良好的結果。
易於經過靜態測試來對模型進行評測,能夠測定模型可信度;若是給定一個觀察的模型,那麼根據所產生的決策樹很容易推出相應的邏輯表達式。
缺點
1)對連續性的字段比較難預測。
2)對有時間順序的數據,須要不少預處理的工做。
3)當類別太多時,錯誤可能就會增長的比較快。
4)通常的算法分類的時候,只是根據一個字段來分類。
隨機森林指的是利用多棵樹對樣本進行訓練並預測的一種分類器。我對此的理解就是產生多棵決策樹。
同一批數據,用一樣的算法只能產生一棵樹,這時Bagging*策略能夠幫助咱們產生不一樣的數據集。Bagging策略來源於bootstrap aggregation:從樣本集(假設樣本集N個數據點)中重採樣選出Nb個樣本(有放回的採樣,樣本數據點個數仍然不變爲N),在全部樣本上,對這n個樣本創建分類器(ID3C4.5CARTSVMLOGISTIC),重複以上兩步m次,得到m個分類器,最後根據這m個分類器的投票結果,決定數據屬於哪一類。
隨機森林在bagging的基礎上更進一步:
1. 樣本的隨機:從樣本集中用Bootstrap*隨機選取n個樣本
4. 這m個CART造成隨機森林,經過投票表決結果,決定數據屬於哪一類(投票機制有一票否決制、少數服從多數、加權多數)
·bagging:集成學習有兩種流派,一個是boosting流派,它的特色是各個弱學習器之間有依賴關係。另種就是bagging流派,它的特色就是各個弱學習器之間沒有依賴關係,能夠並行擬合。
http://images2015.cnblogs.com...
Bagging的特色在於隨機採樣(boostrap)。從樣本集中隨機採起固定數的樣本,每採集一次,都要把樣本放回。
算法流程: 輸入爲樣本集D={(x,y1),(x2,y2),...(xm,ym)},弱學習器算法, 弱分類器迭代次數T。
輸出爲最終的強分類器f(x)
1)對於t=1,2...,T:
a)對訓練集進行第t次隨機採樣,共採集m次,獲得包含m個樣本的採樣集Dm
b)用採樣集Dm訓練第m個弱學習器Gm(x)
2) 若是是分類算法預測,則T個弱學習器投出最多票數的類別或者類別之一爲最終類別。若是是迴歸算法,T個弱學習器獲得的迴歸結果進行算術平均獲得的值爲最終的模型輸出。
主要優勢有:
1) 訓練能夠高度並行化,對於大數據時代的大樣本訓練速度有優點。
2) 因爲能夠隨機選擇決策樹節點劃分特徵,這樣在樣本特徵維度很高的時候,仍然能高效的訓練模型。
3) 在訓練後,能夠給出各個特徵對於輸出的重要性
4) 因爲採用了隨機採樣,訓練出的模型的方差小,泛化能力強。
5) 相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單。
6) 對部分特徵缺失不敏感。
主要缺點有:
1)在某些噪音比較大的樣本集上,RF模型容易陷入過擬合。
2) 取值劃分比較多的特徵容易對RF的決策產生更大的影響,從而影響擬合的模型的效果。
GBDT(又叫MART:Multiple Additive Regression Tree)是一種迭代的決策樹算法(不是分類樹,分類樹則是對每個對象取一個閾值,高於閾值的爲一類,低於的爲一類。),也是由多棵決策樹組成,全部樹的結論累加起來作最終答案。是一種被認爲泛化能力較強的算法。
迴歸樹用於連續型(如溫度、年齡、工資);分類樹用於離散型(如性別、氣候)。
·泛化能力(generalization ability)是指機器學習算法對新鮮樣本的適應能力。學習的目的是學到隱含在數據對背後的規律,對具備同一規律的學習集之外的數據,通過訓練的網絡也能給出合適的輸出,該能力稱爲泛化能力。
那麼它和決策森林的區別是什麼呢?
1)組成隨機森林的樹能夠是分類樹,也能夠是迴歸樹;而GBDT只由迴歸樹組成。
2)組成隨機森林的樹能夠並行生成;而GBDT只能是串行生成。
3)對於最終的輸出結果而言,隨機森林採用多數投票;而GBDT則是將全部結果加權累加起來。
4)隨機森林對異常值不敏感,GBDT對異常值很是敏感。
5)隨機森林對訓練集一視同仁,GBDT是基於權值的弱分類器的集成。
6)隨機森林是經過減小模型方差提升性能,GBDT是經過減小模型誤差提升性能。
Boost是"提高"的意思,通常Boosting算法都是一個迭代的過程,每一次新的訓練都是爲了改進上一次的結果。
GBDT的核心就在於:每一棵樹學的是以前全部樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。好比A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏咱們把A的年齡設爲6歲去學習,若是第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;若是第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學習
舉個例子:
年齡預測,簡單起見訓練集只有4我的,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工做兩年的員工。若是是用一棵傳統的迴歸決策樹來訓練,會獲得以下圖1所示結果:
http://img.blog.csdn.net/2013...
如今咱們使用GBDT來作這件事,因爲數據太少,咱們限定葉子節點作多有兩個,即每棵樹都只有一個分枝,而且限定只學兩棵樹。咱們會獲得以下圖2所示結果:
http://img.blog.csdn.net/2013...
在第一棵樹分枝和圖1同樣,因爲A,B年齡較爲相近,C,D年齡較爲相近,他們被分爲兩撥,每撥用平均年齡做爲預測值。此時計算殘差(殘差的意思就是: A的預測值 + A的殘差 = A的實際值),因此A的殘差就是16-15=1(注意,A的預測值是指前面全部樹累加的和,這裏前面只有一棵樹因此直接是15,若是還有樹則須要都累加起來做爲A的預測值)。進而獲得A,B,C,D的殘差分別爲-1,1,-1,1。而後咱們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,若是咱們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能獲得真實年齡了。這裏的數據顯然是我能夠作的,第二棵樹只有兩個值1和-1,直接分紅兩個節點。此時全部人的殘差都是0,即每一個人都獲得了真實的預測值。
換句話說,如今A,B,C,D的預測值都和真實年齡一致了。Perfect!:
A: 14歲高一學生,購物較少,常常問學長問題;預測年齡A = 15 – 1 = 14
B: 16歲高三學生;購物較少,常常被學弟問問題;預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生;購物較多,常常問師兄問題;預測年齡C = 25 – 1 = 24
D: 26歲工做兩年員工;購物較多,常常被師弟問問題;預測年齡D = 25 + 1 = 26
【出自做者:是藍先生 連接:http://www.jianshu.com/p/d210...】
GBDT範圍
GBDT幾乎可用於全部迴歸問題(線性/非線性),GBDT的適用面很是廣。亦可用於二分類問題(設定閾值,大於閾值爲正例,反之爲負例)。
算法步驟解釋:一、初始化,估計使損失函數極小化的常數值,它是隻有一個根節點的樹,即ganma是一個常數值。二、(a)計算損失函數的負梯度在當前模型的值,將它做爲殘差的估計(b)估計迴歸樹葉節點區域,以擬合殘差的近似值(c)利用線性搜索估計葉節點區域的值,使損失函數極小化(d)更新迴歸樹三、獲得輸出的最終模型 f(x)