数据产品工作指北(6)-决策树算法

一、决策树

决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。

如下图就是一个典型的决策树,我们可以通过纹理(清晰/模糊)、触感(硬滑/软粘)、根蒂(蜷缩/稍蜷/硬挺)、色泽(青绿/乌黑/浅白)判断一个西瓜是好瓜还是坏瓜。例如一个纹理清晰根蒂稍蜷色泽乌黑触感硬滑的瓜,从根节点开始,遍历到叶子结点,就知道这是一个好瓜。


引用于周志华老师西瓜书

模型的核心部分是结点有向边,其中结点分为叶节点和非叶节点(叶节点表示一个类,非叶节点表示一个特征),有向边表示特征属性的判断和分裂。决策树代表实例属性值约束的合取的折取,从树根到树叶的每一条路径对应一组属性测试的合取(即∩),树本身对应这些合取的折取(即∪)。所以决策树的判断过程就相当于从根节点到某一叶节点的遍历,每一步如何遍历是由数据各个特征的具体特征属性决定。

不同于贝叶斯算法,决策树的构造过程不依赖领域知识,它使用属性选择度量来选择将元组最好地划分成不同的类的属性。所谓决策树的构造就是进行属性选择度量确定各个特征属性之间的拓扑结构。

构造决策树的关键步骤是分裂属性。即在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。

分裂属性有三种情况:

1、属性是离散值且不要求生成二叉决策树,此时用属性的每一个划分作为一个分支;

2、属性是离散值且要求生成二叉决策树,此时使用属性划分的一个子集进行测试,按照“属于此子集”和“不属于此子集”分成两个分支;

3、属性是连续值,此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。

尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。由此衍生出来多种决策树算法,ID3、C4.5、CART等基础算法,以及随机森林、GBDT、XGboost、lightGBM等集成算法,接下来将说明其中的基础算法部分,并简单介绍一下集成算法。

二、信息

在介绍ID3、C4.5算法和CART算法之前需要先说明一些基础知识。

1、信息量

在日常生活中,极少发生的事件一旦发生就容易引起人们的关注,而司空见惯的事情就不会引起注意,也就是说极少见的事件所带来的的信息量多。

例如我们说北京明天要地震、北京明天是个晴天、明天的太阳从东边升起,这三件事情,由于明天地震发生的可能性是极小的,一旦发生,那么这句话的信息量是将是巨大的,而太阳从东边升起是亘古不变的,所以我们认为这句话的信息量几乎为0。

如果用统计学的术语描述,就是越小概率事件发生了产生的信息量越大。因此,我们可以得出两条结论:

(1)一个具体事件的信息量应该是随着其发生概率而递减的,且不能为负,即info(x) = 1/P(x);

(2)如果两个不相关的事件x和y,那么两个事件同时发生时获得的信息应该等于两个事件各自发生时获得的信息之和,即info(x,y)=info(x)+info(y),且有P(x,y)=P(x)*P(y)。

可以看出,info(x)一定与P(x)的对数有关系(因为log(a) + log(b) = log(a*b)),则info(x) = -logP(x)。(负号是保证信息一定是正数或者是0,底数遵从普遍传统可以定义为2,但只需要信息量满足低概率事件x对应于高的信息量即可。)

2、信息熵

在我们知道了信息量的度量之后,由于他是一个具体事件发生了所带来的信息,那么在事前,因为事件的可能概率和可能结果是不确定的,又如何准确的计算信息量的多少?

这里我们需要引入熵的概念:熵是在事件结果出来之前对可能产生的信息量的期望,则信息熵:所有可能发生事件所带来的信息量的期望(随机变量的所有可能取值)。

香农在1948年的《通信的数学理论》正式提出了信息的度量问题,成为信息论诞生的里程碑。他在进行信息的定量计算时,明确地把信息量定义为随机不定性程度的减少。这表明他对信息的理解是:信息是用来减少随机不定性的东西,则其逆定义:信息是确定性的增加。

香农提出了著名的信息熵H公式:

H=-\Sigma Pi * logPi   

