树回归

来源:互联网 发布:php导入excel到数据库 编辑:程序博客网 时间:2024/05/21 11:33

为什么会引入树回归?因为现实生活中很多问题是非线性的,单纯的用线性回归得不到满意的结果。树回归的核心思想是数据集切分:既然全体数据集太复杂不好建模,就把它切分成很多份,每份方便建模就行了呗。至于怎么切分,切出来之后怎么建模就是树回归研究的问题。

    • 一CART分类回归树
    • 二模型树
    • 三树剪枝

一、CART(分类回归树)

CART构建树的模式很简单–二元切分!(类比二叉树的生成过程)例如:我们选定某一特征a作为标准,假设给定它一个阈值0.5,那么对应要进行切分的数据集,特征a的取值大于0.5的样本分给左子树,否则分给右子树。
首先谈谈数据集的混乱度,等于所有样本预测值的平方误差总值(总方差)。如下, 这是包含五个样本的数据集,前两列是两个特征的取值,最后一列是预测值,混乱度即最后一列数据的总方差。
(回归树每个结点的取值为该结点下所有样本预测值的均值!这里要与分类树和模型树做一个区别)

                        1.000000        0.409175        1.883180                        1.000000        0.182603        0.063908                        1.000000        0.663687        3.042257                        1.000000        0.517395        2.305004                        1.000000        0.013643       -0.067698

那么问题来了,如何选取最好的切分特征值?使切分后左右子树的混乱度之和最小的特征值。
通过伪代码理解一下整个过程:

1.找到最佳切分特征

对每个特征:   对每个特征值:      将数据集切分成两份      计算切分后的混乱度      如果当前混乱度小于当前最小混乱度,更新当前最小混乱度返回最佳切分的特征和阈值

2.createTree()–采用递归生成CART

  找到最佳的待切分特征:      如果该结点不能再分,将该节点存为叶结点      执行二元切分      在右子树调用createTree()方法      在左子树调用createTree()方法

什么时候节点不再分?这就涉及到切分的三个停止条件
1.只剩下一种切分特征
2.切分后混乱度的下降小于我么自己设定的阈值
3.如果待切分的数据集样本数目小于我们自己设定的阈值

二、模型树

回顾一下CART树的预测过程:对于一个已经训练好了的回归树,根据新输入的样本从上往下遍历,最后指向一个唯一的结点,这个叶结点对应的值即为该样本的预测值。对于CART,叶结点的预测值是先前训练模型中被分到该结点下所有样本预测值的均值。即叶结点的值采用取均值的方式得到,这称为叶结点的生成模型。模型树与回归树的差别就在于生成模型上。
对于模型树,叶结点的值是通过线性回归函数计算出来的,即每一个叶结点对应一个线性回归函数(也就是一组特定的回归系数w)。当然这里也不能再用混乱度作为最佳切分的度量标准,而是采取预测值与真实值之差的平方作为误差度量,当然也是越小越好。
其余的部分跟回归树没啥差别。

三、树剪枝

为什么要剪枝?降低模型复杂度,避免过拟合
树剪枝一般分为预剪枝后剪枝。预剪枝其实在前面讲述CART生成树的时候已经涉及到,切分的三个停止条件中2、3都跟我们自己设定的阈值有关,就是用来控制过拟合的。
重点说一下后剪枝,伪代码如下:

基于已有的树切分测试数据:    如果存在任一子集是一棵树,则在该子集上递归剪枝过程    计算将当前两个叶结点合并后的误差    计算不合并的误差    如果合并后误差降低,则合并叶结点
0 0
原创粉丝点击