机器学习实战笔记-9-树回归

CART(classification and regression trees)树回归

  1. 优点:可对复杂非线性的数据建模;缺点:结果不易理解;适用于:数值型和标称型。

  2. 构建树函数createTree()的伪代码:

    选择最好的划分方式(得到最佳划分的特征与阈值):用于回归树和模型树
    如果该节点不能再分,将该节点存为叶节点
    执行二元划分
    在右子树调用createTree()函数
    在左子树调用createTree()函数
    
  3. 选择最好的划分方式 伪代码:用于回归树和模型树

    如果所有标签都一样,返回一个叶子节点
    计算当前误差
    对每个特征:
      对每个特征值:
        将数据集划分为两份
        计算划分的误差
        如果当前误差小于当前最小误差,将当前划分设置为最佳划分并更新最小误差
    如果误差减小得不大((S-bestS)\<tolS),返回一个叶子节点(不进行划分) (预剪枝)
    如果划分出的数据集很小(shape(mat0)[0]\<tolN),返回一个叶子节点(不进行划分)(预剪枝)
    返回最佳划分的特征和阈值
    
  4. 回归树中 创建叶子节点 函数代码:回归树中叶子节点是常数值(一堆数据的y平均值)

    def regLeaf(dataset):  
      return mean(dataset[:,-1])
    
  5. 树剪枝(可以避免过拟合) 函数伪代码:

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

分割线:前面是回归树,后面是模型树。上文中的误差是:方差的平方,即误差(值-平均值)的平方和。


下文中的误差是:误差(真实值-预测值)的平方和。


  1. 模型树中 创建叶子节点 函数代码:模型树中的叶子是一个函数模型

    def modelLeaf(dataset):
      ws,X,Y=linearSolve(dataset)
      return ws
    def modelErr(dataset):
      ws,X,Y=linearSolve(dataset)
      yHat=X*ws
      return sum(power(Y-yHat,2))
    

可用\(corrcoef(yHat,\ y,\ rowvar =0)\)比较树回归和标准的线性回归法,计算相关系数\(R^{2}\)的值。

如何检查过拟合(分类划分得太细导致预测时失误率增加;回归关注低过细导致预测时误差大)?

交叉验证(每次挑选一部分作为训练集,其余部分作为测试集,重复多次求测试结果的平均值)。

如何避免?提前终止,数据集扩增,正则化。CART树剪枝。

posted @ 2019-08-30 14:22  云远·笨小孩  阅读(213)  评论(0编辑  收藏  举报