其中,如果对数log的底为2,则计算出来的信息熵就以比特(bit)为单位。并且我们扩展至多概率事件时可以得到 :

 H(X)=-\sum_{1}^n p(x_{i} ) * logp(x_{i})

其中P(xi)代表随机事件X为xi的概率。


log函数图形
log函数常见公式

(题外话:信息熵还可以作为一个系统复杂程度的度量,如果系统越复杂,出现不同情况的种类越多,那么它的信息熵就越大,如果系统越简单,出现不同情况的种类越少,那么信息熵就越小。)

3、条件熵

信息熵是衡量某一单独事件,或者多个相互独立事件的信息量多少,那么如果是多事件且事件之间并不相互独立,或者某一以另一事件的发生为前提,我们应该怎么计算其信息的熵呢,这里我们引入条件熵的概念:在给定事件X的条件下,事件Y的条件概率分布的熵对X的数学期望。

先给出公式:

条件熵公式

H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。

注意:

1、这里是在给定某个数(即某个变量的某个值)的情况下,另一变量的熵是多少,变量的不确定性是多少;

2、这里条件熵中的X也是一个变量,即在一个变量X的条件下,另一变量Y的熵对X的期望;

3、在X的每一个值下,计算一个熵,然后每一个熵乘以各个值的概率,然后相加;

其原理:用另一变量对原变量分类后,原变量的不确定性就会减少,因为增加了X的信息,不确定程度减少了多少就是信息的增益。

三、ID3算法

ID3算法是建立在奥卡姆剃刀(如无必要,勿增实体)的基础上:越是小型的决策树越优于大的决策树。

ID3算法最早由罗斯昆(J. Ross Quinlan)于1975年在悉尼大学提出的一种分类预测算法,算法的核心是“信息熵”。它是一种贪心算法,以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。

ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定集合的测试属性,对被选取的测试属性创建一个节点,并以改节点的属性标记,对该属性的每个值创建一个分支据此划分样本。

信息增益 = 信息熵 - 条件熵

Gain(Y,X) = H(Y) - H(Y|X)

如果将X和Y定义为某一个属性a和样本集合D,则有


信息增益计算公式

信息增益表示得知属性a的信息而使得样本集合D不确定程度的减少。在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.3814最大。

于是我们选择的划分属性为“纹理”,如下:

通过“纹理”属性构建决策树

我们得到了三个子节点,对这三个子节点,我们通过递归使用刚刚的方法进行特征属性的选择,比如:D1(纹理=清晰) = {1, 2, 3, 4, 5, 6, 8, 10, 15},第一个分支结点可用属性集合{色泽、根蒂、敲声、脐部、触感},基于 D1各属性的信息增益,分别求的如下:

“纹理” = 清晰条件下的信息增益

于是我们可以选择特征属性为根蒂,脐部,触感三个特征属性中任选一个(因为他们三个相等并最大),其它俩个子结点同理,然后得到新一层的结点,再递归的由信息增益进行构建树即可。我们最终的决策树如最开始的西瓜树所示。

由此,我们基于信息增益理论,构建了ID3算法的西瓜决策树模型,但是通过上面的计算过程我们可以看出,信息增益准则其实对可取数目较多的属性有所偏好。

加入我们把“编号”也作为一个候选划分属性,且编号唯一,那么我们可以算出编号的信息增益为0.998,因为条件熵为0了,每个结点中只有一类,纯度非常高。也就是说,如果来了一个预测样本,只要告诉我编号,那么其他特征就没用了,这样生成的决策树显然不具有泛化能力。

于是我们引入信息增益率来选择决策树的最优划分属性。

四、C4.5算法

C4.5算法是由Ross Quinlan开发的用于产生决策树的算法,是对ID3算法的一个扩展。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类。C4.5的目标是通过学习,找到一个从属性值到类别的映射关系,并且这个映射能用于对新的类别未知的实体进行分类。

它对ID3算法进行了如下改进:

(1)、用信息增益率来选择属性,克服了信息增益选择属性时对较多数目属性的偏好;

