一、为什么有CART回归树
以前学过全局回归,顾名思义,就是指全部数据符合某种曲线。比如线性回归,多项式拟合(泰勒)等等。可是这些数学规律多强,硬硬地将全部数据逼近一些特殊的曲线。生活中的数据可是千变万化。那么,局部回归是一种合理地选择。在斯坦福大学NG的公开课中,他也提到局部回归的好处。其中,CART回归树就是局部回归的一种。
二、CART回归树的算法流程
![](https://images0.cnblogs.com/blog2015/692470/201507/231238156787111.png)
注意到,(1)中两步优化,即选择最优切分变量和切分点。(i)如果给定x的切分点。那么可以马上求得中括号内的最优。(ii)对于切分点怎么确定,这里是用遍历的方法。
三、CART分类树
实际上,CART分类树的生成树和ID3方法类似,只是这里用基尼指数代替了信息增益,定义
![](https://images0.cnblogs.com/blog2015/692470/201507/231318355061741.png)
![](https://images0.cnblogs.com/blog2015/692470/201507/231318457406246.png)
![](https://images0.cnblogs.com/blog2015/692470/201507/231318582097337.png)
![](https://images0.cnblogs.com/blog2015/692470/201507/231319073348516.png)
![](https://images0.cnblogs.com/blog2015/692470/201507/231319182246123.png)
四、CART剪枝算法流程
![](https://images0.cnblogs.com/blog2015/692470/201507/231425150373894.png)
例子参考:http://www.cnblogs.com/zhangchaoyang/articles/2709922.html
比如:
当分类回归树划分得太细时,会对噪声数据产生过拟合作用。因此我们要通过剪枝来解决。剪枝又分为前剪枝和后剪枝:前剪枝是指在构造树的过程中就知道哪些节点可以剪掉,于是干脆不对这些节点进行分裂,在中用的都是前剪枝,上面的χ2方法也可以认为是一种前剪枝;后剪枝是指构造出完整的决策树之后再来考查哪些子树可以剪掉。
在分类回归树中可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。这里我们只介绍代价复杂性剪枝法。
对于分类回归树中的每一个非叶子节点计算它的表面误差率增益值α。
![](http://www.forkosh.com/mathtex.cgi?%5Calpha=%5Cfrac%7BR%28t%29-R%28T_t%29%7D%7B%7CN_%7BT_t%7D%7C-1%7D)
是子树中包含的叶子节点个数;
是节点t的误差代价,如果该节点被剪枝;
![](http://www.forkosh.com/mathtex.cgi?R%28t%29=r%28t%29*p%28t%29)
r(t)是节点t的误差率;
p(t)是节点t上的数据占所有数据的比例。
是子树Tt的误差代价,如果该节点不被剪枝。它等于子树Tt上所有叶子节点的误差代价之和。
比如有个非叶子节点t4如图所示:![](https://images0.cnblogs.com/blog2015/692470/201507/231441475211784.png)
已知所有的数据总共有60条,则节点t4的节点误差代价为:
![](http://www.forkosh.com/mathtex.cgi?R%28t%29=r%28t%29*p%28t%29=%5Cfrac%7B7%7D%7B16%7D*%5Cfrac%7B16%7D%7B60%7D=%5Cfrac%7B7%7D%7B60%7D)
子树误差代价为:
![](http://www.forkosh.com/mathtex.cgi?R%28T_t%29=%5Csum%7BR%28i%29%7D=%28%5Cfrac%7B2%7D%7B5%7D*%5Cfrac%7B5%7D%7B60%7D%29+%28%5Cfrac%7B0%7D%7B2%7D*%5Cfrac%7B2%7D%7B60%7D%29+%28%5Cfrac%7B3%7D%7B9%7D*%5Cfrac%7B9%7D%7B60%7D%29=%5Cfrac%7B5%7D%7B60%7D)
以t4为根节点的子树上叶子节点有3个,最终:
![](http://www.forkosh.com/mathtex.cgi?%5Calpha=%5Cfrac%7B7/60-5/60%7D%7B3-1%7D=%5Cfrac%7B1%7D%7B6%7D)
找到α值最小的非叶子节点,令其左右孩子为NULL。当多个非叶子节点的α值同时达到最小时,取
最大的进行剪枝。
#include #include #include #include #include
参考文献:
http://blog.csdn.net/google19890102/article/details/32329823