• 沒有找到結果。

9 . 3 将〇八闩丁算法用于回归

在文檔中 关 于 封 面 (頁 167-171)

要 对 数 据 的 复 杂 关 系 建 模 ,我 们 已 经 决 定 借 用 树 结 构 来 帮 助 切 分 数 据 ,那 么 如 何 实 现 数 据 的 切 分 呢 ? 怎 么 才 能 知 道 是 否 已 经 充 分 切 分 呢 ? 这 些 问 题 的 答 案 取 决 于 叶 节 点 的 建 模 方 式 。回 归 树 假 设 叶 节 点 是 常 数 值 , 这 种 策 略 认 为 数 据 中 的 复 杂 关 系 可 以 用 树 结 构 来 概 括 。

为 成 功 构 建 以 分 段 常 数 为 叶 节 点 的 树 ,需 要 度 量 出 数 据 的 一 致 性 。第 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

9 - 2

用于测试回归树的分段常数数据集

在文檔中 关 于 封 面 (頁 167-171)