• 沒有找到結果。

7 . 3 基于单层决策树构建弱分类器

在文檔中 关 于 封 面 (頁 122-125)

7-1

人如

8008

傷法的示意图。左边是数据集,其中直方图的不同宽度表示每个样例 上的不同权重。在经过一个分类器之后,加权的预测结果会通过三角形中的

31?

匕值进行加权。每个三角形中输出的加权结果在圆形中求和,从而得到最终

的输出结果

计算出

3

&

值 之 后 ,可以对权重向量乃进行更新,以使得那些正确分类的样本的权重降低而 错分样本的权重升高。乃的计算方法如下。

如果某个样本被正确分类,那么该样本的权重更改为:

Sum(Z))

而如果某个样本被错分,那么该样本的权重更改为:

£) (<+!) _ A (,)eg '

Sum(D)

在计算出乃之后,人3沾00对又开始进入下一轮迭代。人(1&80邮傷; 法会不断地重复训练和调整 权重的过程,直到训练错误率为0或者弱分类器的数目达到用户的指定值为止。

接 下 来 ,我们将建立完整的八如

3 008

慎 法 。在这之前,我们首先必须通过一些代码来建立弱 分类器及保存数据集的权重。

7 . 3 基于单层决策树构建弱分类器

单 层 决 策 树 (

(^

洳丨

0 ^

^ ,

也 称 决 策 树 桩 )是一种简单的决策树。前面我们已经介绍了决 策树的工作原理,接下来将构建一个单层决策树,而它仅基于单个特征来彳故决策。由于这棵树只 有一次分裂过程,因此它实际上就是一个树桩。

分类器

_

_

_

_

7 . 3

基于 单层 决策 树 构建 弱分 类 器

119

在构造人

4&8 0081

的代码时,我们将首先通过一个简单数据集来确保在算法实现上一切就绪。

然 后 ,建立一个叫

3£1&

化 咖 仍 的 新 文 件 并 加 人 如 下 代 码 : def l o a d S i m p D a t a( ) :

datMat = m a t r i x ( [[ 1. , 2.1], [ 2 . , 1.1],

[2. , 1.]])

classLabels = [1,0, 1.0, -1. 1.0, 1.0]

return d a t M a t ,c lassLabels

7-2

给出了上述数据集的示意图。如 果想 要试 着从 某个坐标轴上选择一个值(即选择一条 与坐 标轴平行的直线)来将所有的圆形点和方形点分开,这显然是不可能的。这就是单层决策树 难以处理的一个著名问题。通过使用多棵单层决策树,我们就可以构建出一个能够对该数据集完 全正确分类的分类器。

单层决策树测试数据

1.0 ~tl 1.4 1.6

7 - 2

用于检测人如

800^

构建函数的简单数据。这不可能仅仅通过在某个坐标轴上选 择某个阈值来将圆形点和方形点分开。人

£1

0081

需要将多个单层决策树组合起 来才能对该数据集进行正确分类

通过键人如下命令可以实现数据集和类标签的导人:

>>> import adaboost

>>> d a t M a t,c l a s s L a b e l s = a d a b o o s t .l o a d S i m p D a t a ()

有了 数 据 ,接下来就岢以通过构建多个函数来建立单层决策树。

结一个函数将用于测试是否有某个值小于或者大于我们正在测试的阈值。第二个函数则更加 复杂一 些 ,它会在一个加权数据集中循环,并找到具有最低错误率的单层决策树。

这个程序的伪代码看起来大致如下:

120

7

章 利 用 八

<338003

丨元算法提高分类性能

7 . 3

基于单层决策 树构 建弱分 类器

121 第二个函数

131^1<1311^ ()

将会遍历

3

1 ^ ^ 1 3 3 5 1 £

乂(

>

函数所有的可能输人值,并找到数 据集上最佳的单层决策树。这 里 的

最佳

是基于数据的权重向量口来定义的,读者很快就会看 到其具体定义了。在确保输人数据符合矩阵格式之后,整个函数就开始执行了。然后,函数将构 建一个称为匕

03

3(

1^1)

的空字典,这个字典用于存储给定权重向量

0

时所得到的最佳单层决策树 的相关信息。变量

nmnStepS

用于在特征的所有可能值上进行遍历。而变量

^d n Err0r

则在一开始 就初始化成正无穷大,之后用于寻找可能的最小错误率。

三层嵌套的£ ( ^循环是程序最主要的部分。第一层£(^ 循环在数据集的所有特征上遍历。考 虑到数值型的特征,我们就可以通过计算最小值和最大值来了解应该需要多大的步长。然 后 ,第 二 层£ ( ^循环再在这些值上遍历。甚至将阈值设置为整个取值范围之外也是可以的。因此,在取 值范围之外还应该有两个额外的步骤。最后一个£ ( ^循环则是在大于和小于之间切换不等式。

在嵌套的三层化1循环 之内 ,我们在数据集及三个循环变量上调用社咖如^ 郎丨^ 丨^函数。

基 于 这 些 循 环 变 量 ,该 函 数 将 会 返 回 分 类 预 测 结 果 。接 下 来 构 建 一 个 列 向 量er r A r r, 如果 口^ 出( ^ 0 ( ^ 3 1 3中的值不等于13匕61风3 1中的真正类别标签值,那么0 ^么^ 的相应位置为1。将 错误向量6 ^ & 1 ^和权重向量0的相应元素相乘并求和,就得到了数值w e ig h te d E r r o r© 。这就 是八£1犯0( ^和分类器交互的地方。这 里 ,我们是基于权重向量^而不是其他错误计算指标来评价 分类器的。如果需要使用其他分类器的话,就需要考虑£ 0:最佳分类器所定义的计算过程。

程序接下来输出所有的值。虽然这一行后面可以注释掉,但是它对理解函数的运行还是很有 帮助的。最 后 ,将当前的错误率与巳有的最小错误率进行对比,如果当前的值较小,那么就在词 典 化 社3匕咖£ ^ 保存该单层决策树。字典、错误率和类别估计值都会返回给八(1&8 0抓 濞 法 。

在文檔中 关 于 封 面 (頁 122-125)