数据集中经常包含一些复杂的相互关系,使得输入数据和目标变量之间呈现非线性关系。对这些复杂的关系建模,一种可行的方式是使用树来对预测值分段,包括分段常数和分段直线。
-
线性回归方法(局部加权线性回归除外)创建的模型需要拟合所以的样本点。面对许多非线性问题,不可能使用全局线性模型来拟合任何数据。
-
一种可行的方法是将数据集切分成许多份易建模的数据,然后再利用线性回归方法进行建模。
-
决策树不断将数据切分成小的数据集,直到所有目标变量完全相同,或者数据不能再切分为止。决策树是一种贪心算法,它要在给定时间内做出最佳选择,但并不关心能否达到全局最优。
-
ID3算法:每次选取当前最佳特征来分割数据,并按照该特征的所有可能取值来切分。例如,一个特征有四种取值,那么数据将被切分成4份。一旦按某特征切分后,该特征在之后的算法执行过程中将不会再起作用。(切分过于迅速且不能处理连续型特征)
-
二元切分法:每次将数据切分为两份。如果特征值大于给定值就走左子树,否者,走右子树。
-
CART(Classification And Regression Trees,分类回归树),即可用于分类,也可用于回归。
-
用字典存储树的数据结构,该字典包括4个元素:
1.待切分的特征。2.待切分的特征值。3.右子树。当不在需要切分的时候,也可以是单个值。4.左子树 -
回归树:叶节点使用的模型是分段常数
-
模型树:叶节点使用的模型是线性回归方程
构建树
- createTree()函数:
伪代码:
找到最佳的切分特征:
如果该节点不能再切分,将该节点存为叶节点
执行二元切分
在右子树调用createTree()方法
在左子树调用createTree()方法
- 如何实现数据的切分?怎么才知道是否已经充分切分?这些问题的答案,取决于叶节点的建模方式。
- chooseBestSplot()函数:
给定某个误差计算方法。该函数会找到数据集上最佳的二元切分方式,还要确定什么时候停止切分,一旦停止切分会生成一个叶节点。
完成两件事:
用最佳的方式切分数据集和生成相应的叶节点。
伪代码:
对每个特征:
对每个特征值:
将数据集切分成两份:
计算切分的误差
如果当前误差小于当前最小误差,那么将当前切分设定为最佳切分并更新最小误差。
返回最佳切分的特征和阈值
树剪枝
一棵树如果节点过多,表明该模型可能对数据进行了“过拟合”。可以使用测试集上某种交叉验证技术来发现过拟合。
通过降低决策树的复杂度来减小过拟合的过程称为剪枝(pruning)。
- 预剪枝(prepruning):在树的构建过程中进行剪枝。(预剪枝更有效,但需要用户定义一些参数)
- 后剪枝(postpruning):当树构建完毕再进行剪枝
使用后剪枝方法需要将数据集分成测试集和训练集。首先构建一个足够大,足够复杂的树,便于剪枝。接下来从上而下找到叶节点,用测试集来判断将这些叶节点合并是否能降低测试误差,如果是的话,就合并。
伪代码:
基于已有的树切分测试数据:
如果存在任一子集是一棵树,则在该子集递归剪枝过程
计算将将当前两个叶节点合并后的误差
计算不合并的误差
如果合并会降低误差,就将叶节点合并
模型树
- 将叶节点设定为分段线性函数
分段线性(piecewise linear):模型由多个线性片段组成。
树回归与标准回归的比较
- 计算相关系数