决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
机器学习中,决策树是一个预测模型;他代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。
决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。数据挖掘中决策树是一种经常要用到的技术,可以用于分析数据,同样也可以用来作预测。简而言之,决策树(decision tree)是一种基本的分类与回归方法。
在分类问题中,表示基于特征对实例进行分类的过程。它可以被认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要有点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策书模型进行分类。
从数据产生决策树的机器学习技术叫做决策树学习。决策树学习通常包括3个步骤:特征选择、决策树的生成和修剪。
决策树算法 | 算法描述 |
ID3算法 | 其核心是在决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点时所应采用的合适属性 |
C4.5算法 | C4.5决策树生成算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法。 C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: (1)用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足; (2)在树构造过程中进行剪枝; (3)能够完成对连续属性的离散化处理; (4)能够对不完整数据进行处理。 C4.5算法有如下优点:产生的分类规则易于理解,准确率较高。其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。 |
CART算法 | CART( Classification And Regression Tree)即分类回归树算法,它是决策树的一种实现。 CART算法是一种二分递归分割技术,把当前样本划分为两个子样本,使得生成的每个非叶子结点都有两个分支,因此CART算法生成的决策树是结构简洁的二叉树。由于CART算法构成的是一个二叉树,它在每一步的决策时只能为“是”或者“否”,即使一个feature有多个取值,也是把数据分为两部分。在CART算法中主要分为两个步骤: (1)决策树生成:将样本递归划分进行建树过程,生成的决策树要尽量大; (2)决策树剪枝:用验证数据进行剪枝,这时损失函数最小作为剪枝的标准。 |
优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。
缺点:可能会产生过度匹配问题。
适用数据类型:数值型和标称型
在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起决定性作用。为了找到决定性的特征,划分出最好的结果,我们必须评估每个特征。完成测试之后,原始数据集就被划分为几个数据子集。这些数据子集会分布在第一个决策点的所有分支上。如果某个分支下的数据属于同一类型,则无需进一步对数据集进行分割。如果数据子集内的数据不属于同一类型,则需要重复划分数据子集的过程。划分数据子集的算法和划分原始数据集的方法相同,直到所有具有相同类型的数据均在一个数据子集内。
下面是在西瓜数据集2.0上基于信息增益生成的决策树。引用自 《机器学习》(周志华,清华大学出版社,P78)
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部节点(internal node)和叶节点(leaf node). 内部节点表示一个特征或属性,叶节点表示一个类。
用决策树分类,从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子节点;这时,每一个子节点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至到达叶节点。最后将实例分到叶节点的类中。
可以将决策树看成一个if-then规则的集合。由决策树的根节点到叶节点构建一条规则;内部节点的特征对应着规则的条件,而叶节点的类对应着规则的结论。
决策树的路径或其对应的if-then规则集合有一个重要的性质:互斥并且完备。这就是说,没一个实例都被一条路径或一条规则所覆盖,而且制备一条路径或一条规则所覆盖。
使用决策树做预测需要以下过程:
收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。
2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。
4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
一般的,一颗决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点则对应于一个属性册书;每个叶结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶结点的路径对饮过了一个判定测试序列。决策树学习的目的是为了产生一颗泛化能力强的决策树,其基本流程遵循简单且只管的“分而治之”(divide-and-conquer)策略,如下图所示:
显然,决策树的生成是一个递归的过程。在决策树基本算法中,有三种情形会导致递归返回:
在第二种情形下,我们把当前结点标记为叶结点,并且将其类别设定为该结点所含样本最多的类别;在第三种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多类别。注意这两种情形的处理实质不同:情形二是在利用当前结点的后验分布,而情形三则是把父结点的样本分布当做当前结点的先验分布。
决策树的条件概率分布定义在特征空间的一个partition上。将特征空间划分为互不相交的单元cell或区域region,并且在每个单元上定义了一个类的概率分布就构成了一个条件概率分布。
决策树的一条路径就对应与划分中的一个单元。决策树所表示的条件概率分布在由各个单元给定条件下类的条件概率分布组成。
假设X为表示特征的随机变量,X表示为类的随机变量,那么这个条件概率分布为P(Y|X).X取之于给定划分下但与的集合,Y取值于类的结合。各叶节点上的条件概率一般在某一个类上概率最大。
决策树学习是由训练数据集估计条件概率模型。基于特征空间划分的类的条件概率模型有无穷多个。我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。
决策树学习用损失函数表示这一目标。决策树学习的损失函数通常是正则化的极大似然函数。决策树学习的策略是以损失函数为目标函数的最小化。
当损失函数确定以后,学习问题就变为在损失函数意义下选择最优的决策树的问题。因为从可能的决策树中选取最优决策树是NP(Non-Polynomial)完全问题,所以现实中决策树学习算法通常采用启发式(heuristic)方法,近似求解这一最优化问题。这样得到的决策树通常是次最优(sub-optimal)的。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应这不同复杂度的概率模型。决策书的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。
决策树学习的目标:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习的本质:从训练集中归纳出一组分类规则,或者说是由训练数据集估计条件概率模型。
决策树学习的损失函数:正则化的极大似然函数
决策树学习的测试:最小化损失函数
如果利用一个特征进行分类的结果与随机分类的记过没有很差别则称这个特征没有分类能力。经验上扔掉这个特征对决策书学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比。
特征选择是决定用那个特征来划分特征空间。信息增益(information gain)就能够很好地表示这一直观的准则。
信息熵是衡量样本纯度的一种指标,嘉定当前样本集合D中第k类样本所占的比例为pk(k=1,2,...,|y|),则D的信息熵定义为:
Ent(D)的值越小,则D的纯度越高。
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。其中ID3决策树就是以信息增益为准则来选择划分属性。
在数据类别越多的属性上信息增益越大,比如在主键上信息增益非常大,但明显会导致overfitting,所以信息增益有一定缺陷
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响。C4.5决策树算法不直接使用信息增益,而是使用“增益率”来选择最优划分属性,增益率定义为:
属性a的可能取值数目越多(即V越大),则IV(a)的值通常会越大。需要注意的是,增益率准则对可取值数目较少的属性有所偏好,因此C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发性:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
GINI指数:
1、是一种不等性度量;
2、通常用来度量收入不平衡,可以用来度量任何不均匀分布;
3、是介于0~1之间的数,0-完全相等,1-完全不相等;
4、总体内包含的类别越杂乱,GINI指数就越大(跟熵的概念很相似)。
CART决策树选择划分属性。数据集D的纯度可以用基尼指数来度量
因此,Gini(D)越小,则数据集D的纯度越高
决策树很容易发生过拟合,也就是由于对train数据集适应得太好,反而在test数据集上表现得不好。这个时候我们要么是通过阈值控制终止条件避免树形结构分支过细,要么就是通过对已经形成的决策树进行剪枝来避免过拟合。另外一个克服过拟合的手段就是基于Bootstrap的思想建立随机森林(Random Forest)。
剪枝是决策树学习算法对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类样本,节点划分过程不断重复,有时会造成决策树分支过多,这时有时候把自身特点当做所有数据都具有的一般性质而导致过拟合,因此,可以通过主动去掉一些分支来降低过拟合的风险
基本策略有先剪枝和后剪枝,先剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能的提升,则停止划分当前节点标记为叶节点;后剪枝则是先从训练集生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的字数替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点。
简而言之:
先剪枝 —— 在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造。
后剪枝 —— 先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。
其实剪枝的准则是如何确定决策树的规模,可以参考的剪枝思路有以下几个:
(1)使用训练集合(Training Set)和验证集合(Validation Set),来评估剪枝方法在修剪结点上的效用;
(2)使用所有的训练集合进行训练,但是用统计测试来估计修剪特定结点是否会改善训练集合外的数据的评估性能,如使用Chi-Square(Quinlan,1986)测试来进一步扩展结点是否能改善整个分类数据的性能,还是仅仅改善了当前训练集合数据上的性能;
(3)使用明确的标准来衡量训练样例和决策树的复杂度,当编码长度最小时,停止树增长,如MDL(Minimum Description Length)准则。
影响分析
先剪枝使得很多分支没有展开,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间。但是,有些分支虽当前不能提升泛化性。甚至可能导致泛化性暂时降低,但在其基础上进行后续划分却有可能导致显著提高,因此先剪枝的这种贪心本质,给决策树带来了欠拟合的风险。
对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。
参考博文:https://www.jianshu.com/p/61a93017bb02?from=singlemessage
另外,决策树所形成的分类边界有一个明显的特点:轴平行,即它的分类边界有若干个与坐标轴平行的分段组成。
Graphviz是开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图和网络图的方法。它在网络,生物信息学,软件工程,数据库和网页设计,机器学习以及其他技术领域的可视化界面中具有重要的应用。
Graphviz:可视化工具下载地址:
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
在命令行中输入的转化指令:
dot -Tpdf src.dot -o des.pdf
src.dot 表示的是带路径的.dot文件
des.pdf 表示的是生成的.pdf文件,最好也带个路径
例如:
dot -Tpdf G:\MachineLearning\tree.dot -o G:\MachineLearning\tree.pdf -- 成功将dot文件转化为pdf文件
dot -Tpng G:\MachineLearning\tree.dot -o G:\MachineLearning\tree.png -- 成功将dot文件转化为png文件。