本篇開始總結(jié)一下以決策樹為基礎(chǔ)的模型,當然本篇的內(nèi)容就是決策樹了,決策樹可以用來分類也可以用來回歸,用作分類的應該更多一些,我們也先從分類問題講起。
1 決策樹思想
決策樹的分類思想很好理解,就是很多個if-then規(guī)則的集合,形成了一個從根結(jié)點出發(fā)的樹狀結(jié)構(gòu)的模型,每一個if-then都對應著樹上的一個分支,如下圖是一個用來判斷是不是加班的決策樹示例,樹中的每個內(nèi)部結(jié)點代表一個特征,每個葉子結(jié)點代表一個類別:
看到這里我們程序員們可能會想,這個東西也能做成一個算法?我分分鐘寫100個if-else。試想,如果有成千上萬個特征呢,我們怎么知道這些特征判斷的順序怎么樣會比較高效、準確呢?哪些特征可能根本沒什么用呢?哪些特征不做判斷更有利于模型的泛化呢?要解決這些問題,靠人工是很困難的,還是得用決策樹算法來操作。
要實現(xiàn)上述特征選擇的功能有多種方法,我們知道,信息越多我們做出分類判斷的不確定性就越小,這顯然是我們追求的目標,針對這一目標先后出現(xiàn)了多種決策樹算法。
2 決策樹ID3分類算法
決策樹ID3算法的核心是:使用信息增益在各個結(jié)點上選擇特征。
使用信息增益來選擇特征的思想就是:哪個特征的信息增益值最大,就認為其提供的信息的多,我們就選這個特征進行分支。
1)信息增益(information gain)
信息增益表示得知特征的信息而使得類
的信息的不確定性減少的程度。特征
對訓練數(shù)據(jù)集
的信息增益
定義為:集合
的經(jīng)驗熵(香農(nóng)熵)
與特征
給定條件下
的經(jīng)驗條件熵
之差,即
這個差又稱為互信息。信息增益大的特征具有更強的分類能力。
信息增益的計算:
輸入:訓練數(shù)據(jù)集和特征
;
輸出:特征對訓練數(shù)據(jù)集
的信息增益
(1)計算數(shù)據(jù)集的經(jīng)驗熵
,
有
個類別
def calc_shannon_ent(dataset):
num_entires = len(dataset) #數(shù)據(jù)集總數(shù)
label_counts = {} #保存每個Label(類別)出現(xiàn)次數(shù)
for row in dataset:
current_label = row [-1] #提取Label信息
label_counts[current_label] = label_counts.get(current_label,0)+1 #Label計數(shù)
shannon_ent = 0.0 #經(jīng)驗熵(香農(nóng)熵)
for key in label_counts:
prob = float(label_counts[key]) / num_entires #該Label的概率
shannon_ent -= prob * log(prob, 2)
return shannon_ent
(2)計算特征對數(shù)據(jù)集
的經(jīng)驗條件熵
,
為特征
的取值
在
中對應的子集
def calc_cond_ent(dataset, fea_i, fea_i_vals):
condition_ent = 0.0
for value in fea_vals:
sub_dataset = dataset[dataset[columns[fea_i]]==fea_i_vals] # 假設(shè)數(shù)據(jù)集是一個DataFrame
prob = len(sub_dataset ) / float(len(dataset)) # 極大似然估計概率
conditionEnt += prob * calc_shannon_ent(sub_dataset ) # 條件熵的計算
return condition_ent
(3)計算信息增益
2)使用信息增益的決策樹ID3
決策樹ID3算法的過程為:
輸入:訓練數(shù)據(jù)集
,每個樣本有
個離散特征,特征集合為
;
輸出:決策樹。
- 1 初始化信息增益的閾值
;
- 2 判斷樣本是否為同一類輸出
,如果是則返回單節(jié)點樹
,標記類別為
;
- 3 判斷特征
是否為空,如果是,則返回單節(jié)點樹
,標記類別為樣本中輸出類別
中實例數(shù)最多的類別
;
- 4 計算
中的各個特征對輸出
的信息增益(計算方法如上節(jié)所述),選擇信息增益最大的特征
;
- 5 如果
的信息增益小于閾值
,則返回單節(jié)點樹
,標記類別為樣本中輸出類別
實例數(shù)最多的類別
;
- 6 否則,按特征
的不同取值
將對應的樣本輸出
分成不同的類別
。每個類別產(chǎn)生一個子節(jié)點。對應特征值為
。返回增加了節(jié)點的數(shù)
;
- 7 對于所有的子節(jié)點,令
遞歸調(diào)用2-6步,得到子樹
并返回。
在這個過程中,如果達到了終止條件,則生成過程結(jié)束(這也算是預剪枝了,可以防止過擬合),得到最終的決策樹,其中,終止條件包括:
- 結(jié)點的數(shù)據(jù)樣本小于閾值(提前設(shè)定),因為數(shù)據(jù)量較少時,再做分裂容易強化噪聲數(shù)據(jù)的作用;二是降低樹生長的復雜性,這樣有利于減少過擬合的風險;
- 每個葉結(jié)點的數(shù)據(jù)樣本都只屬于一個分類,數(shù)據(jù)無法再分裂
- 樹的層數(shù)大于閾值(提前設(shè)定),同樣可以減小決策樹的復雜度,減少過擬合的風險。
- 所有特征已經(jīng)使用完畢,不能再繼續(xù)分裂;
3)決策樹ID3的缺點
根據(jù)以上過程就可以得到一個決策樹ID3算法模型,不過決策樹ID3算法存在一些不足之處,其缺點為:
- 采用信息增益,在相同條件下,取值多的特征傾向于比取值少的特征信息增益大(并不是一定有這個規(guī)律),主要是因為特征的取值越多,相當于對數(shù)據(jù)集的進一步細分,那么自然是消除了更多的數(shù)據(jù)的不確定性,
可能越接近1,導致
越小,即信息增益越大;
- 只能處理離散型特征,不能處理連續(xù)型特征,限制了其適用性;
- 缺少對缺失值的處理;
- 容易產(chǎn)生過擬合。
3 決策樹C4.5分類算法
為了解決上述決策樹ID3算法的缺點,使用信息增益比來選擇特征的決策樹C4.5算法出現(xiàn)了。
1)信息增益比(information gain ratio)
特征對訓練數(shù)據(jù)集
的信息增益比
定義為其信息增益
與訓練數(shù)據(jù)集
關(guān)于特征
的值的熵
之比,即
其中,,
是特征
取值的個數(shù)。
顯然,信息增益比比信息增益多了一個,特征的取值越多,
越大,這個規(guī)律與
相反,所以信息增益比相當于抵消了信息增益對取值多特征的傾向性,也就優(yōu)化了ID3的缺點1。
2)使用信息增益比的決策樹C4.5
決策樹C4.5算法的過程為:
輸入:訓練數(shù)據(jù)集
,每個樣本有
個離散特征,特征集合為
;
輸出:決策樹。
- 1 初始化信息增益的閾值
;
- 2 判斷樣本是否為同一類輸出
,如果是則返回單節(jié)點樹
,標記類別為
;
- 3 判斷特征
是否為空,如果是,則返回單節(jié)點樹
,標記類別為樣本中輸出類別
中實例數(shù)最多的類別
;
- 4 計算
中的各個特征對輸出
的信息增益比(計算方法如上節(jié)所述),選擇信息增益比最大的特征
;
- 5 如果
的信息增益小于閾值
,則返回單節(jié)點樹
,標記類別為樣本中輸出類別
實例數(shù)最多的類別
;
- 6 否則,按特征
的不同取值
將對應的樣本輸出
分成不同的類別
。每個類別產(chǎn)生一個子節(jié)點。對應特征值為
。返回增加了節(jié)點的數(shù)
;
- 7 對于所有的子節(jié)點,令
遞歸調(diào)用2-6步,得到子樹
并返回。
根據(jù)以上過程就可以得到一個決策樹C4.5算法模型,看起來跟ID3的區(qū)別僅僅在于信息增益比,實際上還有一些對ID3缺點的特殊處理。
3)決策樹C4.5對連續(xù)特征、缺失值的處理
(1)針對ID3缺點2不能處理連續(xù)型特征
C4.5使用二分法進行連續(xù)特征離散化,其特點在于離散化中的分類點不是隨便給的,要選擇信息增益最大的點作為該連續(xù)特征的二元離散分類點,比如在一系列連續(xù)值中取到的增益最大的點為
(取排序后的相鄰兩樣本值的平均數(shù)作為分類點),則小于
的值為類別1,大于
的值為類別2;
(2)針對缺點3缺少對缺失值的處理
C4.5從兩個方面對其進行處理:
-
訓練數(shù)據(jù)的特征值有缺失的情況下,如何選擇進行分裂的特征:C4.5的方案是對該有缺失值的特征,只使用其非缺失值的樣本子集進行判斷,比如10個樣本
,特征
存在兩個缺失值,那么就把這兩個樣本剔除,其他8個樣本組成樣本子集
,在
上按正常方法計算
的信息增益,乘0.8(無缺失值樣本所占比例)得到
的信息增益
。
-
已確定了分裂特征
,
存在缺失值,這些缺失值樣本分到哪個分支:C4.5的方案是將缺失值的樣本劃分到所有分支子結(jié)點中,然后為該樣本在不同的子結(jié)點中賦予不同的權(quán)重,這個權(quán)重大概就是概率的意思,子結(jié)點中樣本數(shù)多的權(quán)重就大,例如
有三個取值
,樣本量分別為1,2,3,則一個缺失值在這三個子結(jié)點中的權(quán)值分別為:1/6,2/6,3/6。
4)決策樹C4.5的剪枝
針對缺點4容易產(chǎn)生過擬合問題,C4.5引入了正則化系數(shù)進行初步的剪枝,控制樹的復雜度。剪枝即把決策樹的分支剪掉來簡化模型,剪枝通過最小化決策樹的整體損失函數(shù)來實現(xiàn),設(shè)決策樹的葉子結(jié)點數(shù)量為
,決策樹的整體損失函數(shù)為:
表示模型對訓練數(shù)據(jù)的預測誤差,
表示決策樹的復雜度(葉子結(jié)點越多越復雜),
用來控制二者的關(guān)系,
越大,樹越簡單。
剪枝算法:
輸入:已經(jīng)生成的決策樹
,參數(shù)
輸出:剪枝后的決策樹
- 計算每個結(jié)點的經(jīng)驗熵;
- 遞歸的從樹的葉結(jié)點向上回縮,如果回縮后的決策樹損失函數(shù)值變小,則進行剪枝——將父結(jié)點變?yōu)樽咏Y(jié)點;
- 回到第二步,繼續(xù)剪枝至得到損失最小的決策樹
。
5)決策樹C4.5的缺點
決策樹C4.5對ID3的缺點做了一定的改進,不過其仍然存在一些不足:
- 只能用于分類,不能處理回歸問題;
- C4.5生成的是多叉樹,計算效率不夠高;
- C4.5生成過程中有很多對數(shù)計算,計算效率不夠高。
3 分類、回歸都行的決策樹CART
CART(Classification And Regression Tree),分類與回歸樹,顧名思義,其既可以分類又可以回歸,好神奇呦,它是最常用的決策樹算法,CART同樣由特征選擇、樹的生成及剪枝組成,為了優(yōu)化C4.5的缺點,在分類問題中,CART使用基于基尼系數(shù)的特征選擇,并使用二叉樹的結(jié)構(gòu)來簡化計算。
3.1 分類樹
1)基尼系數(shù)
基尼系數(shù)代表了數(shù)據(jù)集的不純度,特征分類后的數(shù)據(jù)集基尼系數(shù)越小,則不純度越低,該特征分類效果越好。在分類問題中,假設(shè)數(shù)據(jù)集有個類別,第
個類別的概率為
, 則基尼系數(shù)的表達式為:
可以通過下圖來理解基尼系數(shù)隨類別個數(shù)變化的關(guān)系,各個類別概率之和為1,每個類別的概率的平方相當于邊長為
的正方形面積,類別越多,邊長為
的正方形越多,如下左圖所示,藍色區(qū)域面積越小,表示數(shù)據(jù)的不純度越高,當只有一個類別時藍色面積達到最大值1,此時基尼系數(shù)為0,表示數(shù)據(jù)的不純度最低:
為了簡化問題,我們將決策樹的結(jié)構(gòu)設(shè)定為二叉樹,即對任意特征來說,都只根據(jù)其取值將樣本劃分為兩個類別,對于樣本D,如果根據(jù)特征A的某個值a,把D分成D1和D2兩部分,則在特征A的條件下,D的基尼系數(shù)表達式為:
用基尼系數(shù)來判斷特征分裂能力的好壞,如果D1和D2兩部分都包含的類別數(shù)變少,即純度增加,則基尼系數(shù)變小,所以越小的特征越好,這其實跟使用信息熵是差不多的,下圖可以發(fā)現(xiàn),在二分類的計算中,基尼系數(shù)和熵之半的曲線非常接近(對熵進行一階泰勒展開可以發(fā)現(xiàn)二者的相似之處),基尼系數(shù)可以做為熵模型的一個近似替代:
2)使用基尼系數(shù)的決策樹CART
決策樹CART的生成過程:
輸入:訓練集D,終止條件(如基尼系數(shù)的閾值,樣本個數(shù)閾值)
輸出:CART決策樹從根節(jié)點開始,用訓練集遞歸的建立CART樹;
- 對于當前節(jié)點的數(shù)據(jù)集為
,如果樣本個數(shù)小于閾值或者沒有特征,則返回決策子樹,當前節(jié)點停止遞歸;
- 計算樣本集
的基尼系數(shù),如果基尼系數(shù)小于閾值,則返回決策樹子樹,當前節(jié)點停止遞歸;
- 計算當前節(jié)點現(xiàn)有的各個特征的各個特征值對數(shù)據(jù)集
的基尼系數(shù),對于離散值和連續(xù)值的處理方法和基尼系數(shù)的計算見第二節(jié)。缺失值的處理方法和上篇的C4.5算法里描述的相同;
- 在計算出來的各個特征的各個特征值(與ID3、C4.5不同,他們不需要找最佳特征值)對數(shù)據(jù)集
的基尼系數(shù)中,選擇基尼系數(shù)最小的特征
和對應的特征值
。根據(jù)這個最優(yōu)特征和最優(yōu)特征值,把數(shù)據(jù)集劃分成兩部分
和
,同時建立當前節(jié)點的左右節(jié)點,做節(jié)點的數(shù)據(jù)子集為
,右節(jié)點的數(shù)據(jù)子集為
;
- 對左右的子節(jié)點遞歸的調(diào)用1-4步,生成決策樹。
CART樹的生成效率高,一是因為選擇基尼系數(shù)作為分類標準,主要是乘法,沒有對數(shù)運算,提高了計算效率;二是因為CART是二叉樹,簡化了決策樹結(jié)構(gòu)。
還有一點區(qū)別是CART樹中的一特征可以在多處重復使用來分裂,而ID3和C4.5的離散特征只能使用一次,C4.5的連續(xù)型特征可能使用多次,本質(zhì)上來說這也不算什么區(qū)別,只不過是樹的結(jié)構(gòu)變成了二叉樹的結(jié)果,因為一個特征包含多種取值,在ID3和C4.5中因為是多叉樹,所以一次使用就已經(jīng)窮盡了這個特征的所有分類信息,即該特征已經(jīng)信息耗盡,如果再重復用他去分類是已經(jīng)沒有意義的了,而二叉樹的CART不同,一次使用并不一定能將一個特征的信息用完,所以以后還可以重復使用,同理可以知道為什么C4.5的連續(xù)型特征可能使用多次,因為連續(xù)型特征在離散化的時候?qū)嶋H上是用的二分法,沒有將其信息用盡,所以以后還可以用,所以是不是很好理解,并不是什么特別的設(shè)計。
3)決策樹CART的剪枝
我們已經(jīng)知道決策樹的整體損失函數(shù):
用來平衡經(jīng)驗損失和樹的復雜度,
越大,被剪掉的分支就越多,樹越簡單,C4.5中我們把
當做參數(shù)來人工輸入,這顯然是還可以繼續(xù)優(yōu)化的,所以CART的剪枝過程有兩個問題需要解決:1、怎么確定
來使得復雜度和擬合度達到最好的平衡?2、把哪些分支剪掉?
首先我們來思考一下對樹的影響,舉個例子,假設(shè)有個決策樹共4個葉子結(jié)點,樹上有個分支包含兩個葉子結(jié)點,這個分支沒剪掉之前
,如果剪掉這個分支,經(jīng)驗損失升高
,現(xiàn)在我們從0開始來增大
,當
時,決策樹的整體損失
,如果在此時減去這個分支得到子樹
,決策樹的整體損失變?yōu)?img class="math-inline" src="https://math.jianshu.com/math?formula=C_%7B%5Calpha%7D(T_1)%3D0.5%2B0.5*3%3D2" alt="C_{\alpha}(T_1)=0.5+0.5*3=2" mathimg="1">,即剪枝前后整體損失相等,此時就是剪枝的臨界點,如果不剪枝整體損失就大于剪枝的子樹了,當然,剪枝之后經(jīng)驗損失(誤差)也增大了,
反映了誤差增大的大小,因此
被稱作“誤差增益”。如果繼續(xù)增大
,發(fā)現(xiàn)到
時又需要剪枝了,顯然
是在
的區(qū)間
中的最優(yōu)子樹,每個
可以通過下式計算:
隨著的不斷增大,我們會得到子樹序列
,每個
剪去一個分支變成
,如果我們從樹的角度來想的話,就是每一個分支結(jié)點,都對應著一個
,這個
就是將它剪去的劊子手,所以我們實際操作中是根據(jù)每個結(jié)點計算
,而不是真的通過增大
來得到子樹,因為
作為連續(xù)數(shù)值要遍歷的話是不可能的。
在我們得到所有的子樹后,對每棵樹進行交叉驗證(即用測試集驗證),結(jié)果最好的即為泛化能力最好的決策樹。總結(jié)CART決策樹剪枝的過程:
輸入:CART算法生成的決策樹
;
輸出:剪枝后的最優(yōu)決策樹。
(1)設(shè)
;
(2)設(shè);
(3)自下而上對各內(nèi)部結(jié)點計算
以及
式中,
表示已
為根結(jié)點的子樹,
是其對訓練數(shù)據(jù)的預測誤差,
是葉子結(jié)點個數(shù);
(4) 對的內(nèi)部結(jié)點
進行剪枝,并對葉結(jié)點
用多數(shù)表決法確定其類別,得到樹
;
(5)設(shè);
(6)如果不是由根結(jié)點和兩個葉子結(jié)點構(gòu)成的樹,則回到步驟(2);否則令
。
(7)采用交叉驗證法在子樹序列中選取最優(yōu)子樹
。
分析一下這個過程,一開始設(shè)置為無窮大,然后計算所有內(nèi)部節(jié)點的
,然后取一個最小的值,最小的
應該對應著最少的剪枝,保存剪枝后的樹
;剪枝后,全部結(jié)點的
都會變化,此時重新計算所有的
,重復上面的操作,這一次得到的最小的
會比之前的大,一直重復這一套操作直到根節(jié)點結(jié)束。
不知道大家有沒有這個疑問,直接遍歷各種剪枝的可能不行嗎,這里計算并保存有什么用呢?難道這樣按
從小到大剪枝會比遍歷的運算效率高嗎,搞不懂,我猜可能是最小的
沒準對應的不一定是第一層,可能是第二層第三層,如果這樣的話,那確實一下剪掉就提高了效率,純屬猜測,哪天有空了可以設(shè)計個決策樹試試看。。。
3.2 回歸樹
所謂回歸樹,就是其輸出不再是離散型的類別數(shù)據(jù),而是連續(xù)型的數(shù)值,回歸樹與分類樹的區(qū)別的根源也就在此,分類樹中的label是離散型的類別,所以我們使用信息熵啊、基尼系數(shù)啊來衡量被分開的兩波數(shù)據(jù)中類別數(shù)是不是變得更少,也就是所謂的數(shù)據(jù)更純粹、信息更多;回歸樹的label是各種數(shù)值,這樣肯定就行不通啦,我們需要衡量的是被分開的兩波數(shù)據(jù)是不是數(shù)值更相近了,也就是方差,所以回歸樹與分類樹的區(qū)別就是:1、數(shù)據(jù)分裂的評價指標不同;2、最終預測結(jié)果的獲取方式不同(要把輸出歸一到一個數(shù)值上)。
- 數(shù)據(jù)分裂選擇特征的指標:特征
中取值點
將數(shù)據(jù)集劃分成數(shù)據(jù)子集
和
,使
和
的均方差分別最小,同時使
和
的均方差之和最小,那么
為分裂特征,
為分裂點,表達式為:
其中,為
數(shù)據(jù)集的樣本輸出均值,
為
數(shù)據(jù)集的樣本輸出均值。
- 預測結(jié)果的獲取方式:葉子結(jié)點中數(shù)據(jù)label的均值或者中位數(shù)。
除此之外,回歸樹的生成方式與分類樹一致。
4 決策樹總結(jié)
之前我們已經(jīng)知道了邏輯回歸、SVM等多種分類算法,相比之下:
- 決策樹的思路簡單易懂,淺層的樹可解釋性很好,并且易于可視化,這種特點使得其頗受一些傳統(tǒng)行業(yè)的青睞;
- 同時,決策樹對數(shù)據(jù)分布沒有假設(shè),且可以處理離散型數(shù)據(jù)和連續(xù)型數(shù)據(jù),而之前那幾種分類器顯然對連續(xù)型數(shù)據(jù)更友善;
- 決策樹可以直接實現(xiàn)多分類;
- 對批量數(shù)據(jù)預測速度比較快,因為CART二叉樹的結(jié)果,其預測的時間復雜度為
,其中
為數(shù)據(jù)量。
決策樹還是有其局限性及缺點的,包括:
- 決策樹每次用一個特征分裂,容易忽略特征間的相互關(guān)聯(lián),這個問題可以通過多變量決策樹來優(yōu)化;
- 決策樹容易發(fā)生過擬合,需要花很大功夫來調(diào)整其結(jié)構(gòu)如剪枝等來控制;
- 決策樹容易因為樣本的小的變化而過分改變其結(jié)構(gòu),使模型穩(wěn)定性和抗震蕩性差,這個問題可使用集成模型來優(yōu)化;
- 對缺失值的處理不夠好等。