概念
概述
决策树是最简单的机器学习算法,它易于实现,可解释性强,完全符合人类的直观思维,有着广泛的应用。决策树到底是什么?简单地讲,决策树是一棵二叉或多叉树(如果你对树的概念都不清楚,请先去学习数据结构课程),它对数据的属性进行判断,得到分类或回归结果。预测时,在树的内部节点处用某一属性值(特征向量的某一分量)进行判断,根据判断结果决定进入哪个分支节点,直到到达叶子节点处,得到分类或回归结果。这是一种基于if-then-else规则的有监督学习算法,决策树的这些规则通过训练得到,而不是人工制定的。
理论
决策树出现于1980年代。决策树的实现有ID3,C4.5,CART(Classification and Regression Tree,分类与回归树)等方法,它们的区别在于树的结构与构造算法。
决策树是一种判别模型,天然支持多类分类问题。如果用于分类问题,决策树称为分类树;如果用于回归问题,则称为回归树。
分类树对应的映射函数是多维空间的分段线性划分,即用平行于各个坐标轴的超平面对空间进行切分;回归树的映射函数是分段常数函数。
决策树是分段线性函数但不是线性函数,它具有非线性建模的能力。只要划分的足够细,分段常数函数可以逼近闭区间上任意函数到任意指定精度,因此决策树在理论上可以对任意复杂度的数据进行分类或者回归。对于分类问题,如果决策树深度够大,它可以将训练样本集的所有样本正确分类。但如果特征向量的维数过高,可能会遇到维数灾难导致准确率下降。
训练算法
现在要解决的关键问题是怎样用训练样本建立决策树。如果对于分类问题,训练得到的决策树至少要让训练样本尽快能的被分正确。
需要考虑的问题点:
- 如何选择特征属性在决策节点的位置(先后顺序)?
- 选待定一个特征属性后,具体的分类规则是什么?即如何设置阈值条件(数值变量)或者取值集合的子集(类别变量)?
- 何时停止分,把节点设置为叶子节点?
对于分类问题,当节点的样本都属于同一类型时停止,但是这样可能会导致树的节点过多、深度过大,产生过拟合问题。另一种方法是当节点中的样本数小于一个阀值时停止分裂。
下面是具体的解决办法:
递归分裂过程
训练算法是一个递归的过程。首先创建根节点,然后建立左子树和右子树。如果练样本集为D,训练算法的整体流程为:
1.用样本集D建立根节点,找到一个判定规则,将样本集分裂成D1和D2两部分,同时为根节点设置判定规则。
2.用样本集D1递归建立左子树。
3.用样本集D2递归建立右子树。
4.如果不能再进行分裂,则把节点标记为叶子节点,同时为它赋值。
在确定这个递归流程之后,接下来要解决的核心问题是怎样对训练样本集进行分裂。
寻找最佳分裂
对于分类问题,要保证分裂之后左右子树的样本尽可能的纯,即它们的样本尽可能属于不相交的某一类或者几类。为此需要定义不纯度的指标:当样本都属于某一类时不纯度为0;当样本均匀的属于所有类时不纯度最大。
满足这个条件的有熵不纯度,Gini不纯度,以及误分类不纯度,下面分别进行介绍。
不纯度指标用样本集中每类样本出现的概率值构造。因此首先要计算每个类出现的概率,这通过训练样本集中每类样本数除以样本总数得到:
-
样本集的熵不纯度定义
-
样本集的Gini不纯度定义
-
样本集的误分类不纯度定义
叶子节点值的设定
如果不能继续分裂,则将该节点设置为叶子节点。
如果是分类树,则叶子节点的值设置成本节点的训练样本集中出现概率最大的那个类;
如果是回归树,则设置为本节点训练样本标签值的均值。
属性缺失问题
剪枝算法
整个剪枝算法分为两步完成:
第一步先训练出T0,然后用上面的方法逐步剪掉树的所有非叶子节点,直到只剩下根节点得到剪枝后的树序列。这一步的误差计算采用的是训练样本集。
第二步根据真实误差值从上面的树序列中挑选出一棵树作为剪枝后的结果。这可以通过交叉验证实现,用交叉验证的测试集对上一步得到的树序列的每一棵树进行测试,得到这些树的错误率,然后根据错误率选择最佳的树作为剪枝后的结果。
需要继续参考:2. 集成学习综述-从决策树到XGBoost,完成集成学习
参考: