李航《统计学习方法》习题8.1(用CART作弱分类器)

前言:

笔者是刚刚入门机器学习的小白,最近在看李航老师的《统计学习方法》,顺便做一下课后习题巩固知识。今天下午也是花了很长时间终于做完了习题8.1,遂心血来潮,想着写一篇博客分享一下自己对这道题的理解。如有错误,还望指正。

题目:

在这里插入图片描述

解题思路:

算法

题目要求弱分类器为决策树桩,并用AdaBoost算法学习一个强分类器。对于AdaBoost,想要了解算法的详细过程可以查阅《统计学习方法》,书中有明确的介绍。这里我就简单归纳一下这道题用到的几个关键步骤:

1.初始化权值分布:
      假设训练数据数目为N,权值一般初始化为1/N。
2.训练基本分类器也就是弱分类器:
      这里弱分类器我们选用CART,然后使用具有权值分布的训练数据,得到一个决策树桩。
3.计算使用该决策树桩得到的分类误差率Em,系数alpha
4.更新训练数据的权值分布
5.循环,直到误差率为0或者小于某个阈值。
6.构建基本分类器的线性组合

关键点

解决这道题我认为有两个比较关键的地方:
      1.这里选用的决策树桩是CART,CART采用的是基尼系数来选取最优特征,而AdaBoost算法是通过改变样本的权重来实现弱分类器的迭代,如何将基尼系数的计算与样本权重结合起来?
      2.对于书中的例题以及大部分的决策树桩,他们弱分类器的分类结果都是明确的二分类,即一个分类结果为1,另一个就为-1;而本题的弱分类器是CART,如果使用一般决策树的思想:对结点中的样本采用多数表决,就有可能使这个弱分类的得到的分类结果都是1或者都是-1,这样看起来好像就不是一个“分类器”,该如何抉择这两种做法?

      关于第一个问题,我的想法是:因为CART中基尼系数表示的意义是从数据集D中随机抽取两个样本,其类别标记不一致的概率。计算基尼系数的过程中会牵扯到不同类别数据的概率,而训练数据的权重表示每条数据的重要程度,进而可以看作是该训练数据出现的概率(即权重大的数据出现的概率大),所以就可以在计算基尼系数对数据进行分类时,将不同类别里的数据乘上它的权重再计算概率,这样得到的基尼系数就可以将权重结合起来了。
      解决第二个问题,我采用的是后者即多数表决。因为不管是AdaBoost算法还是其等价形式前向分步算法,他们迭代的思想始终都是极小化损失函数,也就是尽可能的使每一次迭代得到的弱分类器的分类误差最小。而采用多数表决,虽然有可能使弱分类器不像一个“分类器”,但可以极小化损失函数,从而使最终线性组合的基本分类器有一个较好的分类效果。

代码

计算基尼系数

#计算划分出去数据集的基尼指数
def calGini(dataArr,weights):
    length = shape(dataArr)[0]
    num = 0.0
    labelClass = {
   }
    #利用字典键的唯一性,进行数据的分类
    for i in range(length):
        label = dataArr[i][-1]
        if label not in labelClass.keys():
            labelClass[label] = 0
        #数据分类时,乘上训练数据的权重
        labelClass[label]+=weights[i]
        num+=weights[i]
    gini = 1
    for key in labelClass.keys():
        prop = float(labelClass[key])/num
        gini-= prop*prop
    return gini
#划分数据集
def splitData(dataArr,weights,axis,value,thresh):
    length = shape(dataArr)[0]
    dataSet = []
    weightSet = []
    #等于特征值的分到左子树,不等于特征值分到右子树
    if thresh == 'left':
        for i in range(length):
            data = dataArr
  • 16
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值