天天看點

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

本文轉自https://www.cnblogs.com/fionacai/p/5894142.html

首先,在了解樹模型之前,自然想到樹模型和線性模型有什麼差別呢?其中最重要的是,樹形模型是一個一個特征進行處理,之前線性模型是所有特征給予權重相加得到一個新的值。決策樹與邏輯回歸的分類差別也在于此,邏輯回歸是将所有特征變換為機率後,通過大于某一機率門檻值的劃分為一類,小于某一機率門檻值的為另一類;而決策樹是對每一個特征做一個劃分。另外邏輯回歸隻能找到線性分割(輸入特征x與logit之間是線性的,除非對x進行多元映射),而決策樹可以找到非線性分割。

而樹形模型更加接近人的思維方式,可以産生可視化的分類規則,産生的模型具有可解釋性(可以抽取規則)。樹模型拟合出來的函數其實是分區間的階梯函數。

決策樹學習:采用自頂向下的遞歸的方法,基本思想是以資訊熵為度量構造一棵熵值下降最快的樹,到葉子節點處熵值為0(葉節點中的執行個體都屬于一類)。

其次,需要了解幾個重要的基本概念:根節點(最重要的特征);父節點與子節點是一對,先有父節點,才會有子節點;葉節點(最終标簽)。

一、決策樹

決策樹生成的數學表達式:

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼
決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

決策樹的生成:

決策樹思想,實際上就是尋找最純淨的劃分方法,這個最純淨在數學上叫純度,純度通俗點了解就是目标變量要分得足夠開(y=1的和y=0的混到一起就會不純)。另一種了解是分類誤差率的一種衡量。實際決策樹算法往往用到的是,純度的另一面也即不純度,下面是不純度的公式。不純度的選取有多種方法,每種方法也就形成了不同的決策樹方法,比如ID3算法使用資訊增益作為不純度;C4.5算法使用資訊增益率作為不純度;CART算法使用基尼系數作為不純度。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

決策樹要達到尋找最純淨劃分的目标要幹兩件事,建樹和剪枝

建樹:

如何按次序選擇屬性

也就是首先樹根上以及樹節點是哪個變量呢?這些變量是從最重要到次重要依次排序的,那怎麼衡量這些變量的重要性呢? ID3算法用的是資訊增益,C4.5算法用資訊增益率;CART算法使用基尼系數。決策樹方法是會把每個特征都試一遍,然後選取那個,能夠使分類分的最好的特征,也就是說将A屬性作為父節點,産生的純度增益(GainA)要大于B屬性作為父節點,則A作為優先選取的屬性。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼
決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

(根據log(x)的函數可知,p值越小,熵越大,是以當分組完全是會出現p=0此時熵最大)

如何分裂訓練資料(對每個屬性選擇最優的分割點)

如何分裂資料也即分裂準則是什麼?依然是通過不純度來分裂資料的,通過比較劃分前後的不純度值,來确定如何分裂。

下面做具體的介紹:

——CART算法:既可以做分類,也可以做回歸。隻能形成二叉樹。

分支條件:二分類問題

分支方法:對于連續特征的情況:比較門檻值,高于某個門檻值就屬于某一類,低于某個門檻值屬于另一類。對于離散特征:抽取子特征,比如顔值這個特征,有帥、醜、中等三個水準,可以先分為帥和不帥的,不帥的裡面再分成醜和中等的。

得分函數(y):就是上面提到的gt(x),對于分類樹取得是分類最多的那個結果(也即衆數),對于回歸樹取得是均值。

損失函數:其實這裡的損失函數,就是分類的準則,也就是求最優化的準則

對于分類樹(目标變量為離散變量):同一層所有分支假設函數的基尼系數的平均。

對于回歸樹(目标變量為連續變量):同一層所有分支假設函數的平方差損失

對于分類樹(目标變量為離散變量):使用基尼系數作為分裂規則。比較分裂前的gini和分裂後的gini減少多少,減少的越多,則選取該分裂規則,這裡的求解方法隻能是離散窮舉。關于基尼系數,可以參考周志華的西瓜書決策樹那章,講得比較簡潔,也比較易懂。“直覺來說,(資料集D的基尼系數)Gini(D)反映了從資料集D中随機抽取兩個樣本,其類别标記不一緻的機率,是以Gini(D)越小,則資料集D的純度越高。”

