前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【分享送书】畅快!5000字通俗讲透决策树基本原理

【分享送书】畅快!5000字通俗讲透决策树基本原理

作者头像
luanhz
发布2021-04-12 11:06:17
5910
发布2021-04-12 11:06:17
举报
文章被收录于专栏:小数志

导读

在当今这个人工智能时代,似乎人人都或多或少听过机器学习算法;而在众多机器学习算法中,决策树则无疑是最重要的经典算法之一。这里,称其最重要的经典算法是因为以此为基础,诞生了一大批集成算法,包括Random Forest、Adaboost、GBDT、xgboost,lightgbm,其中xgboost和lightgbm更是当先炙手可热的大赛算法;而又称其为之一,则是出于严谨和低调。实际上,决策树算法也是个人最喜爱的算法之一(另一个是Naive Bayes),不仅出于其算法思想直观易懂(相较于SVM而言,简直好太多),更在于其较好的效果和巧妙的设计。似乎每个算法从业人员都会开一讲决策树专题,那么今天本文也来达成这一目标。

本文着眼讲述经典的3类决策树算法原理,行文框架如下:

  • 决策树分类的基本思想:switch-case
  • 从ID3到C4.5,如何作出最优的决策?
    • 信息熵增益
    • 信息熵增益比
  • CART树,既可分类又能回归
    • 从信息熵到gini指数
    • 从多叉树到二叉树
    • 从分类树到回归树

01 决策树分类的基本思想:switch-case

决策树算法是机器学习中的一种经典算法,更是很多集成算法的基础。虽说是机器学习,但决策树的基本思想非常符合程序员思维:if-else或者switch-case,即如果满足什么条件则怎么怎么样,否则就另外怎么样。所以,决策树学习的过程就是逐步决策的过程,而决策过程本身则可以绘制成一棵树,当然这里的树是指数据结构与算法中的树。

决策树的基本思想很简单,那么执行决策树的训练过程其实无非就是以下几步:

  • 拿什么做决策——最优决策特征选取
  • 什么时候停止——决策树分裂的终止条件
  • 决策结果如何——最终叶子节点的取值

本文围绕决策树的这3个关键环节展开介绍。

02 从ID3到C4.5,如何作出最优的决策

首先进入大众视野的决策树是ID3(Iterative Dichotomiser 3,即第三代迭代二叉树),这里称之为第三代,但似乎不存在所谓的第一代或第二代的前置版本;另外,虽然叫二叉树,但ID3算法生成的决策树确是一个十足的多叉树。那么,ID3算法是基本原理是怎样的呢?

1)经典ID3算法的基本原理

如前所述,构建一颗决策树首先要明确如何做出最优决策,具体到机器学习场景,那么就是从众多潜在的特征中选择一个最优的特征进行分裂。所以,这里的问题进一步等价于如何定义“最优”的特征。

在ID3算法中,引入了信息熵原理来反映特征重要性。这里,信息熵既是一个通信学上的概念,而其中的熵则要追溯到物理学。来源于何处并不重要,关键的是信息熵可以用于表征一个事件的不确定程度。这里不确定程度用通信学的角度讲,就是蕴含的信息量。当然,为了使得机器学习的结果尽可能准确,我们当然是希望能尽可能的通过一个个的特征消除这种不确定性,或者说不希望它有太多的信息量。

如何理解这里的信息量呢?更具体说,如何通过信息熵来反应信息量?举个例子:比如看一场足球赛事,如果对阵双方实力悬殊,那么我们一般称之为没什么看点——毫无信息量;而如果双方实力在伯仲之间,则比赛结果则会很有看点——信息量丰富!这一事件可抽象为如下数学描述:球队A和球队B,各自胜率分别为pA和pB,显然pA+pB=1(假设该赛事不接受平局结果,必须分出胜负),球队实力悬殊意味着pA>>pB或pA<<pB;实力伯仲之间意味着pA≈pB,进而该事件的信息熵可用如下公式计算:

H = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + (1-p_A)log(1-p_A))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + (1-p_A)log(1-p_A))

将上述公式取值随pA在(0, 1)之间变化的取值结果绘制可视化曲线如下:

H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))

将上述过程进行数学描述,即为:设选取特征F具有K个取值(特征F为离散型特征),则选取特征F参与决策树训练意味着将原来的样本集分裂为K个子集,在每个子集内部独立计算信息熵,进而以特征F分裂后的条件信息熵为:

H_F =\Sigma_{i=1}^K\frac{||F_i||}{||F||}*H_{F_i}
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))

其中||Fi||为特征F第i个取值的个数,而||F||则为特征F的总数(即样本集总数)。进而,选取特征F训练带来的信息熵增益(即,带来的不确定性降低)可计算为:

G_{F} = H - H_F
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
  • 所有特征全部用完;
  • 分裂后的样本子集是纯的,即相应分支上的信息熵为0;
  • 达到预定的决策树分裂深度,即最大深度;
  • 分裂后的样本子集数量少于预定叶子节点样本数时;
  • 分裂带来的信息熵增益小于指定增益阈值时
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
H(D) = p_Alog(\frac{1}{p_A}) + p_Blog(\frac{1}{p_B}) = -(p_Alog(p_A) + p_Blog(p_B))
  • 仅支持离散特征,如果是特征连续则首先需要离散化处理;
  • 采用信息熵增益选择最优特征参与训练,在同等条件下,取值种类多的特征比取值种类少的特征更占优势。

