经典监督式学习算法 - 决策树

avatar
阿里巴巴 前端委员会智能化小组 @阿里巴巴

文 / 阿里淘系 - 白罗

作为最经典的机器学习算法之一,决策树(包括其衍生或以其为最小决策单元的算法,包括随机森林、坡度爬升树、XGBoost等)在神经网络盛行的今天,在监督式学习算法家族中,依旧有着重要的地位。

它是一种基于树形模型提供决策能力的机器学习预测模型,树中的每个节点表示对象,而相应的分叉路径代表其属性值,叶子结点则对应从根节点到该叶子结点所经历的路径表示的对象的值。下文将会在阐述决策树的基本原则与原理的基础上,通过一个经典的例子来展示一个基本的决策树模型是如何运作的。 ​

1. 经验风险最小化 (Empirical Risk Minimization)

对于监督式学习任务往往存在以下的训练集和目标: 训练集: S = {(X1, y1), ..., (Xn, yn)} 目标:h: X->y的映射,能在实际任务T中有着较好的表现。(h表示hypothesis) ​

对于模型在真实情景下的运行情况,我们不得而知。但是我们通常会在一组被标记过的训练集上验证模型的性能。而经验风险最小化原理,机器学习算法的最终目标是在一类假设 (a set of hypotheses) 中找到一个在数据集上平均损失函数最小的假设(即风险最小的): ​

**R(h) = E(L(h(x), y)) E表示期望,L表示损失函数 ** ​

当然,这一切都是建立在训练集对真实情况有足够的代表性的前提下。众所周知,在训练集往往对真实情况缺乏代表性,结果就是造成模型的过拟合,类似带答案的习题和期末考试之间的差别。

2. 决策树算法原理 (Decision Tree)

决策树是一种有向无环图 (Directed Acyclic Graph),它的特点是每一个非叶子结点 (non-leaf nodes) 都与一种属性相关联,并且边 (edge) 表示了属性的父节点的值,同时叶子结点 (leaf nodes) 与标签相关联。我们这里可以用一个非常经典的例子来理解决策树算法的基本原理,下面是一个天气状况与决定是否打网球的训练集 (这是一个四维输入一维输出)


这个数据集中,Outlook有Sunny, Overcast, Rain三种状态,Temp有Hot, Mild, Cold三种状态, Humid有High. Normal两种状态,Wind有Weak, Strong两种状态。 因此一共有3x3x2x2=36种组合,每种组合对应Yes和No两种预测结果。因次,对于这个打网球的问题,如果我们想建立一个决策树的模型,这里一共会存在236种不同的假设(hypotheses),而其中哪种假设会是最合适的模型,这便是接下来我们需要讨论的问题。

2.1 奥卡姆剃刀论 (Ockham's Razor)

上一节中我们指出了对于这个训练集一共存在236种不同的决策树模型,而这些可能的模型中,又有多少在这14个样本上(样本不互相矛盾)能做到完全正确的预测模型呢? 答案是2(36-14) = 222种。 ​

十四世纪的方济会修士William of Occam提出过一条经典的逻辑学法则:若无必要,勿增实体 (If not necessary not by entity)。换言之就是一切体系应该尽可能地简单。这条理论可以同先前提到的经验风险最小化结合起来,成为决策树构造设计的基石。由于这是一个NP-Hard问题,为了在222种能达到目的的模型中挑选出最简洁的,我们在这里可以使用一种贪心的递归策略 (Greedy Procedure - Recursive),从根阶段开始进行以下循环: ​

  1. 选择一个合适的属性 (good attribute) 作为结点。
  2. 根据该属性的值 (例如Wind的值就是Strong, Weak) 作为边 (edge) 分裂 (split) 进入不同的子节点。
  3. 如果所有的样本都有相同的标签,这一节点到此为止。(换言之,如果所有样本标签相同,能用一个标签概括这些样本,就没有必要继续分下去了)

2.2 基尼不纯度与交叉熵损失

在决策树的生长策略中,我们提到了每次需要选择一个合适的属性作为节点,事实上我们所要做的事最大化该节点的后代对标签的区分度(减少分类的随机性)。举个例子,属性A沿着0和1两个值生长,子节点上的样本的标签分别为(4 Yes, 4 No), (3 Yes, 3 No)。属性B沿着0和1两个值生长,子节点上的样本标签分别为(8 Yes, 0 No), (0 Yes, 6 No)。那么很明显选择B节点会更具区分度。而量化这种区分度的指标一般可以有两种,基尼不纯度 (Gini Impurity) 和信息增益 (Information Gain),原则上决策树应该沿着基尼指数或者交叉熵损失下降最快的方向上生长。 ​

如果标签的数量分布如下: n1, n2, ......, n****L

那交叉熵损失可以被描述为: ​

H(S) = (n1/n) * log(n/n1) + (n2/n) * log(n/n2) + ...... + (nL/n) * log(n/nL)

通过父节点(S)的交叉熵损失与子节点(v)的加权交叉熵损失之间的差,我们可以求得信息增益: ​

IG(S) = H(S) - (n1/n)H(v1***) - (n2/n)H(v2**) - ...... - (nL**/n)H(vL****)

类似地,基尼指数可以被描述为: ​

**Gini(S) = 1 - (n1/n)2 - (n2/n)2 - ....... - (nL/n)**2

同样地,基尼不纯度可以根据父节点(S)的基尼指数与子节点(v)的加权基尼指数之间的差求得: ​

GiniImp(S) = Gini(S) - (n1/n)Gini(v1***) - (n2/n)Gini(v2**) - ...... - (nL**/n)Gini(vL****)

如果用之前提到的网球的例子,那么一颗完整的决策树用基尼不纯度作为决策方法,它的生长过程会是这样子的。 首先根节点处,在没有使用任何属性时,训练集可分为 (9 Yes, 5 No),相应的基尼指数如下:


分别计算以四种维度的属性作为决策树生长的指标的基尼不纯度:





很明显Outlook属性的基尼不纯度最高,意味着此时选择这一维度生长下去更能区分训练集。


我们可以观察到在Outlook的值为Overcast时,样本为 (4 Yes, 0 No),意味着这一分支全部分类正确,可以终结。如果将Sunny属性计为OS, Rain属性计为OR,接下来的基尼不纯度在选择Outlook - Sunny后可以如下计算:


很明显选择Humidity 能最大程度减小随机性,因此Outlook - Sunny一支的子节点为 Humidity。同时我们观察到此后所有样本皆能正确分类,此分支可终结。 ​

相似地对于Outlook - Rain 一支, 可以计算如下:



显然选择Wind作为子节点能最大程度减小随机性,同时我们观察到此后的样本皆能正确分类,因此此分支终结。 综上所述,我们可以得到如下结构的一棵决策树,这是我们使用了递归贪心策略生成的较优解(在ERM与Ockham's Razor原则指导下):


3. 抑制过拟合

决策树的过拟合抑制策略一般可以分为先剪枝 (Prepruning) 和后剪枝 (Postpruning)。其中先剪枝一般是根据预设的规则(如最大节点数、最大高度、基尼不纯度或者信息增益的增长幅度等)来提前停止树的生长。而后剪枝是在树完全生长后进行修剪,比如根据复杂度对损失增加惩罚项,在后剪枝的过程中,那些对基尼不纯度或者信息增益提升效率低下的分支就会被剔除。



淘系前端-F-x-Team 开通微博 啦!(微博登录后可见)
除文章外还有更多的团队内容等你解锁🔓