上一讲学习了AdaBoost算法,通过在算法的迭代中不断地调整数据的权值,得到不同的h,然后使用不同的系数α将其线性组合,得到最后的模型。通过这种提升的办法,将本来可能并不是很好的模型变成要求的效果的程度。
这一讲来学习决策树(Decision Tree),这个之前单独的看过,这里再听林老师讲,希望从不同的角度来学习这个算法
前面讲的Aggration Model,通过将不同的h进行整合从何得到更好的模型,类型主要有uniform、non-uniform、conditional三种。其中blending对应的三种是voting/averaging、linear和stacking,这是所有的g都是已知的。而learning的g都是未知的,我们只能从数据中获取,相应的是Bagging和AdaBoost,那么在conditional情况下对应的就是决策树
决策树和人类的决策过程很相似,是一系列if-then的过程。比如如下的例子,我们可以根据不同的情况最后决定我们最后是否要做某一件事,这个过程是一个熟悉的树形结构。其中最后标记Y/N的叶子节点就是想要的g,这里通常是一个常数,橙色的线对应的就是一系列的条件。我们可以将这种结构和一个h对应,如下所示:不同的g(t)和不同的q(t)的组合对应不同的从根到叶子的路径
如果从路径的角度来看决策树,不同的路径和叶子结果构成了最后的决策树。如果从分支的角度来看,可以将G(x)拆成一系列Gc(x)的组合,即把一棵大树分成若干的小树,表达式如下图红框所示:其中G(x)代表大树,的Gc(x)代表第c个分支下的子树,b(x)=c表示分支条件。递归的进行就可以将树不断地分割
决策树的优点如下所示:
• 可解释性强,应用广泛
• 算法简单易实现
• 训练、预测的效率高
缺点为:
• 缺少足够的理论支持
• 不易选择合适的树结构
• 代表性算法比较少
以上面讲的分支角度的为基础表示决策树,对应的表达式如下:
在数据集D上运行决策树算法可以分成如下的步骤:
A. 确定分支的标准
B. 在数据集上运行演算法
a. 习得分支条件b(x)
b. 根据条件将D分割为不同的子集Dc
c. 在不同的Dc下运行演算法得到Gc
d. 将不同的Gc组合得到G(x)
但是这样的递归形式的算法存在的一个问题就是无法终止,需要人为的设定终止条件
下面介绍一种决策树算法:CART(Classification and Regression Tree),它有如下的两个规定:
• 分支个数为2,采用二叉树的结构
• 分支最后的gt(x)是个常数:如果是二分类,就是正负类哪一个最多输出哪个;对于多分类问题输入个数做多的类别;对于回归问题输出所有yn的平均值
C&RT分支个数C=2,一般采用decision stump的方法进行数据切割,每次在一个维度上只对一个特征将数据划分为左子树和右子树,但是怎么做效果更好呢,即左右子树的差别更大呢?C&RT中使用purifying这个概念来选择最好的decision stump。它的核心思想就是每次切割都尽可能让每个子树中中同类样本占得比例最大,即中间节点的数据纯度高。据此我们可以得到如下的分支标准表达式b(x):其中绝对值中的不行是分支节点的数据量,impurity是纯度的反面,即分支节点不纯的程度
那么Impurity如何用函数的形式量化?可以对照前面使用的Ein的做法,看预测值与真实值的误差是多少。对于回归问题,impurity可表示为预测值和真实值的均值的差距;对于分类问题,impurity可表示为预测值和所占比例最大的那一类值的差距。
其中对于分类问题,如果某分支条件下,让其中一个分支纯度最大,那么就选择对应的decision stump,即得到的classification error为红框所示。但是这只是考虑了最优的那个分支,如果将所有的分支考虑进去 ,就是基尼指数,如蓝框所示。
对于决策树C&RT算法,通常来说,上面介绍的各种impurity functions中,Gini index更适合求解classification问题,而regression error更适合求解regression问题
前面讲到我们需要认为的设定终止的条件,可以是如下的两种情况,C&RT算法就会终止
• 如果所有的yn都是相同的,说明结果是一样的,即不纯度为零
• 如果所有的xn都不同,表示每个数据都是一类,就没必要使用决策树划分
假设一种极端的情况,我们有N个样本,每次只取一个样本点作为分支,那么在经过N-1次分支之后,所有的样本点都能完全分类正确。最终每片叶子上只有一个样本,即必然能保证Ein=0。但是这种方法会出现过拟合现象。为了避免这种现象,和前面一样我们可以使用正则化来控制模型的复杂度。
在决策树中我们可以考虑减少叶子的数量,令regularizer就为决策树中叶子的总数,记为Ω(G),而正则化的目的是尽可能减少Ω(G)的值。那么引入了正则化的决策树就可以表示成红框的样子,把它称为剪枝树(pruned decisiontree)。通过去掉多余的叶子,即减少最后的结果的个数来避免过拟合。
那么如何确定修剪多少叶子、修剪哪些叶子呢?假设由C&RT算法得到一棵完全长成树(fully grown tree),总共10片叶子。首先分别减去其中一片叶子,剩下9片,将这10种情况比较,取Ein最小的那个模型;然后再从9片叶子的模型中分别减去一片,剩下8片,将这9种情况比较,取Ein最小的那个模型。以此类推不断的修建叶子。最终得到包含不同叶子的几种模型,选择模型误差最小的,其中参数可以通过validation来确定最佳值
前面我们一直讨论决策树上的叶子(features)都是numerical features,而实际应用中,决策树的特征值可能不是数字量,也可能是类别(categorical features)。对于numerical features,我们直接使用decision stump进行数值切割;而对于categorical features, 我们仍然可以使用decision subset,对不同类别进行“左”和“右”,即是与不是(0和1)的划分,具体区别如下图所示:
在演算法的运行过程中,有些特征值可能因为某些原因丢失了,无法继续运行。对此我们可以使用下面的方法解决
• 最直接的就是想办法找到这些值
• 寻找和它相似的特征代替
我们将第二种方法称之为surrogate branch,那么如何确定是相似的feature呢?做法是在决策树训练的时候,找出与该特征相似的feature,如果替代的feature与原feature切割的方式和结果是类似的,那么就表明二者是相似的,就把该替代的feature也存储下来。当预测时遇到原feature缺失的情况,就用替代feature进行分支判断和选择
下面是使用C&RT算法在一个简单的数据集上的运行效果,在无法继续划分后,将子树整合成最后的结果
下面是C&RT和AdaBoost-Stump分别在同一个数据集上的效果对比,AdaBoost-Stump算法的切割线是横跨整个平面的;而C&RT算法的切割线是基于某个条件的,所以一般不会横跨整个平面
C&RT决策树的特点
• 可解释性强
• 方便处理多分类的问题
• 划分的特征选择方便
• 容易处理丢失的特征值非线性的数据训练和预测的效率较高