林轩田之机器学习课程笔记( combining predictive features之 decision tree)(32之25)
欢迎转载,可以关注博客:http://blog.****.net/cqy_chen
对于模型融合可以参考:
http://scikit-learn.org/stable/modules/ensemble.html
决策树参考:
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
某不才,也写过玩具版本的决策树,写下林轩田系列笔记主要是在kaggle竞赛过后再进行回味,好茶总是要慢慢品的嘛。
http://blog.****.net/cqy_chen/article/details/77721637
http://blog.****.net/cqy_chen/article/details/69803181
题目可能不全,因为有字数限制,不好意思,可以参考:
https://www.csie.ntu.edu.tw/~htlin/course/ml15fall/
概要
上次讲到了adaboost算法,通过调整资料权重的方式得到不一样的基本模型,然后根据模型表现通过线性的blending方式进行组合。
本节介绍stacking的方式组合模型,即:决策树。
Tables | blending方式 | 方法案例 |
---|---|---|
模型统一票数 | 投票/平均 | bagging |
模型不统一票数 | 线性融合 | AdaBoost |
非线性融合 | 模型堆叠 | 决策树 |
所以前面已经将bagging和AdaBoost算法讲解完毕,本节就讲解通过非线性融合的方式,模型堆叠成决策树。
决策树假设空间
决策树和人类做决定的思路类似的。如下图所示:
比如今天下班比较早,然后看看有没有约会,如果没有就看看线上课程,这就是一种模仿人类决策方式。
决策树路径代表了决策的思路,而叶子节点代表了最后的结果。
这个用数学表达如下:
也可以采用另外的表示形式:
这就是采用递归的方式表示决策树。
决策树的一些优点和缺点:
1)决策树模仿了人类做决定的过程,可解释性比较强
2)简单
3)有效率
缺点:
1)理论保证比较少,实践来实现
2)由于理论保证比较少,这样就导致有各种各样的决策树,至于谁好,不知道。
本节中介绍的是卡特树,因为这是GBDT以及XGB的基础模型。
决策树演算法
首先看看决策树的递归形式:
这个式子表示要构造一个决策树:
1)确定分割的函数,b(x)
2)将剩下的数据按照b(x)进行分割
3)构造子树
4)最后返回
这里涉及到四个问题需要解决;
1)怎么做分支,即:b(x)
2)分支分多少个?
3)什么时候递归停止
4)叶子节点怎么表示,就是我们的基本模型。
本节介绍的cart树是这么来做的。
1)每次分支,只分两次就是一个二叉树。
2)对于基本模型
3)要切开之后,使得子树的资料很纯,这是决策树算法的核心,如何切分。cart算法是这么做的:
这里的核心就是怎么来衡量纯度了,请看下图:
4)什么时候停止下来呢?
被迫停止
1:纯度为0,切开之后已经很纯了
2:切开之后资料都一样
如果只用这两个条件得到是完全生长的树。
决策树之卡特算法
cart树的算法步骤如下,实在写不动了,贴林老师的图:
上面的流程会带来一个问题,如果我们的资料都是不一样的,会导致一直切分,知道
怎么来预防这个事情呢?当然是添加正则化啦。比如我们可以限定树的高度,树的宽度,树的叶子节点数目等。
如下:
后面那一项来限定树的复杂度,从而达到过拟合的目的。
这种方式一般称之为树的剪枝处理。
看这个公式,是要选择所有的G然后选择一个最好的,实际的情况一般不是这样做的。有先剪枝和后剪枝两种方法。这里介绍下后剪枝
1)先生成一棵完全长成的树
2)不断的丢弃叶子节点得到新的树,
在这些树中通过交叉验证的思想获得最后的结果。
关于剪枝,林轩田老师的视频中讲解的比较少,大家可以参考周志华老师的《机器学习》书籍https://item.jd.com/11867803.html
在cart树中,由于每次都是进行的二分类,对于数字和类别型的是不一样的,如下:
比如有类别,国家:(中国,美国,德国),那么我们可以凑成(中国,(美国,德国))、(美国,(中国,德国))、(德国,(美国,中国))三种分割方式,然后计算纯度,得到分割最后的分割方式。
对于缺失值的处理。对于cart这里的算法,如果一个特征值缺失,会去寻找另外的替代特征。保证算法的鲁棒性。比如在训练的时候是用的一个特征,但是预测的时候可能该特征就缺失了啊。
一般对于每次分割的特征,cart都会找一个相应的备选特征,保证备选特征做出来的结果差不多。
决策树实战
这里演示一个cart是怎么切分的:
这里演示了cart树如何对一个二分类问题进行切割,同时对比了cart算法和adaboost算法的决策边界。
决策树每次都是用部分的资料点,而adaboost是用的是所有的资料
看起来cart算法和AdaBoost算法的决策边界差不多,但是由于cart算法每次计算的量比Adaboost算法少,所以cart算法理论上应该计算更快。
欢迎转载,可以关注博客:http://blog.****.net/cqy_chen