针对第二个缺陷,C4.5决策算法给出了解决方案。

2)C4.5决策树算法基本原理

ID3算法中,在寻找最优特征参与分裂时,会逐一遍历选取能带来最大信息熵增益的特征,而不考虑该特征的自身情况。这里,特征自身情况是指该特征可能的取值数目和分布情况。所以在C4.5版本决策树中,最大的改进则在于将分裂准则从信息熵增益变为信息熵增益比,即信息熵增益与特征自身信息熵的比值。具体的数据表述即为:

G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}

其中,分母部分即为选取特征F自身的信息熵。虽然仅此一处细节改动,但却有效抑制了分裂过程中对取值数目较多特征的偏好,一定程度上保证了决策树训练过程的高效。

另外,C4.5决策树还有其他比较重要的优化设计,例如支持特征缺失值的处理以及增加了剪枝策略等,此处不做展开。

通过以上,我们介绍了决策树的两个经典版本:ID3和C4.5,其中前者作为决策树首个进入大众视野的版本,引入了信息熵原理参与特征的选择和分裂,明确了决策树终止分裂的条件;而C4.5则在ID3的基础上,优化了信息熵增益分裂准则偏好选择取值较多特征的弊端,改用信息熵增益比的准则进行分裂。但同时,C4.5版本决策树仍然存在以下弊端:

  • 仍然仅支持离散特征的训练
  • 生成的决策树是一个多叉树,从计算机的视角来看不如二叉树简单;
  • 无论是信息熵增益还是增益比,都涉及大量的对数计算,计算效率低下;
  • 仍然仅可用于分类任务,对于回归预测无能为力。

对此,一个更高级版本的决策树算法应运而生,CART树,也是当前工业界一直沿用的决策树算法。

03 CART树,既可分类又能回归的全能选手

CART(Classification And Regression Tree,顾名思义,分类和回归树)决策树的提出正是为了解决ID3和C4.5版本中存在的局限性,包括不支持连续型特征、对数计算效率低、多叉树更为复杂以及不能用于回归预测任务。CART树给出了全部的解决方案:

  • 特征选取准则由信息熵改用gini指数,并由多叉改为二叉,同时避免了对数运算;
  • 增加MSE准则,用于回归训练任务

首先介绍第一个大的改进:信息熵到gini指数。

取经于通信学原理,ID3和C4.5均采用信息熵来评判特征的优劣。再看单个事件信息熵的计算公式:

H = -\Sigma_{i=1}^N p_i*log(p_i)

容易理解,该信息熵由事件的各种可能取值对应熵的加和得到,其中每种取值的熵为其概率与概率对数值的乘积得到(由于概率<=1,其对数值<=0),同时为了保证信息熵大于0更易于理解,且信息熵计算结果越大表征更多的信息量,对最终结果取负数作为最终的信息熵增益。那么为了避免对数运算而又不影响计算结果的单调性,将log(p)直接用p替代显然是可行的方案。此时计算过程即为该事件各种取值概率平方的加和,且加和计算结果仍然是取值越大、信息量越大。但此时存在的一个问题是最终结果是负数,不符合常规的信息量的理解,所以进一步将此结果+1,即得到gini指数计算公式如下:

gini =1 -\Sigma_{i=1}^N p_i*p_i
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}

可见,从信息熵演变为gini指数是一个自然的迭代思路,但计算效率将会大大提升。这里,补充信息熵与gini指数取值的可视化对比曲线,仍以前述的球赛结果概率为例:

然后介绍CART树的第二处改进:分裂方式。

G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}

最后,介绍CART树如何从分类向回归的延伸。

G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}
G_{F ratio} = \frac{H - H_F}{-\Sigma_{i=1}^{K}\frac{||F_i||}{||F||}*log(\frac{||F_i||}{||F||})}

04 小结

决策树是机器学习中的一个经典算法,主要历经了ID3、C4.5和CART树三大版本,算法原理较为直观易懂,改进迭代的过程也容易理解,尤其是以决策树算法为基础更衍生了众多的集成学习算法。除了本文讲述的基本原理外,决策树的另一大核心就是剪枝策略,这将在后续篇幅中予以阐释。


最后,感谢清华大学出版社为本公众号读者赞助《数据科学实战入门 使用Python和R》一本,截止下周二(3月30日)早9点,公众号后台查看分享最多的前3名读者随机指定一人,中奖读者将在周四或周五推文中公布。

推荐语:本书为没有数据分析和编程经验的读者编写,主题涵盖数据准备、探索性数据分析、准备建模数据、决策树、模型评估、错误分类代价、朴素贝叶斯分类、神经网络、聚类、回归建模、降维和关联规则挖掘。在首先讲解Pyhton和R入门知识的基础上,此后每一章都提供了使用Python和R解决数据科学问题的分步说明和实践演练,读者将一站式学习如何使用Python和R进行数据科学实践。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小数志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档