文章目录
本文主要是对决策树的概念性的归纳和总结。
0x01、决策树的基本概念
决策树是一种由结点和有向边组成的层次结构。树中包含三种结点:根结点、内部结点和叶结点。
决策树通常采用贪心策略,在选择划分数据的属性时,采取局部最优来构造决策树。
1.1 Hunt算法
Hunt算法是ID3、C4.5和CART等决策树算法的基础。
在Hunt算法中,通过将训练记录相继划分成较纯的子集,以递归方式建立决策树。设 D t D_{t} Dt 是与结点 t t t 相关联的训练记录集,而 y = { y 1 , y 2 , . . . , y c } y=\{y_{1}, y_{2}, ..., y_{c}\} y={y1,y2,...,yc} 是类标号,Hunt算法的递归定义如下:
(1)若 D t D_{t} Dt 中所有记录都属于同一个类 ,则 t t t 是叶结点,用 y t y_{t} yt 标记;
(2)若 D t D_{t} Dt 中包含属于多个类的记录,则选择一个属性测试条件(attribute test condition),将记录划分成较小的子集。对于测试条件的每个输出,创建一个子女结点,并根据测试结果将 D t D_{t} Dt 中的记录分布到子女结点中。然后对于每个子女结点,递归地调用该算法。
1.2 决策树归纳的设计问题
(1)如何分裂训练记录?
树增长过程的每个递归步骤都必须选择一个属性测试条件,将记录划分成较小的子集。为了实现这个步骤,算法必须提供为不同类型的属性指定测试条件的方法,并提供评估每种测试条件下的客观度量。
表示属性测试条件的方法:二元属性(只有是或否两个输出)、标称属性(使用多路划分如[{A},{B},{C}],或二元划分如[{A},{B,C}] 或 [{A,C},{B}])、序数属性(可使用二元或多路划分,但不能违背有序性)和连续属性(必须考虑所有可能的划分点并从中选择产生最佳划分的点)。
选择最佳划分的度量:通常是根据划分后子女结点不纯性的程度,不纯的程度越低,类分布就越倾斜。常用的不纯性度量有gini系数,熵(entropy),分类误差(classification error)等。
(2)如何停止分裂过程?
需要有结束条件,以终止决策树的生长过程。一个可能的策略时分裂结点,直到所有的记录都属于同一个类,或者所有的记录都具有相同的属性。尽管两个结束条件对于结束决策树归纳算法都是充分的,但还是可以使用其他的标准提前终止树的生长过程。
1.3 决策树归纳算法的框架
算法的输入是训练集 E 和属性集 F。算法递归地选择最优的属性来划分数据,并扩展树的叶结点,直到满足结束条件。决策树归纳算法的框架如下:
TreeGrowth(E,F)
if stopping_condition(E,F) == True:
leaf = createNode()
leaf.label = Classify(E)
return leaf
else:
root = createNode()
root.test_condition = find_best_split(E,F)
令V = {v|v是root.test_condition的一个可能的输出}
for v in V:
Ev = {e|root.test_condition(e) = v and (e in E)}
child = TreeGrowth(Ev,F)
将child作为root的派生结点添加到树中,并将边(root->child)记为v
return root
几个关键函数如下:
函数 | 说明 |
---|---|
createNode() | 为决策树建立新结点。决策树的结点或是一个测试条件(记为node.test_condition),或是一个类标号(记为node.label)。 |
find_best_split() | 确定应当选择哪个属性作为划分训练记录的测试条件。如gini系数、熵、分类误差等。 |
Classify() | 为叶结点确定类标号。在大多数情况下,将叶结点指派到具有多数记录的类,还可以用来估计分配到叶结点的记录属于该类的概率。 |
stopping_condition() | 决定是否终止决策树的增长。可通过检查是否所有的记录都属于同一个类,或都具有相同的属性值;也可检查记录数是否小于某个最小阈值。 |
0x02、决策树的过拟合
分类模型的误差可分为:训练误差(training error)和泛化误差(generalization error)。训练误差是在训练记录上误分类样本比例,泛化误差是模型在未知记录上的期望误差。一个好的分类模型必须具有低训练误差和低泛化误差。
- 欠拟合(underfitting):模型尚未学习到数据的真实结构,训练和泛化误差都很大。
- 过拟合(overfitting):训练误差较低但泛化误差较高。造成过拟合的原因有噪声,样本缺乏代表性、模型过于复杂等。
2.1 泛化误差估计
理想的模型复杂度是能产生最低泛化误差的模型的复杂度。但建立模型过程中无法知道在未知记录上的性能,所能做的就是估计模型的泛化误差。几个方法如下:
方法 | 描述 |
---|---|
使用再代入估计 | 简单地选择最低训练误差的模型作为最终的模型。假设训练集可以很好地代表整体数据,使用训练误差(又称再代入误差)提供对泛化误差的乐观估计。 |
结合模型复杂度 | 奥卡姆剃刀(Occam’s razor):对两个具有相同泛化误差的模型,较简单的模型比较复杂的模型更可取。(节俭原则)常用的有:悲观误差评估(pessimistic error estimate)、最小描述长度(minimum description length, MDL)等。 |
估计统计上界 | 因为泛化误差倾向于比训练误差大,所以统计修正通常是计算训练误差的上界,考虑到达决策树一个特定结点的训练记录数。 |
使用确认集 | 把原始的训练集分为两个较小的子集,一个子集用于训练,另一个称作确认集,用于估计泛化误差。该方法常用于通过参数控制获得具有不同复杂度模型的分类技术。通过调整学习算法中的参数,知道学习算法产生的模型在确认集上达到最低的错误率,可以估计最佳模型的复杂度。 |
2.2 过拟合的处理方法
(1)先剪枝(提前终止规则)
树增长算法在产生完全拟合整个训练数据集的完全增长的决策树之前就停止决策树的生长。优点在于避免产生过分拟合训练集的过于复杂的子树,但很难为提前终止选取正确的阈值。
(2)后剪枝
初始决策树按照最大规模生长,然后进行剪枝的步骤,按照自底向上的方式修剪完全增长的决策树。有两种做法:用新的叶子结点替换子树,该叶结点的类标号由子树下记录中的多数类确定;或用子树中最常使用的分支代替子树。当模型不能再改进时终止剪枝步骤。
决策树剪枝往往通过极小化决策树整体损失函数(loss function)或代价函数(cost function)来实现。
0x03、评估分类器的性能
比较不同分类器在相同领域上的性能,以确定在给定的数据集上哪个分类器效果更好。
1、保持方法(holdout)
将被标记的原始数据划分成两个不相交的集合,分别称为训练集和检验集。在训练集上归纳分类模型,在检验集上评估模型的性能。分类器的准确率根据模型在检验集上的准确率估计。
2、随机二次抽样(random subsampling)
多次重复保持方法来改进对分类器性能的估计。
3、交叉验证(cross validation)
随机二次抽样的改进。每个记录用于训练的次数相同,且恰好检验一次。K 折(K-Fold)交叉验证是把数据集分成大小相同的K 份,每次选择其中一份作检验集,其余的全作为训练集,该过程重复 K 次,使得每份数据都用于检验恰好一次。总误差是所有K 次运行的误差之和。该方法的优点是使用尽可能多的训练记录,此外检验集之间至互斥的,并且有效地覆盖了整个数据集;缺点是整个过程重复 K 次,计算开销较大。
4、自助法(bootstrap)
训练记录采用有放回抽样,即已经选作训练的记录将放回原来的记录集中,使得它等几率地重新被抽中。如果原始数据有N个记录,平均来说,大小为N的自助样本大约包含原始数据中63.2%的记录。没有抽中的记录就成为检验集的一部分,将训练集建立的模型应用到检验集上,得到自助样本准确率的一个估计。
0x04、决策树的总结
4.1 决策树算法的要点
这些要点也是各种不同决策树算法的区别所在。
(1)划分度量选择方法:常用方法有gini系数、熵(entropy)、分类误差(classification error)等;
(2)划分记录的方法:仅二元划分/多元划分/连续属性划分;
(3)停止分裂的方法:限制决策树层数、限制叶结点个数,限制叶结点最大记录数、限制内部结点最小不纯度,等;
(4)剪枝方法:先剪枝 或 后剪枝,等。
4.2 算法比较
常见的算法有ID3,C4.5,CART等算法,对这些算法做个比较如下:
KEY POINT/算法名称 | ID3 | C4.5 | CART分类树 |
---|---|---|---|
特征选择 | 信息增益, 选择信息增益最大的特征 | 信息增益率, 选择信息增益比最大的特征 | 基尼系数(gini), 选择基尼系数最小的特征 |
记录划分 | 多元划分 | 多元划分 | 仅二元划分 |
停止分裂条件 | 信息增益小于阈值 | 信息增益比小于阈值 | 基尼系数小于阈值,或样本个数小于阈值 |
剪枝方法 | 不支持 | 悲观错误剪枝 | 令损失函数最小, 或使用基尼系数度量损失 |
4.3 决策树算法的优缺点
1、优点:
- 简单直观,在逻辑上比较容易解释;
- 基本不需要预处理,不需要归一化和处理缺失值;
- 既可以处理离散值也可以处理连续值;
- 可以处理多分类问题;
- 使用决策树预测的代价是 ,m是样本数;
- 对异常点的容错能力好,健壮性高。
2、缺点:
- 非常容易过拟合,导致泛化能力不强。可通过限制树的深度和设置结点最少样本数来改进;
- 会因为样本的一点改进,导致树的结构剧烈变动。可以通过集成学习方法来改进;
- 若某些特征的样本比例过大,生成的树容易偏向这些特征。可通过调节样本权重来改进;
- 寻找最优的决策树是一个NP难题,容易陷入局部最优。可通过集成学习方法改进;
- 很难学习比较复杂的关系(如异或)。可换用神经网络方法来学习。
下一篇将会介绍CART算法。
参考资料
- 数据挖掘导论(Introducition to Data Mining)
- 决策树及其变种算法-知乎
- 数据挖掘和机器学习之间,主要有什么区别和联系?-CSDN
- 决策树算法原理(CART分类树)- 博客园