python决策树剪枝_决策树python源码_python决策树scikit_python决策树剪枝

决策树python源码

决策树例题

本文为博主原创,由于没有可以参考的答案,所以内容中若有错误的地方烦请指正,不甚感激。注:本文中的代码均使用python,常用工具包包括 pandas,scikit-learn,numpy, scipy,matplotlib等。

4.1试证明对于不含冲突数据(即特征向量完全相同但标记不同)的训练集,必存在与训练集一致(即训练误差为0)的决策树答:假设不存在与训练集一致的决策树,那么训练集训练得到的决策树至少有一个节点上存在无法划分的多个数据(若节点上没有冲突数据,那么总是能够将数据分开的)。这与前提-不含冲突数据 矛盾,因此必存在与训练集一致的决策树4.2试析使用“最小训练误差”作为决策树划分选择的缺陷。答:若以最小训练误差作为决策树划分的依据,由于训练集和真是情况总是会存在一定偏差,这使得这样得到的决策树会存在过拟合的情况,对于未知的数据的泛化能力较差。因此最小训练误差不适合用来作为决策树划分的依据。4.3试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数据生成一棵决策树答:基于信息熵进行划分选择的决策树算法即ID3决策树,代码见我的另外一篇博文:ID3决策树的Python实现

4.4试编程实现基于基指数进行划分选择的决策树算法,并为表4.2中数据生成预剪枝、后剪枝决策树,并与未剪枝决策树进行比较。答:基于基指数进行划分选择的决策树算法即CART决策树,代码见我的另外一篇博文:CART决策树与剪枝处理

CART未剪枝决策树:

CART预剪枝决策树:

CART后剪枝决策树:

可以看出,后剪枝比起预剪枝不容易出现欠拟合的情况。

4.7图4.2是一个递归算法,若面临巨量数据,则决策树的层数会很深,使用递归方法易导致“栈”溢出,试使用“队列”数据结构,以参数maxDepth控制数的最大深度,写出与图4.2等价、但不使用递归的决策树生成算法。答:下面算法我没有尝试写对应的代码,若有朋友写过欢迎交流/指正。以下代码为 队列MaxDepth控制,即广度优先搜索。其实我觉得这里如果要用MaxDepth进行控制的话,应该选择堆栈而非队列,即应该用深度优先搜索。决策树python源码但下面还是给出队列的形式。若要改为深度优先搜索只需要将先进后出 改成 先进先出即可(即数据存取都在一端)。——————————————————————————————————————————————————————输入:训练集 D={(x1,y1),(x2,y2),...,(xm,ym)}; 属性集 A={a1,a2,...,ad} 最大深度 MaxDepth过程:函数TreeGenerate(D,A,MaxDepth)1:生成节点root2:if D中样本全部属于同一类别C then3: 将root标记为C类叶节点;return4:end if5:if A=空集 or D中样本在A上取相同 then6: 将root标记为叶节点,其类别标记为D中样本数最多的类;return7:end if8:从A中选择最优划分属性a*;9:将root标记为分支节点,属性为属性a*;10:将root放入NodeQueue;11:将D放入DataQueue;12:将A\{a*}放入AQueue;13:初始化深度depth=1;14:将depth放入DepthQueue;15:while NodeQueue 非空:16: 取出NodeQueue队尾的节点rNode,其对应的属性是ra*;17: 取出DataQueue队尾的数据集rD; #此处r均指队尾rear18: 取出AQueue队尾的属性集rA;19: 取出DepthQueue队尾的元素rdepth;20: if rdepth==MaxDepth:21: 将rNode标记为叶节点,类别标记为rD中样本最多的类;22: continue; #跳过本次循环,即不再对这个节点做展开23: for ra*的每一个取ra*v do:24: 为rNode生成一个分支节点,令rDv表示rD在ra*上取为ra*v的样本子集;25: if rDv为空 then:26: 将分支节点标记为叶节点,其类别标记为rD中样本最多的类;27: else if rD中样本全部属于同一类别C then28: 将分支节点标记为C类叶节点;29: else if rA=空集 orrD中样本在A上取相同 then30: 将分支节点标记为叶节点,其类别标记为rD中样本数最多的类;31: else:32: 从rA中选择最优划分属性a*v;33: 将分支节点的属性记为a*v;34: 将分支节点放入NodeQueue的队头;35: 将rDv放入DataQueue的队头;36: 将rA\{a*v}放入AQueue的队头;37: 将(rDepth1)放入DepthQueue的队头;38: end if39: end for40:end while输入:以root为根节点的一棵决策树——————————————————————————————————————————————————————

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-28592-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值