后续再次学习,现在理解有些模糊。
优点:可以对复杂和非线性的数据建模
缺点:结果不易理解
适用数据类型:数值型(转换成二值型)和标称型数据
树回归的一般方法
收集数据:采用任意方法收集数据。
准备数据:需要数值型的数据,标称型数据应该映射成二值型数据。
分析数据:绘出数据的二维可视化显示结果,以字典方式生成树。
训练算法:大部分时间都花费在叶节点树模型的构建上。
测试算法:使用测试数据上的R2值来分析模型的效果。
使用算法:使用训练出的树做预测,预测结果还可以用来做很多事情
回归树与分类树的思路类似,但叶节点的数据类型不是离散型,而是连续型。
使用一部字典来存储树的数据结构,该字典将包含:
- 待切分的特征。
- 待切分的特征值。
- 右子树。当不再需要切分的时候,也可以是单个值。
- 左子树。与右子树类似。
计算连续型数值的混乱度:首先计算所有数据的均值,然后计算每条数据的值到均值的差值。为了对正负差值同等看待,一般使用绝对值或平方值来代替上述差值。类似于方差,方差是平方误差的均值(均方差),而这里需要的是平方误差的总值(总方差)。总方差可以通过均方差乘以数据集中样本点的个数来得到。
函数createTree()的伪代码:
找到最佳的待切分特征:
如果该节点不能再分,将该节点存为叶节点
执行二元切分
在右子树调用createTree()方法
在左子树调用createTree()方法
函数chooseBestSplit()的伪代码:
对每个特征:
对每个特征值:
将数据集切分成两份
计算切分的误差
如果当前误差小于当前最小误差,那么将当前切分设定为最佳切分并更新最小误差
返回最佳切分的特征和阈值
通过降低决策树的复杂度来避免过拟合的过程称为剪枝。
预剪枝:提前设定终止条件
后剪枝:使用测试集和训练集
后剪枝:将数据集分成测试集和训练集。首先指定参数,使得构建出的树足够大、足够复杂,便于剪枝。接下来从上而下找到叶节点,用测试集来判断将这些叶节点合并是否能降低测试误差。如果是的话就合并。
函数prune()的伪代码如下:
基于已有的树切分测试数据:
如果存在任一子集是一棵树,则在该子集递归剪枝过程
计算将当前两个叶节点合并后的误差
计算不合并的误差
如果合并会降低误差的话,就将叶节点合并
用树来对数据建模,除了把叶节点简单地设定为常数值之外,还有一种方法是把叶节点设定为分段线性函数,这里所谓的分段线性(piecewise linear)是指模型由多个线性片段组成。