决策树

来源:互联网 发布:360如何优化系统 编辑:程序博客网 时间:2024/06/10 06:25

决策树的工作原理

从树的根节点开始,将测试条件用于检验记录,根据测试结果选择适当的分支。沿着该分支或者到达另一个内部结点,使用新的测试条件,或者到达一个叶结点。到达叶结点以后,叶节点的类称号就被赋值给该检验记录。

如何建立决策树

原则来讲,对于给定的属性集,可以构造的决策树的数目达到指数级。尽管某些决策树比其他决策树更准确,但是由于搜索空间是指数规模的,找出最佳决策树在计算上是不可行的

尽管如此,人们还是开发了一些有效的算法,能够在合理的时间内构造出具有一定准确率次最优决策树。这些算法通常都采用贪心策略,在选择划分数据的属性时,采用一系列局部最优决策来构造决策树,Hunt算法就是一种这样的算法。

Hunt算法

Hunt算法是许多决策树算法的基础,包括ID3、C4.5和CART

在Hunt算法中,通过将训练记录相继划分成较纯的子集,以递归方式建立决策树。设Dt是与结点t相关联的训练记录集,而y = {y1, y2, …, yc}是类标号,Hunt算法的递归定义如下:

  1. 如果Dt中所有记录都属于同一个类yt,则t是叶结点,用yt标记。
  2. 如果Dt中包含属于多个类的记录,则选择一个属性测试条件,将记录划分成较小的子集。对于测试条件的每个输出,创建一个子女结点,并根据测试结构将Dt中的记录分布到子女绩点中。然后对每个子女结点,递归地调用该算法

如果属性值的每种组合都在训练数据中出现,并且每种组合都具有唯一的类标号,则Hunt算法是有效的。但是对于大多数实际情况,这些假设太苛刻了,因此,需要附加的条件来处理一下的情况。

  1. 算法的第二部所创建的子女结点可能为空,即不存在与这些结点相关联的记录。如果没有一个训练记录包含与这样的结点相关联的属性值组合,这种情形就可能发生。这时,该结点成为叶结点,类标号为其父结点上训练记录中的多数类。
  2. 在第二步,如果与Dt相关联的所有记录都具有相同的属性值(目标属性值以外),则不可能进一步划分这些记录。在这种情况下,该结点为叶结点,其标号为与该结点相关联的训练记录中的多数类。

决策树归纳的设计问题

  1. 如何分裂训练记录?
    树增长过程的每个递归步都必须选择一个属性测试条件,将记录划分成较小的子集。
  2. 如何停止分类?
    需要有结束条件,以终止决策树的生长过程。一个可能的策略是分裂绩点,直到所有的记录都属于同一个类,或者所有的记录都具有相同的属性值
    尽管上面的结束条件对于结束决策树归纳算法都是充分的,但是还可以使用其他的标准提前终止树的生长过程。提前终止的有点将在后面讨论

表示属性测试条件的方法

二元属性

标称属性

由于标称属性具有多个属性值,它的测试条件可以用两种方法来表示:
1. 多路划分,其输出数取决于该属性不同属性值的个数。
2. 某些决策树算法(如CART)只产生二元划分,它们考虑创建k个属性值的二元划分的所有2k11种方法(等价于K路划分)

序数属性 (?)

序数属性也可以产生二元或多路划分,只要不违背序数属性值的有序性,就可以对属性值进行分组。比如,不要把小号和大号分一组,把中号和加大号分一组。(我个人觉得这个可不一定,比如小号和大号一般符合中国人,而中号和加大号一般符合外国人,这样分就很合理了)

连续属性 (?)

对于连续属性来说,测试条件可以是具有二元输出的比较测试,也可以是多元输出的范围查询。
1. 对于二元划分,决策树算法必须考虑所有可能的划分点
2. 对于多路划分,算法必须考虑所有可能的连续值区间
可以采用离散化的策略,离散化之后,每个离散化区间赋予一个新的序数值,只要保持有序性,相邻的值还可以聚集成较宽的区间。(见离散化和二元化)

选择最佳划分的度量

基本概念

度量集合的不纯性:

  1. 熵(Entropy)
    Entropy(t)=i=0c1p(i|t)log2p(i|t)
  2. 基尼系数(Gini)
    Gini(t)=1i=0c1[p(i|t)]2
  3. 分类错误(Classification error)
    Classificationerror(t)=1maxi[p(i|t)]

思考:二元分类问题不纯性度量之间的比较
这里写图片描述

划分得到多个子女集合的总体的不纯性度量:

Ichilderen=j=1kp(vj)I(vj)

划分后的信息增益:

Δinfo=IparentIchildren

注意:对于标称属性的划分中,多路划分的纯度明显高于二路划分的纯度

关于连续属性的划分

增益率

熵和Gini指标等不纯度量趋向有利于具有大量不同值的属性。举个极端的例子,比如利用ID进行划分,必定能得到更纯的划分,然而ID却不是一个有预测性的属性,因为每个样在该属性上的值都是唯一的。

即使在不太极端情形下,也不会希望产生大量输出的测试条件,因为与每个划分相关联的记录太少,以致不能作出可靠的预测

我们一定要记住,建模为的是预测,是泛化误差尽可能低,并不等价与训练误差低。

解决该问题的策略

第一种策略是限制测试条件只能是二元划分CART这样的决策树算法采用的就是这种策略。

