简介
决策树算法以树状结构表示数据分类的结果。每一个决策点实现一个具有离散输出的测试函数,记为分支。它基于二元划分策略(类似于二叉树)。
一棵决策树包括一个根节点、若干个内部节点(决策点)和若干个叶节点(决策结果)。
叶节点对应决策的结果,而其他节点对应一个属性测试。决策树学习的目的就是构建一棵泛化能力强的决策树。
在分类问题中,决策树表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。
过程
使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。
决策树算法可以分为两个阶段
训练阶段
从给定的训练数据集中构造出一棵决策树。
分类阶段
从根开始,按照决策树的分类属性逐层往下划分,直到叶节点,获得概念(决策、分类)结果。
决策树所形成的分类边界有一个明显特点:轴平行,即它的分类边界由多个与坐标轴平行的分段组成。在多变量决策树中,通过替换该分段为斜划分实现决策树模型的简化。
熵
指的是一个物体内部的混乱程度。
熵 = -\sum_{i=1}^nP(i|t)\log_2 P(i|t)
Gini系数 = Gim(P) = 1-\sum_{k=1}^k p_k^2
p(i|t) 代表了节点 t 为分类 i 的概率,其中 log2 为取以 2 为底的对数。
Gini系数和熵属于同一个层面,都是混乱程度越大,纯度越低,他们的值就越大。
决策树构造
构造树的基本想法是随着树的深度增加,节点的熵迅速降低(纯度增加)。熵降低的速度越快越好,这样可以降低决策树的复杂度(越矮越好)。
先计算每个叶节点的熵,然后再对叶节点加权计算信息熵
信息增益(information gain): 在划分数据集前后信息发生的变化称为信息增益。
因此第一步使系统的信息熵下降最快,信息增益最大的作为根节点。
其他内部节点和根节点的构造方式一样,因此可以通过递归方式来构造。
在理想条件下,当系统的信息熵降为0时,就没有必要再往下构造决策树了,此时叶子节点都是纯的。
然而还有最坏的情况是决策树的高度为属性(决策变量)的个数,叶子节点不纯,这就意味着我们需要一定的概率来做出决策。
决策树的构造过程可以理解成为寻找纯净划分的过程。而衡量不纯度的指标有三种,而每一种不纯度对应一种决策树的生成算法:
信息增益(ID3算法)
信息增益比(C4.5算法)
基尼指数(CART算法)
Gini{index}= \sum^V_{v=1} \frac{|D^v|}{D} Gini(D^v)
Gini(D)=-\sum^y_{k=1} \sum_{k’!=k} p_k p_{k’} = 1- \sum^y_{k=1} p_k^2
- 评价函数
C(T) = \sum_{t\in leaf}N_t.H(t)
(希望他越小越好,类似于损失函数)
H(t)表示当前叶子节点的熵值或基尼系数,N表示当前叶子节点的样本数(相当于权重值)。
补充
- c4.5算法是ID3算法的扩展
- 能够处理连续型的属性。首先将连续型属性离散化,把连续型属性的值分成不同的区间,依据是比较各个分裂点Gian值的大小(或者可以直接分成两段,计算一下怎样分的信息增益最大)。
- 缺失数据的考虑:在构建决策树时,可以简单地忽略缺失数据,即在计算增益时,仅考虑具有属性值地记录。
如果决策树的高度太高(枝叶太多)容易发生过拟合的现象。因此需要进行一个剪枝的操作来防止过拟合问题。
必考
- 预剪枝:在构建决策树的过程时,提前停止。方法是在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。
- 后剪枝:决策树构建好后,然后才开始裁剪。通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。方法是:用这个节点子树的叶子节点来替代该节点,类标记为这个节点子树中最频繁的那个类。
C_α(T) = C(T) + α |T_{leaf}|
叶子节点个数越多。损失越大。
其中C(T)是评价函数,T_leaf是叶子节点个数,α是权重参数,当α大,说明叶子节点个数对
一般决策树用交叉验证法进行训练。
决策树算法
ID3算法
以信息增益为准选择决策树的属性,注意信息增益偏好可取值数目较多的属性。因此可能会有一种情况使信息增益很大,但是分出较多的属性造成决策效果不好。所以ID3存在一个问题,那就是越细小的分割分类错误率越小。这种问题容易造成过拟合。
分割太细了,训练数据的分类可以达到0错误率,但是因为新的数据和训练数据不同,所以面对新的数据分错率反倒上升了。决策树是通过分析训练数据,得到数据的统计信息,而不是专为训练数据量身定做。
就比如给男人做衣服,叫来10个人做参考,做出一件10个人都能穿的衣服,然后叫来另外5个和前面10个人身高差不多的,这件衣服也能穿。但是当你为10个人每人做一件正好合身的衣服,那么这10件衣服除了那个量身定做的人,别人都穿不了。
C4.5算法
使用增益率选择最优划分属性,增益率定义为:特征A对训练数据集D的信息增益比gR(D,a)定义为其信息增益g(D,a)与训练数据集D在特征A的划分下数据集本身的一个混乱程度(熵)IV(D)
Gainratio(D, a) = \frac{Gain(D,a)}{IV(a)}
而
IV(D) = - \sum^V_{v=1}\frac{|D^v|}{D} log_2\frac{|D^v|}{D}
注意增益率偏好可取值数目较少的属性。c4.5中。优化项要除以分割太细的代价,这个比值叫做信息增益率。分割太细,分母增加,信息增益率会降低。
采用悲观剪枝ID3
构造决策树的时候,容易产生过拟合的情况。在 C4.5 中,会在决策树构造之后采用悲观剪枝(PEP),这样可以提升决策树的泛化能力。悲观剪枝是后剪枝技术中的一种,通过递归估算每个内部节点的分类错误率,比较剪枝前后这个节点的分类错误率来决定是否对其进行剪枝。这种剪枝方法不再需要一个单独的测试数据集。
离散化处理连续属性C4.5
可以处理连续属性的情况,对连续的属性进行离散化的处理。比如打篮球存在的“湿度”属性,不按照“高、中”划分,而是按照湿度值进行计算,那么湿度取什么值都有可能。该怎么选择这个阈值呢,C4.5 选择具有最高信息增益的划分所对应的阈值。
处理缺失值
针对数据集不完整的情况,C4.5 也可以进行处理。假如我们得到的是如下的数据,你会发现这个数据中存在两点问题。
数据集中存在数值缺失的情况,如何进行属性选择?
就是假如有些样本在某个属性上存在值缺失,那么我计算信息增益的时候,我不考虑这些样本就可以了。但用了多少样本,要在不考虑带缺失值样本的前提下计算的信息增益的基础上,乘以一个权重。
假设已经做了属性划分,但是样本在这个属性上有缺失值,该如何对样本进行划分?
如果出现样本在该属性上的值缺失, 则把该样本划分到所有的分支里面,但是权重不一样(这个权重就是每个分支里的节点个数占的总数比例),这样,如果再往下划分属性,对于该样本来说,算条件熵的时候,得考虑上他本身的一个权重了。
CART算法
CART 只支持二叉树。同时 CART 决策树比较特殊,既可以作分类树,又可以作回归树。
如何区分分类树和回归树
如果我构造了一棵决策树,想要基于数据判断这个人的职业身份,这个就属于分类树,因为是从几个分类中来做选择。分类树可以处理离散数据,也就是数据种类有限的数据,它输出的是样本的类别
如果是给定了数据,想要预测这个人的年龄,那就属于回归树。回归树可以对连续型的数值进行预测,也就是数据在某个区间内都有取值的可能,它输出的是一个数值。
CART分类树的工作流程
Gini{index}= \sum^V_{v=1} \frac{|D^v|}{D} Gini(D^v)
Gini(D)=-\sum^K_{k=1} p_k(1- p_{k’}) = 1- \sum^K_{k=1} p_k^2
实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数。
由于CART算法中,只把类别分为两类,所以K=2,二分类问题概率表示:p1(1-p1) + p2(1-p2)
转载:https://blog.csdn.net/Mikow/article/details/105719473