机器学习算法之决策树

决策树

概述

决策树(Decision Tree)是一种常用的机器学习方法,是一种对实例进行分类的树形结构。以二分类问题为例,假设我们要对是否买西瓜进行决策。
定义决策树结构包括:

  1. 内部结点:属性
  2. 分支:属性值
  3. 叶子结点:分类结果

于是,学习过程就是通过对训练样本的训练来确定“划分属性”(即内部结点对应的属性);预测过程则是将测试用例从根节点开始,沿着树形结构下行,直到叶结点。
具体结构举例:

图片.png

从代码角度,决策树可以看成一段嵌套的if-else语句,示例中的决策树完全可以看成如下代码:

if is_red:
    if is_cold:
        if has_seed:
            print("buy")
        else:
            print("don't buy")
    else:
        if is_cheap:
            print("buy")
        else:
            print("don't buy")
else:
    print("don't buy")

决策树的根节点(root node)到叶结点(leaf node)的每一条路径构成一条规则:路径上的内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。其基本策略是“分而治之”(divide-and-conquer),即在自根至叶的递归过程中,在每个中间结点寻找一个“划分”(split or test)属性

决策树学习时,利用训练数据,根据损失函数最小化原则建立决策树模型,通常包括三个步骤:特征选择决策树的生成决策树的修剪。主要的决策树算法包括ID3算法、C4.5算法和CART算法。


特征选择

特征选择在于选取对训练数据具有分类能力的特征,一个合适的特征可以极大提高决策树的学习效率。相反,如果利用一个特征进行分类的结果与随机分类的结果没有很大的差别,则认为该特征没有分类能力。特征选择的标准一般有三类:信息增益、信息增益比和基尼指数。

熵(entropy)表示随机变量的不确定性。假设X是一个有限离散随机变量,其概率分布为
P(X = x_i) = p_i, \quad i = 1, 2, \cdots, n
则随机变量X的熵为:
H(x) = - \sum_{i=1}^n p_i \log p_i

条件熵

设有随机变量(X, Y),其联合概率分布为:
P(X=x_i, Y=y_i) = p_{ij}, \quad i = 1, 2, \cdots, n; \quad j = 1, 2, \cdots, m
随机变量X给定的条件下随机变量Y的条件熵(conditional entropy)H(Y \mid X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:
H(Y \mid X) = \sum_{i=1}^n p_i H(Y \mid X = x_i)其中,p_i = P(X = x_i), \quad i = 1, 2, \cdots, n

信息增益

信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。定义特征A对训练数据集D的信息增益g(D,A)为:
g(D,A) = H(D) - H(D \mid A)H(Y)与条件熵H(Y \mid X)之差称为互信息(mutual information),于是决策树学习中的信息增益等价于训练数据集中类和特征的互信息。
此外,当熵和条件熵中的概率有数据估计得到时,所对应的熵和条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。

信息增益算法

输入:训练数据集D和特征A
输出:特征A对训练数据集D的信息增益g(D,A)

  1. 计算数据集D的经验熵H(D)
    H(D) = - \sum_{k=1}^K \frac {\mid C_k \mid} {\mid D \mid} \log_2 \frac {\mid C_k \mid} {\mid D \mid}
  2. 计算特征A对数据集D的经验条件熵H(D \mid A)
    H(D \mid A) = \sum_{i=1}^n \frac {\mid D_i \mid}{\mid D \mid} H(D_i) = - \sum_{i=1}^n \frac {\mid D_i \mid}{\mid D \mid} \sum_{k=1}^K \frac {\mid C_k \mid} {\mid D \mid} \log_2 \frac {\mid C_k \mid} {\mid D \mid}
  3. 计算信息增益
    g(D,A) = H(D) - H(D \mid A)

信息增益比

信息增益值的大小是相对于训练数据集而言的,并没有绝对意义,比如在训练数据集的经验熵大的时候,信息增益值会偏大。利用信息增益比(information gain ratio)对这一问题进行校正,定义特征A对训练数据集D的信息增益比g_R(D,A)为:
g_R(D,A) = \frac {g(D,A)} {H(D)}

基尼指数

CART决策树使用基尼指数(Gini index)来选择划分属性,基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)则表示经A = a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
分类问题中,假设有K个类,样本点属于第k类的概率为p_k,则概率分布的基尼指数定义为
Gini(p) = \sum_{k=1}^K p_k (1 - p_k) = 1 - \sum_{k=1}^K p_k^2对于给定的样本集合D,其基尼指数为
Gini(D) = 1 - \sum_{k=1}^K (\frac {\mid C_k \mid} {\mid D \mid})^2
其中,C_kD中属于第k类的样本子集,K是类的个数。
如果样本集合D根据特征A是否取某一可能值a被分割成D_1D_2两部分,则在特征A的条件下,集合D的基尼指数定义为
Gini(D, A) = \frac {\mid D_1 \mid} {\mid D \mid} Gini (D_1) + \frac {\mid D_2 \mid} {\mid D \mid}Gini (D_2)


决策树的生成

ID3算法

ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归调用以上方法,构建决策树。

具体流程

输入:训练数据集D,特征集A,阈值\varepsilon
输出:决策树T

  1. D中所有实例属于同一类C_k,则T为单结点树,并将类C_k作为该结点的类标记,返回T
  2. A = \varnothing,则T为单结点树,并将T中实例数量最大的类C_k作为该结点的类标记,返回T
  3. 否则,计算A中各特征对D的信息增益,选择信息增益最大的特征A_g
  4. 如果A_g的信息增益小于阈值\varepsilon,则置T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T
  5. 否则,对A_g的每一个可能指a_i,依照A_g = a_iD分割为若干非空自己D_i,将D_i中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T
  6. 对第i个子节点,以D_i为训练集,以A - \{ A_g \}为特征集,递归地调用前5步,得到子树T_i,返回T_i

