要 对 数 据 的 复 杂 关 系 建 模 ,我 们 已 经 决 定 借 用 树 结 构 来 帮 助 切 分 数 据 ,那 么 如 何 实 现 数 据 的 切 分 呢 ? 怎 么 才 能 知 道 是 否 已 经 充 分 切 分 呢 ? 这 些 问 题 的 答 案 取 决 于 叶 节 点 的 建 模 方 式 。回 归 树 假 设 叶 节 点 是 常 数 值 , 这 种 策 略 认 为 数 据 中 的 复 杂 关 系 可 以 用 树 结 构 来 概 括 。
为 成 功 构 建 以 分 段 常 数 为 叶 节 点 的 树 ,需 要 度 量 出 数 据 的 一 致 性 。第 3 章 使 用 树 进 行 分 类 , 会 在 给 定 节 点 时 计 算 数 据 的 混 乱 度 。 那 么 如 何 计 算 连 续 型 数 值 的 混 乱 度 呢 ? 事 实 上 , 在 数 据 集 上 计 算 混 乱 度 是 非 常 简 单 的 。 首 先 计 算 所 有 数 据 的 均 值 , 然 后 计 算 每 条 数 据 的 值 到 均 值 的 差 值 。 为 了 对 正 负 差 值 同 等 看 待 , 一 般 使 用 绝 对 值 或 平 方 值 来 代 替 上 述 差 值 。 上 述 做 法 有 点 类 似 于 前 面 介 绍 过 的 统 计 学 中 常 用 的 方 差 计 算 。唯 一 的 不 同 就 是 ,方 差 是 平 方 误 差 的 均 值 (均 方 差 ), 而 这 里 需 要 的 是 平 方 误 差 的 总 值 (总 方 差 )。 总 方 差 可 以 通 过 均 方 差 乘 以 数 据 集 中 样 本 点 的 个 数 来 得 到 。
有 了 上 述 误 差 计 算 准 则 和 上 一 节 中 的 树 构 建 算 法 ,下面 就可以开 始构建数 据集上的 回归 树 了 。
9 . 3 . 1 构建树
构 建 回 归 树 , 需 要 补 充 一 些 新 的 代 码 , 使 程 序 清 单 9 - 1 中 的 函 数 < ^ 6 3 = 6 |^ 6 6 ( ) 得 以 运 转 。 首 先 要 做 的 就 是 实 现 比 0 0 3 纽 郎 1 3 ? 1 让 (> 函 数 。 给 定 某 个 误 差 计 算 方 法 , 该 函 数 会 找 到 数 据 集 上 最 佳 的 二 元 切 分 方 式 。 另 外 ,该 函 数 还 要 确 定 什 么 时 候 停 止 切 分 ,一 旦 停 止 切 分 会 生 成 一 个 叶 节 点 。 因 此 , 函 数 比 0 0 3 沾 6 化 3 ? 1 让 ()只 需 完 成 两 件 事 :用 最 佳 方 式 切 分 数 据 集 和 生 成 相 应 的 叶 节 点 。
从 程 序 清 单 9 - 1 可 以 看 出 ,除 了 数 据 集 以 夕 卜 ,函 数 也 0 0 3 0 8 6 3 七3 9 1 1 1 < ) 还 有 1 6 3 £ 1 丫9 0 、 6 1 3 ^ ^ ^ > 0 和 0 0 3 这 三 个 参 数 。 其 中 1 0 & £ 7 乂口6 是 对 创 建 叶 节 点 的 函 数 的 引 用 , 6 [ 1 ^ 乂口6 是 对 前 面 介 绍 的 总 方 差 计 算 函 数 的 引 用 , 而 0 ? 3 是 一 个 用 户 定 义 的 参 数 构 成 的 元 组 , 用 以 完 成 树 的 构 建 。
164
第9
章 树 回 归9 . 3
将CART
算法用于回归165
因为这里需要返回的是总方差,所以要用均方差乘以数据集中样本的个数。第三 个函数是比
003
纽6
社3? 1
让 (> ,
它是回归树构建的核心函数。该函数的目的是找到数 据 的 最 佳 二 元 切 分 方 式^
如 果 找 不 到 一 个“
好”
的 二 元 切 分 ,该 函 数 返 回1^01
^并 同 时 调 用£ ^ ^ 3 1 6 ^
拍 ()方 法 来 产 生 叶 节 点 ,叶 节 点 的 值 也 将 返 回 贴! ^
。接 下 来 将 会 看 到 ,在 函 数 也003
沾6
化3?1
让 ()中有三种情况不会切分,而是直接创建叶节点。如果找到了一个“
好” 的切 分 方 式 ,则返回特征编号和切分特征值。函 数 比
0030863[8011
七()
一开始为0
口3
设 定 了 比13
和七011}
这两个值。它们是用户指定的参 数 ,用于控制函数的停止时机。其中变量1^13
是容许的误差下降值,& ^
是切分的最少样本数。接下来通过对当前所有目标变量建立一个集合,函数比
003
纽6# 3
口1
让 ( ) 会统计不同剩余特征 值 的数目 。如果该数目为1 ,
那么就不需要再切分而直接返回0
。然后函数计算了当前数据集的 大小和误差。该误差3
将用于与新切分误差进行对比’
来检查新切分能否降低误差。下面很快就 会看到这一点。这 样 ,用于找到最佳切分的几个变量就被建立和初始化了。下面就将在所有可能的特征及其 可能取值上遍历,找到最佳的切分方式。最佳切分也就是使得切分后能达到最低误差的切分。如 果切分数据集后效果提升不够大,那么就不应进行切分操作而直接创建叶节点©。另外还需要检 查两个切分后的子集大小,如果某个子集的大小小于用户定义的参数
101
队 那 么 也 不 应 切 分 。 最 后 ,如果这些提前终止条件都不满足,那么就返回切分特征和特征值®。 ,9 . 3 . 2 运行代码
下面在一些数据上看看上节代码的实际效果,以图
9-1
的数据为例,我们的目标是从该数据 生成一*
棵回归树。将程序清单
9-2
中的代码添加到1
明7 ^
從$7
文件并保存,然后在?5
^«^提 示 符 下 输 人:> > > r e l o a d ( r e g T r e e s )
< m o d u l e 1r e g T r e e s 1 f r o m 1r e g T r e e s . p y c 1>
>>> f r o m n u m p y i m p o r t *
图
9-1
的数据存储在文件6
父00
加 中 。>>> m y D a t = r e g T r e e s .l o a d D a t a S e t ( 'e x 0 0 .t x t 1)
>>> m y M a t = m a t {myDat)
>>> r e g T r e e s .c r e a t e T r e e ( m y M a t )
{ ' s p I n d ' : 0, 1s p V a l 1 : m a t r i x ( [[ 0 . 4 8 813]]>, ' r i g h t ' : - 0 . 0 4 4 6 5 0 2 8 5 7 1 4 2 8 5 7 3 3 ,
' l e f t ' : 1 . 0 1 8 0 9 6 7 6 7 2 4 1 3 7 9 }
166
第9
章 树 回 归—1 0 ^--- j__________ I__________ I__________ J-- --- L»---
1---0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2
x
-
图9 - 1
基于0
八尺1
算法构建回归树的简单数据集 再看一个多次切分的例子,参见图9-2
的数据集。-11--- --- 1___ ______ I__________I__________ I__________I--- 1 I
-0.2 0.0 0.2 0.4 0.6 0.8 1.0 1.2
X
图