树回归

来源:互联网 发布:马士兵java 百度云 编辑:程序博客网 时间:2024/06/06 00:55
       当数据拥有众多的特征并且特征之间关系十分复杂的时候,构建全局模型的想法就显得太难了,也略显笨拙。而且,在实际生活中,许多的问题都是非线性的,不可能使用全局线性模型来拟合任何数据。

       一种可行的方法是将数据集划分成许多易建模的数据分片,然后利用线性回归技术在每个分片上建模。如果首次划分后的数据子集仍然很难拟合成线性模型,那么就继续划分。

       分类回归树(CART)就是采用这一原理工作的,该算法既可以用来分类也可以用来回归。之前我们讲过使用决策树来进行分类,那么分类回归树和决策树相比较有什么优势呢?

       决策树是一种贪心算法,通过不断将数据划分成小数据集,直到所有目标变量完全相同或者数据不能再划分为止。它要在给定时间内做出最佳选择,但并不关心能否达到全局最优。

       此外,决策树中使用的树构建算法是ID3。ID3划分过于迅速,并且不能直接处理连续型特征。二元划分法是另一种树构建方法,它每次把数据集划分为两份。ID3没有二元划分法好,因为二元划分法划分速度比ID3慢些且能够处理连续型特征。ID3和二元划分法还有一个重要的区别:ID3选取当前最佳的特征划分数据,每个特征作为划分的依据最多被使用一次;而二元划分法选取当前最佳的特征划分数据,某个特征可以多次被用于划分的依据。

       CART是十分著名的树构建算法,它使用二元划分法。

       既然CART采用二元划分法,那么在划分数据集时就必须知道选择哪个特征进行划分最好,并且该特征划分时的分界值是多少(即大于分界值的归于一类,小于等于分界值的归于另一类)。因此,CART中最关键的步骤就是找到每次划分数据时使用的最佳特征以及最佳分界值。



       在选择特征时,我们需要计算数据的混乱度,通过划分前数据的混乱度和划分后数据的混乱度的比较来选择最佳特征。对于标称型数据,决策树中提到使用香农熵来计算数据的混乱度。那么对于数值型数据,如何计算混乱度呢?其实,数值型数据计算混乱度的方法比标称型要简单的多。数值型数据的混乱度等于数据集的目标变量的总方差,即数据集的目标变量减去所有目标变量的平均值,再求平方和。选择混乱度最小的划分特征最为最佳特征。

       计算混乱度都是对于样本点的目标变量而言的。划分后的数据因为分成了两份,所以分别求出每份数据的混乱度,再相加作为划分后数据的混乱度。

       在实际的操作中,我们设置一个参数tolS,只有当最佳特征划分数据后的混乱度(某次划分的最小混乱度)与划分前的混乱度的差大于tolS时,才认为此次的划分是有意义的。因为如果划分后只减少了一点点的混乱度,那么还不如不划分数据。并且在划分数据集时,我们还设置一个参数tolN。只有当划分后的两个数据子集中样本点的个数都大于tolN时才计算划分后数据的混乱度,否则直接忽略该划分。因为如果某个数据子集的样本点个数太少,就表明这种情况代表的数据太少了,没有太大的意义。这两种做法实际上都是防止过度匹配。

       选择最佳特征和最佳分界值需要通过两个循环来完成。第一层循环是对特征个数的循环,有多少特征就循环多少次;第二层循环是对于每个特征在样本点中的取值的循环,样本点中该特征取了多少值就循环多少次。在最内层的循环中,按照当前循环的特征以及当前循环的该特征的取值对数据进行划分,即样本点中特征大于该值的分为一类,特征小于等于该值的分为另一类。判断两类数据子集中样本点的个数是否都大于tolN。不大于则跳过该循环,否则计算该划分的混乱度。如果比当前最小混乱度小,则更新当前最小混乱度、当前最佳特征、当前最佳分界值。

       两层循环结束,找到了此次划分的最小混乱度、最佳特征以及最佳分界值。然后,求得划分前的混乱度与划分后的最小混乱度的差。如果差小于tolS,返回“无最佳特征”以及划分前的数据的目标变量的平均值;否则,用上述最佳特征和最佳分界值划分数据,如果划分后的数据子集的样本点个数都大于tolN,返回最佳特征和最佳分界值;否则,返回“无最佳特征”以及划分前的数据的目标变量平的均值。

       CART在构建树时通过这种方式选择最佳特征和最佳分界值。如果返回得到的是“无最佳特征”,那就表明此处应该设为叶子节点,并且把返回得到的平均值作为该叶子节点的取值。如果返回得到最佳特征和最佳分界值,那么就按照该最佳特征和最佳分界值划分数据集,然后在数据子集上重复进行上述选择最佳特征和最佳分界值操作。

       过度匹配是CART的一个缺点,同样也是决策树的缺点。过度匹配,也称为过拟合,指构造树的叶子节点过多。通过降低树的复杂度来避免过拟合的过程称为剪枝,剪枝分为预剪枝和后剪枝。

       预剪枝,即在构造树的过程中同时进行剪枝。在寻找最佳特征和最佳分界值的算法中,设置参数tolS和tolN实际上就是预剪枝。参数tolS和tolN通过它们各自的限制使得某些情况不允许分支。树构建算法对参数tolS和tolN是非常敏感的,只有选择合适的值才能达到比较好的效果。然而,通过不断修改参数tolS和tolN来得到合理结果并不是很好的办法。所以就必须要在树构建好之后再次进行剪枝。

       后剪枝,即在树构造好后进行剪枝。由于不需要用户指定参数,后剪枝是一种更理想化的剪枝方法,尽管其效果可能没有合适的预剪枝那么好。后剪枝利用测试集来对树进行剪枝,所有使用后剪枝方法需要把数据集分为测试集和训练集。

       那么,后剪枝是如何通过测试集对树进行剪枝的呢?

       首先,用训练集构造树。然后,使用训练得到的树对测试集中的样本点进行分类,把测试集的所有样本点都分类到树的每个叶子节点上。我们知道叶子节点上的值就是预测的目标变量,它可能和分到该节点上的样本点的目标变量不同,因为它是一个预测平均值,并不可能是真实值。对于没有分到样本点的叶子节点,从下至上,如果两个叶子节点属于同一父节点,那么对两个叶子节点的预测目标变量求平均值并赋值给父节点,再删掉这两个叶子节点。重复上述操作直到树中的所有叶子节点上均有样本点。

       后剪枝同样是通过类似总方差的方式来判断是否合并叶子节点。用叶子节点上的样本点的目标变量减去叶子节点的预测目标变量,再求平方和,就得到了叶子节点的总方差。同一父节点的两个叶子节点的总方差的和称为合并前的误差。求合并后的误差也比较简单,把两个叶子节点的样本点合并,两个叶子节点的预测目标变量的平均值作为合并后的预测目标变量,用合并的样本点的目标变量减去预测目标变量,再求平方和即可。如果合并后的误差比合并前的误差小,则合并两个叶子节点,即对两个叶子节点的预测目标变量求平均值并赋值给父节点,再删掉这两个叶子节点;否则,保留两个叶子节点。合并的叶子节点的父节点在合并之后被视为叶子节点。对所有的叶子节点重复进行上述剪枝操作,直到没有需要合并的叶子节点。

       一般,为了寻求最佳模型可以同时使用两种剪枝方法。

       用树对数据建模,除了把叶子节点简单地设定为常数值外,还有一种方法是把叶子节点设定为分段线性函数。CART中把一组数据子集的目标变量的平均值设定为叶子节点的取值;而现在,我们可以把这组数据子集的线性回归方程设定该叶子节点的取值。

       这种树构建算法称为模型树



       模型树的可解释性优于CART,并且模型树具有更高的预测准确度。

       模型树的算法和CART差不多,只需要对CART算法做两点简单的修改即可。第一,计算数据混乱度的修改。对于CART,求数据的总方差;对于模型树,先求数据的线性回归方程,然后求真实y值和预测y值的平方误差,即为数据的混乱度。第二,对选择最佳特征和最佳分界值算法的修改。当返回“无最佳特征”时,对于CART,附带返回划分前的数据的目标变量的平均值;对于模型树,更改为返回划分前的数据的线性回归方程Y=X*w或者是线性回归方程的系数矩阵w。

       只要对于CART算法进行这两点修改,算法就变成了模型树。因此,可以说CART和模型树像兄弟一样,在相似的基础上,又有各自的特点。

       树回归算法在预测复杂数据时会比简单的线性模型更有效,它可以对于复杂和非线性的数据建模。

0 0
原创粉丝点击