具體這個的計算,我覺得有例子才好了解,下面這個紅綠球的例子很好的說明了,如何根據損失函數最小(也就是基尼系數最小)來選取分裂規則。最後GIINs2更小,是以選擇它作為分類規則。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

對于回歸樹(目标變量為連續變量):使用最小方差作為分裂規則。隻能生成二叉樹。

CART與邏輯回歸的比較:

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

主要優缺點如下圖。缺點補充幾點,不是很穩點,資料變化一點,你的樹就會發生變化;沒有考慮變量之間相關性,每次篩選都隻考慮一個變量(是以不需要歸一化);隻能線性分割資料;貪婪算法(可能找不到最好的樹)。優點也補充三點,同時可以處理分類變量和數值變量(但是可能決策樹對連續變量的劃分并不合理,是以可以提前先離散化);可以處理多輸出問題;另外決策樹不需要做變量篩選,它會自動篩選;适合處理高次元資料。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

ID3算法:使用資訊增益作為分裂的規則,資訊增益越大,則選取該分裂規則。多分叉樹。資訊增益可以了解為,有了x以後對于标簽p的不确定性的減少,減少的越多越好,即資訊增益越大越好。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

C4.5算法:使用資訊增益率作為分裂規則(需要用資訊增益除以,該屬性本身的熵),此方法避免了ID3算法中的歸納偏置問題,因為ID3算法會偏向于選擇類别較多的屬性(形成分支較多會導緻資訊增益大)。多分叉樹。連續屬性的分裂隻能二分裂,離散屬性的分裂可以多分裂,比較分裂前後資訊增益率,選取資訊增益率最大的。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

三種方法對比:

ID3的缺點,傾向于選擇水準數量較多的變量,可能導緻訓練得到一個龐大且深度淺的樹;另外輸入變量必須是分類變量(連續變量必須離散化);最後無法處理空值。

C4.5選擇了資訊增益率替代資訊增益。

CART以基尼系數替代熵;最小化不純度而不是最大化資訊增益。

剪枝:

如何停止分裂

下面這六種情況都會停止分裂。其中第一種其實屬于樹的完全長成,但這會出現過拟合問題,所有之前很流行一種抑制這種情況的方法,叫樹的剪枝。樹的剪枝分為預剪枝和後剪枝,預剪枝,及早的停止樹增長控制樹的規模,方法可以參考如下6點停止分類的條件。後剪枝在已生成過拟合決策樹上進行剪枝,删除沒有意義的組,可以得到簡化版的剪枝決策樹,包括REP(設定一定的誤分類率,減掉對誤分類率上升不超過門檻值的多餘樹)、PEP,還有一種CCP,即給分裂準則—基尼系數加上懲罰項,此時樹的層數越深,基尼系數的懲罰項會越大。

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼
決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

二、随機森林

盡管有剪枝等等方法,一棵樹的生成肯定還是不如多棵樹,是以就有了随機森林,解決決策樹泛化能力弱的缺點。(可以了解成三個臭皮匠頂過諸葛亮)

而同一批資料,用同樣的算法隻能産生一棵樹,這時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.類别比例

三、python實作代碼

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼
決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

決策樹的重要參數都是防止過拟合的. 有2個參數是關鍵,min_samples_leaf 這個sklearn的預設值是1,經驗上必須大于100,如果一個節點都沒有100個樣本支援他的決策,一般都被認為是過拟合;max_depth 這個參數控制樹的規模。決策樹是一個非常直覺的機器學習方法。一般我們都會把它的決策樹結構列印出來觀察,如果深度太深對于我們的了解是有難度的。

更多案例請關注“思享會Club”公衆号或者關注思享會部落格:http://gkhelp.cn/

決策樹與随機森林一、決策樹二、随機森林三、python實作代碼

本文轉載自:https://blog.csdn.net/qq_37331184/article/details/84231816

繼續閱讀