(2)、在树构建过程中进行剪枝;

(3)、能够完成对连续属性的离散化处理;

(4)、能够对不完整数据进行处理;

1、信息增益率:

信息增益率

信息增益率 = 信息增益 / IV(a),即信息增益率是信息增益除以一个属性a的固有值得来的。

这里的IV(a)属性固有值的计算公式:

属性a的固有值

从公式中可以看出,当选取该属性时,分成的V类别数越大,IV(A)就越大,所以让他作为分母,避免了信息增益的缺点。

还是西瓜树的例子,可以计算得到:

IV(触感) = 0.874 ( V = 2 )

IV(色泽) = 1.580 ( V = 3 )

IV(编号) = 4.088 ( V = 17)

当然,C4.5算法也并不直接选取信息增益率最大的候选划分属性(因为其对可取类别数目较少的特征有所偏好:分母越大,整体越小),而是在候选划分属性中找出信息增益高于平均水平的属性(保证大部分好的特征),再从中选择信息增益率最高的(保证不会出现唯一编号特征这样的极端情况)。

其他计算过程与ID3算法无异。

2、连续属性的处理

(1)对特征的取值进行升序排序;

(2)两个特征取值之间的中点作为可能的分裂点,将数据集分成两部分,计算每个可能的分裂点的信息增益(InforGain)。优化算法就是只计算分类属性发生改变的那些特征取值;

(3)选择修正后信息增益(InforGain)最大的分裂点作为该特征的最佳分裂点;

(4)计算最佳分裂点的信息增益率(Gain Ratio)作为特征的Gain Ratio。注意,此处需对最佳分裂点的信息增益进行修正:减去log2(N-1)/|D|(N是连续特征的取值个数,D是训练数据数目,此修正的原因在于:当离散属性和连续属性并存时,C4.5算法倾向于选择连续特征做最佳树分裂点)

3、剪枝

在决策树的创建时,由于数据中的噪声和离群点,许多分枝反映的是训练数据中的异常。剪枝方法是用来处理这种过分拟合数据的问题。通常剪枝方法都是使用统计度量,剪去最不可靠的分枝。

剪枝一般分两种方法:先剪枝和后剪枝。

先剪枝方法中通过提前停止树的构造(比如决定在某个节点不再分裂或划分训练元组的子集)而对树剪枝。一旦停止,这个节点就变成树叶,该树叶可能取它持有的子集最频繁的类作为自己的类。先剪枝有很多方法,比如

(1)当决策树达到一定的高度就停止决策树的生长;

(2)到达此节点的实例具有相同的特征向量,而不必一定属于同一类,也可以停止生长;

(3)到达此节点的实例个数小于某个阈值的时候也可以停止树的生长,不足之处是不能处理那些数据量比较小的特殊情况;

(4)计算每次扩展对系统性能的增益,如果小于某个阈值就可以让它停止生长。

先剪枝有个缺点就是视野效果问题,也就是说在相同的标准下,也许当前扩展不能满足要求,但更进一步扩展又能满足要求。这样会过早停止决策树的生长。

另一种更常用的方法是后剪枝,它由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记。

第一种方法,也是最简单的方法,称之为基于误判的剪枝。这个思路很直接,完全的决策树过度拟合,那我们就再搞一个测试数据集来纠正它。对于完全决策树中的每一个非叶子节点的子树,我们尝试着把它替换成一个叶子节点,该叶子节点的类别我们用子树所覆盖训练样本中存在最多的那个类来代替,这样就产生了一个简化决策树,然后比较这两个决策树在测试数据集中的表现,如果简化决策树在测试数据集中的错误比较少,并且该子树里面没有包含另外一个具有类似特性的子树(所谓类似的特性,指的就是把子树替换成叶子节点后,其测试数据集误判率降低的特性),那么该子树就可以替换成叶子节点。该算法以bottom-up的方式遍历所有的子树,直至没有任何子树可以替换使得测试数据集的表现得以改进时,算法就可以终止。