另一种策略是修改评估划分的标准,把属性测试条件产生的输出数也考虑进去,例如,决策树算法C4.5采用称作增益率(gain ratio)的划分标准来评估划分

Gain Ratio=ΔinfoSplit Info

Split Info=j=1kp(vj)log2p(vj)

例如,如果每个属性值具有相同的记录数,则Split Info=log2k。若k足够大,则Split Info会十分大,从而降低了增益率。

思考:为什么不Split Info=k?
个人认为,线性型的分母会对对数型的分子影响会很大,功高盖主了。

决策树归纳算法

决策树归纳算法的框架

# E: 训练记录集# F: 属性集TreeGrowth(E, F)    if stopping_cond(E, F) = true then        leaf = createNode()        leaf.label = Classify(E)        return leaf    else        root = createNode()        root.test_cond = find_best_split(E, F)        令V = {v|v是root.test_cond的一个可能的输出}        for 每个v属于V do            Ev = {e|roo.test_cond(e)=v 并且 e属于E}            child = TreeGrowth(Ev, F)            将child作为root的派生结点添加到树中,            并将边(root->child)标记为v        end for    end if    return root

建立决策树之后,可以进行树剪枝(tree-pruning),以减小决策树的规模。

决策树过大容易受所谓过拟合(overfitting)现象的影响。通过修剪初始决策树的分支,剪枝有助于提高决策树的泛化能力。

决策树归纳的特点

下面是对决策树归纳算法重要特点的总结。
1. 决策树归纳是一种构建分类模型的非参数方法。换句话说,它不要求任何先验假设,不假定类和其他属性服从一定的概率分布
2. 找到最佳的决策树是NP完全问题。许多决策树算法都采取启发式的方法指导对假设空间的搜索。我们常用一种贪心的、自顶向下的递归划分策略建立决策树。
3. 已开发的构建决策树技术不需要昂贵的计算代价,即使训练集非常大,也可以快速建立模型。此外,决策树一旦建立,未知样本分类非常快,最坏情况下的时间复杂度是O(w),其中w是树的最大深度。
4. 决策树相对容易解释,特别是小型的决策树。在很多简单的数据集上,决策树的准确率也可以与其他分类算法相媲美。
5. 决策树是学习离散值函数的典型代表。然而,它不能很好地推广到某些特定的布尔函数。
一个著名的例子是奇偶函数,当奇数(偶数)个布尔属性为真时其值为0(1)。对于这样的函数准确建模需要一棵具有2d+11个结点的满决策树,其中d是布尔属性的个数。(每次利用属性划分后,子集合中值为0/1的比例仍然一样
6. 决策树算法对于噪声的干扰具有相当好的鲁棒性,采用避免过拟合的方法之后尤其如此。
7. 冗余属性不会对决策树的准确率造成不利的影响。一个数据如果在数据中它与另一个属性是强相关的,那么它是冗余的。在两个冗余的属性中,如果已经选择其中一个座位划分属性,则另一个将会被忽略
然而,如果数据集中含有很多无用的属性(即对分类任务没有用的属性),则某些无用属性可能在树的构造过程中偶然被选中,导致决策树过于庞大。通过在预处理阶段删除不相关属性,特征选择技术能够帮助提高决策树的准确率。我们将在后面考察不相关属性过多的问题。
8. 由于大多数的决策树算法都采用自顶向下的递归划分方法,因此沿着树向下,记录会越小。在叶结点,记录可能太少,对于叶结点代表的类,不能作出具有统计意义的判断,这就是所谓的数据碎片(data fragmentation)问题。解决该问题的一种可行的方法是,当样本数小于某个特定阈值时停止分裂
9. 子树可能在决策树中重复多次,这使得决策树过于复杂,并且可能更难解释。由于大多数的决策树算法都采用分治划分策略,因此在属性空间的不同部分可以使用相同的测试条件,从而导致子树重复问题。
10. 前面介绍的测试条件每次都只涉及一个属性。这样,可以将决策树的生长过程看成划分属性空间为不相交的区域的过程,直到每个区域都只包含同一类的记录。
这里写图片描述

两个不同类的相邻区域之间的边界称作决策边界(decision boundary)。由于测试条件只涉及单个属性,因此决策边界是直线,即平行于”坐标轴”,这就限制了决策树对连续属性之间复杂关系建模的表达能力
这里写图片描述

斜决策树(oblique decision tree)可以克服以上的局限,因为它允许测试条件涉及多个属性。如上面的数据集可以很容易地用斜决策树表示,该斜决策树只有一个结点,其测试条件为:x+y < 1。尽管这种技术具有更强的表达能力,并且能够产生更紧凑的决策树,但是为给定的结点找出最佳测试条件的计算可能是相当复杂的

构造归纳(constructive induction)另一种将数据划分成齐次非矩阵区域的方法,该方法创建符合属性,代表已有属性的算术或逻辑组合.

与斜决策树不同,构造归纳不需要昂贵的花费,因为在构造决策树之前,它只需要一次性地确定属性的所有相关组合。相比之下,在扩展每个内部结点时,斜决策树都需要动态地确定正确的属性组合
11. 研究表明不纯性度量方法的选择对决策树算法的性能影响很小,这是因为许多度量方法相互之间都是一致的。实际上,树剪枝对最终决策树的影响比不纯性度量的选择的影响更大

原创粉丝点击