首先,在瞭解樹模型以前,天然想到樹模型和線性模型有什麼區別呢?其中最重要的是,樹形模型是一個一個特徵進行處理,以前線性模型是全部特徵給予權重相加獲得一個新的值。決策樹與邏輯迴歸的分類區別也在於此,邏輯迴歸是將全部特徵變換爲機率後,經過大於某一律率閾值的劃分爲一類,小於某一律率閾值的爲另外一類;而決策樹是對每個特徵作一個劃分。另外邏輯迴歸只能找到線性分割(輸入特徵x與logit之間是線性的,除非對x進行多維映射),而決策樹能夠找到非線性分割。python
而樹形模型更加接近人的思惟方式,能夠產生可視化的分類規則,產生的模型具備可解釋性(能夠抽取規則)。樹模型擬合出來的函數實際上是分區間的階梯函數。git
決策樹學習:採用自頂向下的遞歸的方法,基本思想是以信息熵爲度量構造一棵熵值降低最快的樹,到葉子節點處熵值爲0(葉節點中的實例都屬於一類)。算法
其次,須要瞭解幾個重要的基本概念:根節點(最重要的特徵);父節點與子節點是一對,先有父節點,纔會有子節點;葉節點(最終標籤)。bootstrap
1、決策樹機器學習
決策樹生成的數學表達式:函數
決策樹的生成:學習
決策樹思想,實際上就是尋找最純淨的劃分方法,這個最純淨在數學上叫純度,純度通俗點理解就是目標變量要分得足夠開(y=1的和y=0的混到一塊兒就會不純)。另外一種理解是分類偏差率的一種衡量。實際決策樹算法每每用到的是,純度的另外一面也即不純度,下面是不純度的公式。不純度的選取有多種方法,每種方法也就造成了不一樣的決策樹方法,好比ID3算法使用信息增益做爲不純度;C4.5算法使用信息增益率做爲不純度;CART算法使用基尼係數做爲不純度。優化
決策樹要達到尋找最純淨劃分的目標要幹兩件事,建樹和剪枝spa
建樹:3d
(1)如何按次序選擇屬性
也就是首先樹根上以及樹節點是哪一個變量呢?這些變量是從最重要到次重要依次排序的,那怎麼衡量這些變量的重要性呢? ID3算法用的是信息增益,C4.5算法用信息增益率;CART算法使用基尼係數。決策樹方法是會把每一個特徵都試一遍,而後選取那個,可以使分類分的最好的特徵,也就是說將A屬性做爲父節點,產生的純度增益(GainA)要大於B屬性做爲父節點,則A做爲優先選取的屬性。
(根據log(x)的函數可知,p值越小,熵越大,因此當分組徹底是會出現p=0此時熵最大)
(2) 如何分裂訓練數據(對每一個屬性選擇最優的分割點)
如何分裂數據也即分裂準則是什麼?依然是經過不純度來分裂數據的,經過比較劃分先後的不純度值,來肯定如何分裂。
下面作具體的介紹:
——CART算法:既能夠作分類,也能夠作迴歸。只能造成二叉樹。
分支條件:二分類問題
分支方法:對於連續特徵的狀況:比較閾值,高於某個閾值就屬於某一類,低於某個閾值屬於另外一類。對於離散特徵:抽取子特徵,好比顏值這個特徵,有帥、醜、中等三個水平,能夠先分爲帥和不帥的,不帥的裏面再分紅醜和中等的。
得分函數(y):就是上面提到的gt(x),對於分類樹取得是分類最多的那個結果(也即衆數),對於迴歸樹取得是均值。
損失函數:其實這裏的損失函數,就是分類的準則,也就是求最優化的準則
對於分類樹(目標變量爲離散變量):同一層全部分支假設函數的基尼係數的平均。
對於迴歸樹(目標變量爲連續變量):同一層全部分支假設函數的平方差損失
對於分類樹(目標變量爲離散變量):使用基尼係數做爲分裂規則。比較分裂前的gini和分裂後的gini減小多少,減小的越多,則選取該分裂規則,這裏的求解方法只能是離散窮舉。關於基尼係數,能夠參考周志華的西瓜書決策樹那章,講得比較簡潔,也比較易懂。「直觀來講,(數據集D的基尼係數)Gini(D)反映了從數據集D中隨機抽取兩個樣本,其類別標記不一致的機率,所以Gini(D)越小,則數據集D的純度越高。」
具體這個的計算,我以爲有例子纔好理解,下面這個紅綠球的例子很好的說明了,如何根據損失函數最小(也就是基尼係數最小)來選取分裂規則。最後GIINs2更小,所以選擇它做爲分類規則。
對於迴歸樹(目標變量爲連續變量):使用最小方差做爲分裂規則。只能生成二叉樹。
CART與邏輯迴歸的比較:
主要優缺點以下圖。缺點補充幾點,不是很穩點,數據變化一點,你的樹就會發生變化;沒有考慮變量之間相關性,每次篩選都只考慮一個變量(所以不須要歸一化);只能線性分割數據;貪婪算法(可能找不到最好的樹)。優勢也補充三點,同時能夠處理分類變量和數值變量(可是可能決策樹對連續變量的劃分並不合理,因此能夠提早先離散化);能夠處理多輸出問題;另外決策樹不須要作變量篩選,它會自動篩選;適合處理高維度數據。
ID3算法:使用信息增益做爲分裂的規則,信息增益越大,則選取該分裂規則。多分叉樹。信息增益能夠理解爲,有了x之後對於標籤p的不肯定性的減小,減小的越多越好,即信息增益越大越好。
C4.5算法:使用信息增益率做爲分裂規則(須要用信息增益除以,該屬性自己的熵),此方法避免了ID3算法中的概括偏置問題,由於ID3算法會偏向於選擇類別較多的屬性(造成分支較多會致使信息增益大)。多分叉樹。連續屬性的分裂只能二分裂,離散屬性的分裂能夠多分裂,比較分裂先後信息增益率,選取信息增益率最大的。
三種方法對比:
ID3的缺點,傾向於選擇水平數量較多的變量,可能致使訓練獲得一個龐大且深度淺的樹;另外輸入變量必須是分類變量(連續變量必須離散化);最後沒法處理空值。
C4.5選擇了信息增益率替代信息增益。
CART以基尼係數替代熵;最小化不純度而不是最大化信息增益。
剪樹:
(2) 如何中止分裂
下面這六種狀況都會中止分裂。其中第一種其實屬於樹的徹底長成,但這會出現過擬合問題,全部以前很流行一種抑制這種狀況的方法,叫樹的剪枝。樹的剪枝分爲預剪枝和後剪枝,預剪枝,及早的中止樹增加控制樹的規模,方法能夠參考以下6點中止分類的條件。後剪枝在已生成過擬合決策樹上進行剪枝,刪除沒有意義的組,能夠獲得簡化版的剪枝決策樹,包括REP(設定必定的誤分類率,減掉對誤分類率上升不超過閾值的多餘樹)、PEP,還有一種CCP,即給分裂準則—基尼係數加上懲罰項,此時樹的層數越深,基尼係數的懲罰項會越大。
2、隨機森林
儘管有剪枝等等方法,一棵樹的生成確定仍是不如多棵樹,所以就有了隨機森林,解決決策樹泛化能力弱的缺點。(能夠理解成三個臭皮匠頂過諸葛亮)
而同一批數據,用一樣的算法只能產生一棵樹,這時Bagging策略能夠幫助咱們產生不一樣的數據集。Bagging策略來源於bootstrap aggregation:從樣本集(假設樣本集N個數據點)中重採樣選出Nb個樣本(有放回的採樣,樣本數據點個數仍然不變爲N),在全部樣本上,對這n個樣本創建分類器(ID3\C4.5\CART\SVM\LOGISTIC),重複以上兩步m次,得到m個分類器,最後根據這m個分類器的投票結果,決定數據屬於哪一類。
隨機森林在bagging的基礎上更進一步:
1. 樣本的隨機:從樣本集中用Bootstrap隨機選取n個樣本
2. 特徵的隨機:從全部屬性中隨機選取K個屬性,選擇最佳分割屬性做爲節點創建CART決策樹(泛化的理解,這裏面也能夠是其餘類型的分類器,好比SVM、Logistics)
3. 重複以上兩步m次,即創建了m棵CART決策樹
4. 這m個CART造成隨機森林,經過投票表決結果,決定數據屬於哪一類(投票機制有一票否決制、少數服從多數、加權多數)
關於調參:1.如何選取K,能夠考慮有N個屬性,取K=根號N
2.最大深度(不超過8層)
3.棵數
4.最小分裂樣本樹
5.類別比例
3、python實現代碼
決策樹的重要參數都是防止過擬合的. 有2個參數是關鍵,min_samples_leaf 這個sklearn的默認值是1,經驗上必須大於100,若是一個節點都沒有100個樣本支持他的決策,通常都被認爲是過擬合;max_depth 這個參數控制樹的規模。決策樹是一個很是直觀的機器學習方法。通常咱們都會把它的決策樹結構打印出來觀察,若是深度太深對於咱們的理解是有難度的。