目錄
一、概念
決策樹(decision tree)是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示基於特征對實例進行分類的過程。它可以認為是if-then規則的集合,也可以認為是定義在特征空間與類空間上的條件概率分布。
其主要優點是模型具有可讀性,分類速度快。學習時,利用訓練數據,根據損失函數最小化的原則建立決策樹模型。預測時,對新的數據,利用決策樹模型進行分類
其中每個非葉節點表示一個特征屬性上的測試,每個分支代表這個特征屬性在某個值域上的輸出,而每個葉節點存放一個類別。
使用決策樹進行決策的過程就是從根節點開始,測試待分類項中相應的特征屬性,並按照其值選擇輸出分支,直到到達葉子節點,將葉子節點存放的類別作為決策結果。
總結來說:
決策樹模型核心是下面幾部分:
- 節點和有向邊組成
- 節點有內部節點和葉節點倆種類型
- 內部節點表示一個特征,葉節點表示一個類
下圖即為一個決策樹的示意描述,內部節點用矩形表示,葉子節點用橢圓表示:
二、決策樹的學習過程
一棵決策樹的生成過程主要分為以下3個部分:
- 特征選擇:特征選擇是指從訓練數據中眾多的特征中選擇一個特征作為當前節點的分裂標准,如何選擇特征有着很多不同量化評估標准標准,從而衍生出不同的決策樹算法。
- 決策樹生成: 根據選擇的特征評估標准,從上至下遞歸地生成子節點,直到數據集不可分則停止決策樹停止生長。 樹結構來說,遞歸結構是最容易理解的方式。
- 剪枝:決策樹容易過擬合,一般來需要剪枝,縮小樹結構規模、緩解過擬合。剪枝技術有預剪枝和后剪枝兩種
先了解一些基本概念
(1)決策樹節點的不純度(impurity)
不純度用基尼系數(gini)表示:
其中k代表y值的類別的個數,pk 表示類別k樣本數量占所有樣本的比例,從該公式可以看出,當數據集中數據混合的程度越高,基尼指數也就越高。當數據集 只有一種數據類型,那么基尼指數的值為最低,純度越高,基尼系數越小
如果選取的屬性為 A,那么分裂后的數據集 D 的基尼指數的計算公式為:
其中 k 表示樣本 D 被分為 k 個部分,數據集 D 分裂成為 k 個 Dj 數據集。對於特征選取,需要選擇最小的分裂后的基尼指數
對於特征選取,需要選擇最小的分裂后的基尼指數。也可以用基尼指數增益值作為決策樹選擇特征的依據。公式如下
在決策樹選擇特征時,應選擇基尼指數增益值最大的特征,作為該節點分裂條件
信息熵表示的是不確定度。均勻分布時,不確定度最大,此時熵就最大。當選擇某個特征對數據集進行分類時,分類后的數據集信息熵會比分類前的小,其差值表示為信息增益。信息增益可以衡量某個特征對分類結果的影響大小
假設在樣本數據集 D 中,混有 c 種類別的數據。構建決策樹時,根據給定的樣本數據集選擇某個特征值作為樹的節點。在數據集中,可以計算出該數據中的信息熵:
作用前的信息熵的計算方法:
其中 D 表示訓練數據集,c 表示數據類別數,Pi 表示類別 i 樣本數量占所有樣本的比例。
對應數據集 D,選擇特征 A 作為決策樹判斷節點時,在特征 A 作用后的信息熵的為 Info(D),計算如下
其中 k 表示樣本 D 被分為 k 個部分
信息增益表示數據集 D 在特征 A 的作用后,其信息熵減少的值
對於決策樹節點最合適的特征選擇,就是 Gain(A) 值最大的特征
第一步:如何切分特征(選擇節點)--特征選擇
問題:根節點的選擇該用哪個特征呢?接下來呢?如何切分呢?
目標:通過一種衡量標准,來計算通過不同特征進行分支選擇后的分類情況,找出來最好的那個當成根節點,以此類推。
衡量標准-熵、GINI系數(不純度)
熵:熵是表示隨機變量不確定性的度量
解釋:說白了就是物體內部的混亂程度,比如雜貨市場里面什么都有那肯定混亂呀,專賣店里面只賣一個牌子的那就穩定多啦
如何決策一個節點的選擇呢?(如何確定一個分裂是最好的)
特征挑選方法(信息增益法)
選擇具有最高信息增益的特征作為測試特征,利用該特征對節點樣本進行划分子集,會使得各子集中不同類別樣本的混合程度最低,在各子集中對樣本划分所需的信息(熵)最少,形象的見下圖(注意,信息增益既可以用熵也可以用GINI系數來計算)
連續值怎么辦?
第二步:決策樹的生成(基礎版)
- 從根節點出發,根節點包括所有的訓練樣本。
- 一個節點(包括根節點),若節點內所有樣本均屬於同一類別,那么將該節點就成為葉節點,並將該節點標記為樣本個數最多的類別。
- 否則利用采用信息增益法來選擇用於對樣本進行划分的特征,該特征即為測試特征,特征的每一個值都對應着從該節點產生的一個分支及被划分的一個子集。在決策樹中,所有的特征均為符號值,即離散值。如果某個特征的值為連續值,那么需要先將其離散化。
- 遞歸上述划分子集及產生葉節點的過程,這樣每一個子集都會產生一個決策(子)樹,直到所有節點變成葉節點。
- 遞歸操作的停止條件就是:
- (1)一個節點中所有的樣本均為同一類別,那么產生葉節點
- (2)屬性A為空,或者是數據集D在所有屬性A上面取值相同,這時每條數據的值在A上,除了類別,都是一樣的。將該葉節點划分為D中類別最多的類
- (3)沒有樣本能滿足剩余特征的取值,即test_attribute= 對應的樣本為空。此時也強制產生葉節點,該節點的類別為樣本個數最多的類別
怎么理解遞歸操作,看下面這個例子:
我們假設有下面的數據,這是從titanic數據里面簡化出來的,屬性有:
sex,乘客的性別,取值為female和male
pclass,等級,取值為1,2,3
embarked,登陸港口,取值為s,c
survived表示的是分類結果,1表示存活,0表示死亡
sex | pclass | embarked | survived |
f | 2 | s | 1 |
f | 3 | c | 1 |
m | 1 | s | 0 |
m | 1 | s | 1 |
m | 2 | s | 0 |
m | 2 | c | 1 |
m | 1 | s | 0 |
下面這幅圖體現了上面三種情況,尖括號里面的值表示不同的情況。
sex為female的人全部存活下來,分類結果均為1,所以這屬於第一種,以分類結果1作為葉子節點。
當sex為male的時候,pclass為1,我們可以發現,樣本在屬性上(不管是sex、pclass或者是embraked)的取值相同,屬於第二種情況,分類結果用樣本中分類最多的類來表示(此時survived=0最多)。而pclass為2,embarked為s和c這兩種情況均為A為空值這種情況,所以也屬於第二類。
我們發現,我們的數據當中沒有sex=male,pclass=3這種情況,我們直接用訓練集當中分類最多的標簽代替(1:0=2:3,所以選擇0),這屬於第三類。
第三步:決策樹剪枝
由於噪聲等因素的影響,會使得樣本某些特征的取值與樣本自身的類別不相匹配的情況,基於這些數據生成的決策樹的某些枝葉會產生一些錯誤;尤其是在決策樹靠近枝葉的末端,由於樣本變少,這種無關因素的干擾就會突顯出來;由此產生的決策樹可能存在過擬合的現象。樹枝修剪就是通過統計學的方法刪除不可靠的分支,使得整個決策樹的分類速度和分類精度得到提高。
為什么要剪枝:決策樹過擬合風險很大,理論上可以完全分得開數據
(想象一下,如果樹足夠龐大,每個葉子節點不就一個數據了嘛)
2. 剪枝策略:預剪枝,后剪枝
(1)預剪枝:邊建立決策樹邊進行剪枝的操作(更實用)
在決策樹生成分支的過程,除了要進行基礎規則的判斷外,還需要利用統計學的方法對即將分支的節點進行判斷,比如統計χ2或統計信息增益,如果分支后使得子集的樣本統計特性不滿足規定的閾值,則停止分支;但是閾值如何選取才合理是比較困難的。
(2)后剪枝:當建立完決策樹后來進行剪枝操作
在決策樹充分生長后,修剪掉多余的分支。根據每個分支的分類錯誤率及每個分支的權重,計算該節點不修剪時預期分類錯誤率;對於每個非葉節點,計算該節點被修剪后的分類錯誤率,如果修剪后分類錯誤率變大,即放棄修剪;否則將該節點強制為葉節點,並標記類別。產生一系列修剪過的決策樹候選之后,利用測試數據(未參與建模的數據)對各候選決策樹的分類准確性進行評價,保留分類錯誤率最小的決策樹。
三、決策樹的三種常用方法
1)決策樹之ID3算法/基本決策樹
ID3算法是最早提出的一種決策樹算法,ID3算法的核心是在決策樹各個節點上應用信息增益准則來選擇特征,遞歸的構建決策樹。具體方法是:從根節點開始,對節點計算所有可能的特征的信息增益,選擇信息增益最大的特征作為節點的特征,由該特征的不同取值建立子節點:再對子節點遞歸的調用以上方法,構建決策樹:直到所有的特征信息增益均很小或沒有特征可以選擇為止
使用下面這個例子說明:
正例(好瓜)占 8/17,反例占 9/17 ,根結點的信息熵為
計算當前屬性集合{色澤,根蒂,敲聲,紋理,臍部,觸感}中每個屬性的信息增益
色澤有3個可能的取值:{青綠,烏黑,淺白}
D1(色澤=青綠) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6
D2(色澤=烏黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6
D3(色澤=淺白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5
3 個分支結點的信息熵
那么我們可以知道屬性色澤的信息增益是:
同理,我們可以求出其它屬性的信息增益,分別如下:
於是我們找到了信息增益最大的屬性紋理,它的Gain(D,紋理) = 0.381最大。
於是我們選擇的划分屬性為“紋理”
於是,我們可以得到了三個子結點,對於這三個子節點,我們可以遞歸的使用剛剛找信息增益最大的方法進行選擇特征屬性,
比如:D1(紋理=清晰) = {1, 2, 3, 4, 5, 6, 8, 10, 15},第一個分支結點可用屬性集合{色澤、根蒂、敲聲、臍部、觸感},基於 D1各屬性的信息增益,分別求的如下:
於是我們可以選擇特征屬性為根蒂,臍部,觸感三個特征屬性中任選一個(因為他們三個相等並最大),其它倆個子結點同理,然后得到新一層的結點,再遞歸的由信息增益進行構建樹即可
我們最終的決策樹如下:
啊,那到這里為止,我們已經知道了構建樹的算法,上面也說了有了樹,我們直接遍歷決策樹就能得到我們預測樣例的類別。那么是不是大功告成了呢?
結果是:不是的
我們從上面求解信息增益的公式中,其實可以看出,信息增益准則其實是對可取值數目較多的屬性有所偏好!,它的缺點就是偏向選擇取值較多的屬性
現在假如我們把數據集中的“編號”也作為一個候選划分屬性。我們可以算出“編號”的信息增益是0.998
因為每一個樣本的編號都是不同的(由於編號獨特唯一,條件熵為0了,每一個結點中只有一類,純度非常高啊),也就是說,來了一個預測樣本,你只要告訴我編號,其它特征就沒有用了,這樣生成的決策樹顯然不具有泛化能力。
於是我們就引入了信息增益率來選擇最優划分屬性!
2)決策樹之C4.5算法
首先我們來看信息增益率的公式:
由上圖我們可以看出,信息增益率=信息增益/IV(a),說明信息增益率是信息增益除了一個屬性a的固有值得來的。
我們來看IV(a)的公式:
屬性a的固有值:
IV(觸感) = 0.874 ( V = 2 )
IV(色澤) = 1.580 ( V = 3 )
IV(編號) = 4.088 ( V = 17
觸感的IV算法:
from math import log -(12/17)*log((12/17),2)-(5/17)*log((5/17),2) #0.8739810481273578 #或者是 import numpy as np -(12/17)*np.log2(12/17)-(5/17)*np.log2(5/17)
由上面的計算例子,可以看出IV(a)其實能夠反映出,當選取該屬性,分成的V類別數越大,IV(a)就越大,如果僅僅只用信息增益來選擇屬性的話,那么我們偏向於選擇分成子節點類別大的那個特征。
但是在前面分析了,並不是很好,所以我們需要除以一個屬性的固定值,這個值要求隨着分成的類別數越大而越小。於是讓它做了分母。這樣可以避免信息增益的缺點。
那么信息增益率就是完美無瑕的嗎?
當然不是,有了這個分母之后,我們可以看到增益率准則其實對可取類別數目較少的特征有所偏好!畢竟分母越小,整體越大。
於是C4.5算法不直接選擇增益率最大的候選划分屬性,候選划分屬性中找出信息增益高於平均水平的屬性(這樣保證了大部分好的的特征),再從中選擇增益率最高的(又保證了不會出現編號特征這種極端的情況)
現在開始講講C4.5算法
C4.5算法與ID3算法決策樹的生成過程相似,C4.5算法對ID3算法進行了改進。它是用信息增益率(比)來 選擇特征。
這里的改進主要是針對樣本特征來作。
(1)基本決策樹要求特征A取值為離散值,如果A是連續值,假如A有v個取值,則對特征A的測試可以看成是對v-1個可能條件的測試,其實可以把這個過程看成是離散化的過程,只不過這種離散的值間隙會相對小一點;當然也可以采用其他方法,比如將連續值按段進行划分,然后設置亞變量;
(2)特征A的每個取值都會產生一個分支,有的時候會導致划分出來的子集樣本量過小,統計特征不充分而停止繼續分支,這樣在強制標記類別的時候也會帶來局部的錯誤。針對這種情況可以采用A的一組取值作為分支條件;或者采用二元決策樹,每一個分支代表一個特征取值的情況(只有是否兩種取值)。
(3)某些樣本在特征A上值缺失,針對這種空值的情況,可以采用很多方法,比如用其他樣本中特征A出現最多的值來填補空缺,比如采用均值、中值等,甚至在某些領域的數據中可以采用樣本內部的平滑來補值,當樣本量很大的時候也可以丟棄這些有缺失值的樣本。
(4)隨着數據集的不斷減小,子集的樣本量會越來越小,所構造出的決策樹就可能出現碎片、重復、復制等總是。這時可以利用樣本的原有特征構造新的特征進行建模;
(5)信息增益法會傾向於選擇取值比較多的特征(這是信息熵的定義決定了的),針對這一問題,人們提出了增益比率法(gain ratio),將每個特征取值的概率考慮在內,及gini索引法,χ2χ2條件統計表法和G統計法等。
3)決策樹之——CART算法(classification and regression tree)
既可以做分類,也可以做回歸。只能形成二叉樹。
分支條件:二分類問題
分支方法:對於連續特征的情況:比較閾值,高於某個閾值就屬於某一類,低於某個閾值屬於另一類。對於離散特征:抽取子特征,比如顏值這個特征,有帥、丑、中等三個水平,可以先分為帥和不帥的,不帥的里面再分成丑和中等的。
得分函數(y):就是上面提到的gt(x),對於分類樹取得是分類最多的那個結果(也即眾數),對於回歸樹取得是均值。
損失函數:其實這里的損失函數,就是分類的准則,也就是求最優化的准則
對於分類樹(目標變量為離散變量):同一層所有分支假設函數的基尼系數的平均。
對於回歸樹(目標變量為連續變量):同一層所有分支假設函數的平方差損失
分裂准則:
對於分類樹(目標變量為離散變量):使用基尼系數作為分裂規則。比較分裂前的gini和分裂后的gini減少多少,減少的越多,則選取該分裂規則
對於回歸樹(目標變量為連續變量):使用最小方差作為分裂規則。只能生成二叉樹。
補充一個分類樹和回歸樹的區別:
分類樹的作用是通過一個對象的特征來預測該對象所屬的類別,而回歸樹的目的是根據一個對象的信息預測該對象的屬性,並以數值表示。
CART既能是分類樹,又能是決策樹,如上表所示,如果我們想預測一個人是否已婚,那么構建的CART將是分類樹;如果想預測一個人的年齡,那么構建的將是回歸樹。
假設我們構建了兩棵決策樹分別預測用戶是否已婚和實際的年齡,如圖1和圖2所示:
CART分類樹算法對於連續特征和離散特征處理的改進
對於CART分類樹連續值的處理問題,其思想和C4.5是相同的,都是將連續的特征離散化。唯一的區別在於在選擇划分點時的度量方式不同,C4.5使用的是信息增益比,則CART分類樹使用的是基尼系數。
具體的思路如下,比如m個樣本的連續特征A有m個,從小到大排列為a1,a2,...,ama1,a2,...,am,則CART算法取相鄰兩樣本值的平均數,一共取得m-1個划分點,其中第i個划分點表示為:
。對於這m-1個點,分別計算以該點作為二元分類點時的基尼系數。選擇基尼系數最小的點作為該連續特征的二元離散分類點。比如取到的基尼系數最小的點為
,則小於
的值為類別1,大於
的值為類別2,這樣我們就做到了連續特征的離散化。要注意的是,與ID3或者C4.5處理離散屬性不同的是,如果當前節點為連續屬性,則該屬性后面還可以參與子節點的產生選擇過程。
對於CART分類樹離散值的處理問題,采用的思路是不停的二分離散特征。
回憶下ID3或者C4.5,如果某個特征A被選取建立決策樹節點,如果它有A1,A2,A3三種類別,我們會在決策樹上一下建立一個三叉的節點,這樣導致決策樹是多叉樹。但是CART分類樹使用的方法不同,他采用的是不停的二分,還是這個例子,CART分類樹會考慮把A分成{A1}和{A2,A3}{A1}和{A2,A3}, {A2}和{A1,A3}{A2}和{A1,A3}, {A3}和{A1,A2}{A3}和{A1,A2}三種情況,找到基尼系數最小的組合,比如{A2}和{A1,A3}{A2}和{A1,A3},然后建立二叉樹節點,一個節點是A2對應的樣本,另一個節點是{A1,A3}對應的節點。同時,由於這次沒有把特征A的取值完全分開,后面我們還有機會在子節點繼續選擇到特征A來划分A1和A3。這和ID3或者C4.5不同,在ID3或者C4.5的一棵子樹中,離散特征只會參與一次節點的建立。
下面使用上面看電視的數據作為例子和計算:
第一種划分方法:{“學生”}、{“老師”、“上班族”}
預測是否已婚(分類):
預測年齡(回歸):
第二種划分方法:{“老師”}、{“學生”、“上班族”}
第三種划分方法:{“上班族”}、{“學生”、“老師”}
綜上,如果想預測是否已婚,則選擇{“上班族”}、{“學生”、“老師”}的划分方法,如果想預測年齡,則選擇{“老師”}、{“學生”、“上班族”}的划分方法
(1)CART分類樹建立算法的具體流程
上面介紹了CART算法的一些和C4.5不同之處,下面我們看看CART分類樹建立算法的具體流程,之所以加上了建立,是因為CART樹算法還有獨立的剪枝算法這一塊。
算法輸入是訓練集D,基尼系數的閾值,樣本個數閾值。
輸出是決策樹T。
我們的算法從根節點開始,用訓練集遞歸的建立CART樹。
- 對於當前節點的數據集為D,如果樣本個數小於閾值或者沒有特征,則返回決策子樹,當前節點停止遞歸。
- 計算樣本集D的基尼系數,如果基尼系數小於閾值,則返回決策樹子樹,當前節點停止遞歸。
- 計算當前節點現有的各個特征的各個特征值對數據集D的基尼系數,對於離散值和連續值的處理方法和基尼系數的計算見第二節。缺失值的處理方法和上篇的C4.5算法里描述的相同。
- 在計算出來的各個特征的各個特征值對數據集D的基尼系數中,選擇基尼系數最小的特征A和對應的特征值a。根據這個最優特征和最優特征值,把數據集划分成兩部分D1和D2,同時建立當前節點的左右節點,做節點的數據集D為D1,右節點的數據集D為D2。(注:注意是二叉樹,故這里的D1和D2是有集合關系的,D2=D-D1)
- 對左右的子節點遞歸的調用1-4步,生成決策樹。
(2)CART回歸樹建立算法
CART回歸樹和CART分類樹的建立算法大部分是類似的,所以這里我們只討論CART回歸樹和CART分類樹的建立算法不同的地方。
首先,我們要明白,什么是回歸樹,什么是分類樹。兩者的區別在於樣本輸出,如果樣本輸出是離散值,那么這是一顆分類樹。如果果樣本輸出是連續值,那么那么這是一顆回歸樹。
除了概念的不同,CART回歸樹和CART分類樹的建立和預測的區別主要有下面兩點:
1)連續值的處理方法不同
2)決策樹建立后做預測的方式不同。
對於連續值的處理,我們知道CART分類樹采用的是用基尼系數的大小來度量特征的各個划分點的優劣情況。這比較適合分類模型,但是對於回歸模型,我們使用了常見的和方差的度量方式,CART回歸樹的度量目標是,對於任意划分特征A,對應的任意划分點s兩邊划分成的數據集D1和D2,求出使D1和D2各自集合的均方差最小,同時D1和D2的均方差之和最小所對應的特征和特征值划分點。表達式為:
其中,c1為D1數據集的樣本輸出均值,c2為D2數據集的樣本輸出均值。
對於決策樹建立后做預測的方式,上面講到了CART分類樹采用葉子節點里概率最大的類別作為當前節點的預測類別。而回歸樹輸出不是類別,它采用的是用最終葉子的均值或者中位數來預測輸出結果。
(3)CART樹算法的剪枝
CART回歸樹和CART分類樹的剪枝策略除了在度量損失的時候一個使用均方差,一個使用基尼系數,算法基本完全一樣,這里我們一起來講。
由於決策時算法很容易對訓練集過擬合,而導致泛化能力差,為了解決這個問題,我們需要對CART樹進行剪枝,即類似於線性回歸的正則化,來增加決策樹的泛化能力。但是,有很多的剪枝方法,我們應該這么選擇呢?CART采用的辦法是后剪枝法,即先生成決策樹,然后產生所有可能的剪枝后的CART樹,然后使用交叉驗證來檢驗各種剪枝的效果,選擇泛化能力最好的剪枝策略。
也就是說,CART樹的剪枝算法可以概括為兩步,第一步是從原始決策樹生成各種剪枝效果的決策樹,第二部是用交叉驗證來檢驗剪枝后的預測能力,選擇泛化預測能力最好的剪枝后的數作為最終的CART樹。
CART樹的剪枝算法:
首先子樹的概念
(1)可以是單個結點,即這是這個結點可以是葉節點,例如,F和G。
(2)可以含有多個葉結點的以t為根節點的子樹。例如,子樹C
公式中涉及到了t和Tt
t:如果進行剪枝,僅僅保留t,並將t作為葉節點。
Tt:代表以t為根節點不進行剪枝的子樹。
實例:假設,我們現在想計算上圖的內部結點C的g(t),預測誤差以基尼指數為例。
C(t) :就是要計算,去掉F,G后,將C中的實例含有類別個數最多的類別作為該葉子結點的預測類別后,該C結點的基尼指數。
C(Tt) : 保留F,G
D1,D2分別對應葉子結點F,G的樣本數量,而D代表C涵蓋的樣本總數。
為什么用基尼指數作為衡量標准,原文曾提到
例子:
如圖所示:這是一個使用CART訓練后生成的未剪枝的決策樹。內部結點和葉子結點分別用兩種顏色標注,並標注序號
為了表述方便,引入符號
內部結點用
葉子結點用
1. 計算I(1)的g(t)
葉子結點的基尼指數都是0,所以這個值很容易求,分子關鍵是C(t)的大小
2. 計算I(3)的g(t)
為什么是4,Tt:代表以t為根節點不進行剪枝的子樹。
看不懂為什么是0
下表給出了ID3,C4.5和CART的一個比較總結。
算法 | 支持模型 | 樹結構 | 特征選擇 | 連續值處理 | 缺失值處理 | 剪枝 |
ID3 | 分類 | 多叉樹 | 信息增益 | 不支持 | 不支持 | 不支持 |
C4.5 | 分類 | 多叉樹 | 信息增益比 | 支持 | 支持 | 支持 |
CART | 分類,回歸 | 二叉樹 | 基尼系數,均方差 | 支持 | 支持 | 支持 |
應該大家有注意到,無論是ID3, C4.5還是CART,在做特征選擇的時候都是選擇最優的一個特征來做分類決策,但是大多數,分類決策不應該是由某一個特征決定的,而是應該由一組特征決定的。這樣決策得到的決策樹更加准確。這個決策樹叫做多變量決策樹(multi-variate decision tree)。在選擇最優特征的時候,多變量決策樹不是選擇某一個最優特征,而是選擇最優的一個特征線性組合來做決策。這個算法的代表是OC1,這里不多介紹。
如果樣本發生一點點的改動,就會導致樹結構的劇烈改變。這個可以通過集成學習里面的隨機森林之類的方法解決
四、決策樹算法的參數
class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
樹模型參數:
- 1.criterion: gini or entropy
- 2.splitter: best or random 前者是在所有特征中找最好的切分點 后者是在部分特征中(數據量大的時候)
- 3.max_features: None(所有),log2,sqrt,N 特征小於50的時候一般使用所有的
- 4.max_depth: 數據少或者特征少的時候可以不管這個值,如果模型樣本量多,特征也多的情況下,可以嘗試限制下(預剪枝)
- 5.min_samples_split: 如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特征來進行划分如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。(預剪枝)
- 6.min_samples_leaf: 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝,如果樣本量不大,不需要管這個值,大些如10W可是嘗試下5(預剪枝)
- 7.min_weight_fraction_leaf:這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。
- 8.max_leaf_nodes 通過限制最大葉子節點數,可以防止過擬合,默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制具體的值可以通過交叉驗證得到。(預剪枝)
- 9.class_weight:指定樣本各類別的的權重,主要是為了防止訓練集某些類別的樣本過多導致訓練的決策樹過於偏向這些類別。這里可以自己指定各個樣本的權重如果使用“balanced”,則算法會自己計算權重,樣本量少的類別所對應的樣本權重會高。
- 10.min_impurity_split:這個值限制了決策樹的增長,如果某節點的不純度(基尼系數,信息增益,均方差,絕對差)小於這個閾值則該節點不再生成子節點。即為葉子節點 。(預剪枝)
- n_estimators:要建立樹的個數
五、決策樹的總結
終於到了最后的總結階段了,這里我們不再糾結於ID3, C4.5和 CART,我們來看看決策樹算法作為一個大類別的分類回歸算法的優缺點。這部分總結於scikit-learn的英文文檔。
首先我們看看決策樹算法的優點:
1)簡單直觀,生成的決策樹很直觀。
2)基本不需要預處理,不需要提前歸一化,處理缺失值。
3)使用決策樹預測的代價是O(log2m)。 m為樣本數。
4)既可以處理離散值也可以處理連續值。很多算法只是專注於離散值或者連續值。
5)可以處理多維度輸出的分類問題。
6)相比於神經網絡之類的黑盒分類模型,決策樹在邏輯上可以得到很好的解釋
7)可以交叉驗證的剪枝來選擇模型,從而提高泛化能力。
8) 對於異常點的容錯能力好,健壯性高。
我們再看看決策樹算法的缺點::
1)決策樹算法非常容易過擬合,導致泛化能力不強。可以通過設置節點最少樣本數量和限制決策樹深度來改進。
2)決策樹會因為樣本發生一點點的改動(特別是在節點的末梢),導致樹結構的劇烈改變。這個可以通過集成學習之類的方法解決。
3)尋找最優的決策樹是一個NP難的問題,我們一般是通過啟發式方法,容易陷入局部最優。可以通過集成學習之類的方法來改善。
4)有些比較復雜的關系,決策樹很難學習,比如異或。這個就沒有辦法了,一般這種關系可以換神經網絡分類方法來解決。
5)如果某些特征的樣本比例過大,生成決策樹容易偏向於這些特征。這個可以通過調節樣本權重來改善。