C4.5算法

C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进。C4.5在生成过程中选择用信息增益比来选择特征。

具体流程

输入:训练数据集D,特征集A,阈值\varepsilon
输出:决策树T

  1. D中所有实例属于同一类C_k,则T为单结点树,并将类C_k作为该结点的类标记,返回T
  2. A = \varnothing,则T为单结点树,并将T中实例数量最大的类C_k作为该结点的类标记,返回T
  3. 否则,计算A中各特征对D的信息增益比,选择信息增益比最大的特征A_g
  4. 如果A_g的信息增益比小于阈值\varepsilon,则置T为单结点树,并将D中实例数最大的类C_k作为该结点的类标记,返回T
  5. 否则,对A_g的每一个可能指a_i,依照A_g = a_iD分割为若干非空自己D_i,将D_i中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T
  6. 对第i个子节点,以D_i为训练集,以A - \{ A_g \}为特征集,递归地调用前5步,得到子树T_i,返回T_i

CART算法

CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为"是"和"否",这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测地概率分布,也就是在给定地条件下输出地条件概率分布。
CART算法由以下两步组成:

  1. 决策树生成:基于训练数据集生成决策树,生成地决策树要尽量大
  2. 决策树剪枝:用验证数据集对已生成地树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝地标准

CART生成算法

输入:训练数据集D,停止计算的条件;
输出:CART决策树

  1. 假设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,更具样本点对A=a的测试为"是"或"否"将分割成D_1D_2两部分,利用公式计算A=a时的基尼指数。
  2. 在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
  3. 对两个子结点调用前两步,直至满足停止条件。
  4. 生成CART决策树。算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。

CART剪枝算法

输入:CART算法生成的决策树T_0
输出:最优决策树T_\alpha

  1. k=0T=T_0
  2. \alpha = +\infty
  3. 自下而上地对各内部结点t计算C(T_t)\mid T_t \mid以及
    g(t) = \frac {C(t) - C(T_t)} {\mid T_t \mid -1} \alpha = \min(\alpha, g(t)) 这里,T_t表示以t为根结点的子树,C(T_t)是对训练数据的预测误差,\mid T_t \midT_t的叶结点个数。
  4. 自上而下地访问内部结点t,如果g(t) = \alpha,进行剪枝,并对叶结点t以多数表决法决定其类,得到树T
  5. k = k + 1\alpha_k = \alphaT_k = T
  6. 如果T不是根结点单独构成的树,则返回步骤4
  7. 采用交叉验证法在子树序列T_0, T_1, \cdots, T_n中选取最优子树T_\alpha

决策树的修剪

概述

剪枝(pruning)是决策树学习算法处理过拟合问题地主要手段。决策树剪枝地基本策略有"预剪枝"(prepruning)和"后剪枝"(postpruning)。预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点地划分不能带来决策树泛化性能的提升,则停止划分;后剪枝则是先从训练集生成一颗完整地决策树,人后自下而上对非叶结点进行考察,若该结点对应地子树替换为叶结点能带来泛化性能地提升,则将该子树替换成叶结点.

预剪枝

预剪枝就是在决策树生成过程中,在没有划分时,考虑能否带来决策树性能的提升。若可以提升决策树的性能则会进行划分,若不能则停止生长。
常用的方法如下:

  1. 当树的深度达到一定规模时,停止生长
  2. 当前结点的数量达到特定阈值时,停止生长
  3. 计算每次分裂对于测试集性能的提升,当小于指定阈值,甚至有所下降时,停止生长
  4. 当信息增益,信息增益比或基尼指数小于指定阈值时,停止生长

预剪枝优点:思想简单,算法高效,采用了贪心策略,适合大规模问题
预剪枝缺点:提前停止生长,存在欠拟合的风险

后剪枝

后剪枝的主要分类包括:

  • 错误率降低剪枝(Reduce Error Pruning, REP)
  • 悲观剪枝(Pressimistic Error Pruning, PEP)
  • 代价复杂度剪枝(Cost Complexity Pruning, CCP)
  • 最小误差剪枝(Minimum Error Pruning, MEP)
  • CVP(Critical Value Pruning)
  • OPP(Optimal Pruning)

其中,最小误差剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。设树T的叶结点个数为\mid T \midt是树T的叶结点,该叶结点有N_t个样本点,其中k类的样本点有N_{tk}个,k = 1, 2, \cdots, KH_t (T)t上的经验熵,\alpha \geq 0为参数,则决策树学习中的损失函数可以定义为:
C_\alpha (T) = \sum_{t=1}^{\mid T \mid} N_t H_t (T) + \alpha \mid T \mid输入:生成算法产生的整个树T,参数\alpha
输出:修剪后的子树T_\alpha

  1. 计算每个结点的经验熵
  2. 递归地从树的叶结点向上回缩
    设一组叶结点回缩到其父结点之前与之后的整体树分别为T_BT_A,其对应的损失函数分别是C_\alpha (T_B)C_\alpha (T_A),如果
    C_\alpha (T_B) \leq C_\alpha (T_A)则进行剪枝,即将父节点变成新的叶结点。
  3. 返回步骤2,直至不能继续为止,得到损失函数最小的子树T_\alpha

后剪枝优点:可以最大限度的保留树的各个结点,避免了欠拟合的风险
后剪枝缺点:相较于预剪枝的时间开销大

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

推荐阅读更多精彩内容