第一种方法很直接,但是需要一个额外的测试数据集,能不能不要这个额外的数据集呢?为了解决这个问题,于是就提出了悲观剪枝。悲观剪枝就是递归得估算每个内部节点所覆盖样本节点的误判率。剪枝后该内部节点会变成一个叶子节点,该叶子节点的类别为原内部节点的最优叶子节点所决定。然后比较剪枝前后该节点的错误率来决定是否进行剪枝。该方法和前面提到的第一种方法思路是一致的,不同之处在于如何估计剪枝前分类树内部节点的错误率。

五、CART算法

无论是ID3算法的信息增益,还是C4.5算法的信息增益率,都是基于信息论的熵模型,会涉及到大量的对数运算,那么能不能简化模型的同事也不至于完全丢失熵模型的优点呢?

CART算法应运而生,其决策树分类算法使用基尼系数来代替信息增益,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好,这与信息增益恰好相反。并且为了进一步的简化,CART分类每次仅仅对某一特征的值进行二分,而不是多分,构建的是二叉树而不是多叉树。

基尼系数计算公式

其中k代表类别。

基尼系数反映了数据集中随机抽取两个样本,其类别标记不一致的概率。因此基尼指数越小,则数据集纯度越高。基尼指数偏向于特征值较多的特征,类似信息增益。基尼指数可以用来度量任何不均匀分布,是介于 0~1 之间的数,0 是完全相等,1 是完全不相等。

此外,当 CART 为二分类,其表达式为:

二分类基尼系数表达式

我们可以看到在平方运算和二分类的情况下,其运算更加简单。当然其性能也与熵模型非常接近。

那么,基尼指数与熵模型性能接近,但到底与熵模型的差距有多大呢?

我们由泰勒展开式:

ln(1+x)的展开式

可以得到:ln(x)=-1+x+o(x)

则有:

近似函数

基尼指数可以理解为熵模型的一阶泰勒展开。则有一张经典图:

基尼系数与熵关系图

CART树的剪枝策略是一种“基于代价复杂度的剪枝”方法进行后剪枝。这种方法会生成一系列树,每个树都是通过将前面的树的某个或某些子树替换成一个叶节点而得到的,这一系列树中的最后一棵树仅含一个用来预测类别的叶节点。然后用一种成本复杂度的度量准则来判断哪棵子树应该被一个预测类别值的叶节点所代替。这种方法需要使用一个单独的测试数据集来评估所有的树,根据它们在测试数据集熵的分类性能选出最佳的树。

六、总结

我们对比一下ID3、C4.5、CART三者之间的差异

划分标准的差异:ID3 使用信息增益偏向特征值多的特征,C4.5 使用信息增益率克服信息增益的缺点,偏向于特征值小的特征,CART 使用基尼指数克服 C4.5 需要求 log 的巨大计算量,偏向于特征值较多的特征。

使用场景的差异:ID3 和 C4.5 都只能用于分类问题,CART 可以用于分类和回归问题;ID3 和 C4.5 是多叉树,速度较慢,CART 是二叉树,计算速度很快;

样本数据的差异:ID3 只能处理离散数据且缺失值敏感,C4.5 和 CART 可以处理连续性数据且有多种方式处理缺失值;从样本量考虑的话,小样本建议 C4.5、大样本建议 CART。C4.5 处理过程中需对数据集进行多次扫描排序,处理成本耗时较高,而 CART 本身是一种大样本的统计方法,小样本处理下泛化误差较大 ;

样本特征的差异:ID3 和 C4.5 层级之间只使用一次特征,CART 可多次重复使用特征;

剪枝策略的差异:ID3 没有剪枝策略,C4.5 是通过悲观剪枝策略来修正树的准确性,而 CART 是通过代价复杂度剪枝。

七、参考资料

https://zhuanlan.zhihu.com/p/34729077

https://www.cnblogs.com/onemorepoint/p/6762134.html

https://blog.csdn.net/leaf_zizi/article/details/83380081

https://www.cnblogs.com/starfire86/p/5749334.html

https://zhuanlan.zhihu.com/p/85731206

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271