决策树个人小结
最近一直在看决策树以及集成学习相关的内容,分开来看的话,很多概念当时看都能理解,但是回顾的时候就很懵逼,还是需要整体来总结一下,做一个知识梳理。
什么是决策树
先忘记随机森林,adaboost,gbdt等内容!!!你的心里只有决策树!!!
现在我们只考虑决策树。决策树就向线性回归、逻辑回归以及SVM等基本的机器学习模型一样,是一种可以用来解决分类或回归问题的机器学习模型。
决策树,顾名思义,是一种树形的结构,通过训练生成决策树,可以用它来完成预测。它的内部节点表示一个特征或者属性,叶节点表示一个类。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个好的分类过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。决策树的生成是只考虑局部最优的。
决策树不一定是二叉树,也可能是多叉树。
决策树的分类
- 从目的来看,可分为:分类树和回归树
分类树用来进行类别预测;回归树用来进行回归预测
- 从特征选择的算法来看:ID3、C4.5、CART
前面说过,在决策树的生成过程中,要进行特征空间的划分,通俗来说,就是每一步根据某个特征进行划分。
Q: 那么在每一步中,以什么样的标准来选择特征进行划分呢???
A: 一般有三种标准(最大信息增益,最大信息增益比,基尼指数)
ID3
- 信息熵
信息熵用来度量样本集合纯度。信息熵越大,表示纯度越高。
ID3决策树是使用最大信息增益来进行特征划分的。对训练数据集(或子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
- 信息增益算法:
(1) 计算当前结点数据集D的信息熵\(H(D)\)
\(H(D) = -\sum\limits_{k=1}^K \frac{|C_k|}{|D|} \log_2 \frac{|C_k|}{|D|}\)
(2) 计算经特征\(A\)划分后的信息熵\(H(D|A)\)
\(H(D|A) = \sum\limits_{i=1}^n \frac{|D_1|}{|D|}H(D_i)\)
(3) 计算信息增益
\(g(D, A) = H(D) - H(D|A)\)
- 例题:
- 小结
ID3决策树使用最大信息增益进行划分。
一般用于分类。是多叉树。
基于离散属性来进行分类。
C4.5
ID3中使用最大信息增益来进行划分节点的选择,但是这样会偏向于选择取值数较多的属性。所以引入“最大信息增益率”来选择最优化分属性。
最大信息增益率计算公式:
\(Gain\_ratio(D, a) = \frac{Gain(D, A)}{IV(a)}\)
其中 \(IV(a) = -\sum\limits_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D_v|}{|D|}\)称为属性\(a\)的固有值。属性\(a\)的可能取值越多(V越大),\(IV(a)\)的取值通常越大。所以从信息增益率来看,希望\(IV(a)\)越小越好,也就是倾向于选择取值数目较少的属性。ps: 可以认为和"信息增益\(Gain(D, A)\)偏向于选取值数目较多的属性"中和了一下...
- 小结
C4.5是在ID3的基础(偏向于选择取值数目较多的特征)上进行改进。
C4.5并不是直接选择增益率最大的候选划分属性,而是使用一个启发式算法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
要注意一下\(IV(a)\)的计算,其中\(D^v\)指的是当前数据集中属性\(a\)取值为第\(v\)种值的样本的数目。不要和前面\(H(D)\)中的\(C_k\)混淆了。
C4.5不仅可以处理离散属性,还可以使用"二分法"对离散属性进行处理。(见西瓜书P83)
C4.5是多叉树。
CART
CART(classification and regression tree),分类和回归树。是一种著名的决策树算法,分类和回归任务都能用。CART决策树是二叉树。
CART分类树
- 用于解决分类问题
- 使用GINI指数(基尼指数)选择最优特征的最优化分点
- 每次都是二值划分(生成二叉树)
CART回归树
- 用于解决回归问题
- 使用“平方误差最小”来选择最优特征的最优划分点
- 使用当前节点样本的均值作为该节点的预测值
CART分类树
- 基尼指数
分类问题中,假设有\(K\)个类,样本点属于第\(k\)类的概率的为\(p_k\),则概率分布的基尼指数定义为:\(Gini(p) = \sum\limits_{k=1}^Kp_k(1-p_k) = 1-\sum\limits_{k=1}^Kp_k^2\)
对于给定的样本集合\(D\),其基尼指数为:
\(Gini(D) = 1-\sum\limits_{k=1}^K(\frac{|C_k|}{|D|})^2\)
其中,\(C_k\)是D中属于第\(k\)类的样本子集,\(K\)是类的个数。
如果样本集合\(D\)根据特征\(A\)是否取某一可能值\(a\)被分割成\(D_1\)和\(D_2\)两个部分,则在特征\(A\)的条件下,集合\(D\)的基尼指数定义为
\(Gini(D, A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)\)
基尼指数\(Gini(D)\)表示集合\(D\)的不确定性,基尼指数\(Gini(D, A)\)表示经\(A=a\)分割后集合\(D\)的不确定性。
基尼指数值越大,样本集合的不确定性越大,这一点与熵相似。
- CART分类树生成算法
算法停止的条件(3选1):
- 节点中的降本个数小于预定阈值;
- 样本集的基尼指数小于预定与之;
- 没有更多的特征可用于划分。
- CART分类树例题
CART回归树
CART回归树,根据平方误差最小的原则,来选择最优特征及其划分点。
算法如下:
决策树的剪枝
决策树是很容易过拟合的,可以通过剪枝来进行缓解。
剪枝策略有2种:预剪枝
和后剪枝
- 预剪枝
在决策树生成过程中,对每个节点在划分前进行评估,若当前节点不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点。
- 后剪枝
先从训练集生成一棵完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的字树替换为叶节点能够提升决策泛化性能,则将该字树替换为叶节点。
思考:如何判断决策树泛化性能是否提升?
答:可以使用留出法,预留一部分数据用作验证集以进行性能评估。
例题可参见西瓜书P81-83
- 后剪枝和预剪枝的比较
预剪枝:可能减去了很多分支,最后留下的分支少。耗时短。繁泛化能力较弱。
后剪枝:留下的分支较多。欠拟合风险小。泛化能力强。但耗时长。
- CART剪枝
蓝皮书上5.5划分出了一个独立的小节来讲解CART决策树,其中还有CART剪枝算法。
算法两步走:(1) 从生成算法产生的决策树\(T_0\)底端开始不断剪枝,直到\(T_0\)的根节点,形成一个子树序列\({T_0, T_1, T_2, ..., T_n}\);(2) 通过交叉验证法在独立的验证数据集上对子树序列进行测试,从种选择最优子树。
具体见蓝皮书P72
简单来说,这种剪枝算法并没有完全脱离训练集,尝试剪掉每一个节点(每次只减一个),在训练集上对每个节点计算一下指标:
\(\alpha = \frac{C(t) - C(T_t)}{|T_t|-1}\)
取最小的\(\alpha\)对应的节点,剪掉它。这时候生成了第一个子树。
重复以上步骤,直到最后只剩下根节点作为最后一个子树。
最后得到了一系列的子树,然后进行第二步:使用验证集对所有子树走一遍,取误差最小的那棵子树,就是我们最终需要的树。