CART(classification and regression trees)树回归
优点:可对复杂和非线性的数据建模;缺点:结果不易理解;适用于:数值型和标称型。
构建树函数createTree()的伪代码:
选择最好的划分方式(得到最佳划分的特征与阈值):用于回归树和模型树 如果该节点不能再分,将该节点存为叶节点 执行二元划分 在右子树调用createTree()函数 在左子树调用createTree()函数
选择最好的划分方式 伪代码:用于回归树和模型树
如果所有标签都一样,返回一个叶子节点 计算当前误差 对每个特征: 对每个特征值: 将数据集划分为两份 计算划分的误差 如果当前误差小于当前最小误差,将当前划分设置为最佳划分并更新最小误差 如果误差减小得不大((S-bestS)\<tolS),返回一个叶子节点(不进行划分) (预剪枝) 如果划分出的数据集很小(shape(mat0)[0]\<tolN),返回一个叶子节点(不进行划分)(预剪枝) 返回最佳划分的特征和阈值
回归树中 创建叶子节点 函数代码:回归树中叶子节点是常数值(一堆数据的y平均值)
def regLeaf(dataset): return mean(dataset[:,-1])
树剪枝(可以避免过拟合) 函数伪代码:
python 基于已有的树划分测试数据: 如果存在任一子集是一棵树,则在该子集递归剪枝过程 计算将当前两个叶节点合并后的误差 计算不合并的误差 如果合并会降低误差,将叶节点合并
分割线:前面是回归树,后面是模型树。上文中的误差是:方差的平方,即误差(值-平均值)的平方和。
下文中的误差是:误差(真实值-预测值)的平方和。
模型树中 创建叶子节点 函数代码:模型树中的叶子是一个函数模型
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树剪枝。