决策树总结(个人学习体会)

算法定义

  • 决策树:是一种监督学习(Supervised Learning)方法,通过不断对某个属性进行判断得到一个分支最终形成决策树,这个决策树能够对新的数据进行正确的分类。
  • 代表算法:ID3,C4.5
  • 损失函数:正则化的极大似然函数

算法流程

  1. 将所有特征看成一个一个的节点。
  2. 分割每个特征,找到最好的分割点;将数据划分为不同的子节点,N1、N2、…、Nm,计算子节点的纯度信息;
  3. 由2步选择出最优的特征和划分方式;得出子节点:N1、N2、…、Nm,;
  4. 对于N1、N2、…、Nm,继续执行2~3步,直到每个最终子节点都足够。
  5. 流程如下:
    If so return 类标签:
    Else寻找划分数据集的最好特征划分数据集创建分支节点for 每个划分的子集调用函数createBranch()并增加返回结果到分支节点中return 分支节点
    

特征选择

  • 目的:选取能够对训练集分类的特征。
  • 标准:信息增益,信息增益比,Gini 指数;
  • 特征选择方法:通过数据集进行划分,计算划分前后信息发生的变化,变化最高的就是最好的选择。

树的生成

  • 特征选择:选取信息增益最大、信息增益比最大、Gini 指数最小的特征。
  • 生成过程:从根节点开始,不断选取局部最优特征;
  • 树的生成方法(ID3算法):在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树。
    1. 从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征。
    2. 由该特征的不同取值建立子节点,再对子结点递归地调用以上方法,构建决策树;
    3. 直到所有特征的信息增益均很小或没有特征可以选择为止;
    4. 最后得到一个决策树。

树的剪枝

  • 目的:决策树的剪枝是为了防止树的过拟合,增强其泛化能力。
  • 步骤:预剪枝和后剪枝。

算法优缺点

  • 优点

    1. 使用可视化模型。
    2. 很容易理解和解释。
    3. 可以与其他决策技术结合使用。
    4. 即使只有很少的数据也有价值。
    5. 可以基于分析得出的情况生成确定不同方案的最差,最佳和预期值。
  • 缺点
    1. 它们是不稳定的,这意味着数据的微小变化可能导致最优决策树结构的巨大变化。
    2. 它们通常相对不准确。许多其他预测因子使用类似数据表现更好。
    3. 对于包括具有不同级别数的分类变量的数据,决策树中的信息增益偏向于具有更多级别的那些属性。
    4. 计算可能变得非常复杂,特别是如果许多值不确定和/或许多结果是相关的。

算法实现

  • 算法实现一(python,dt.py)
import numpy as npclass Node:def __init__(self, left, right, rule):self.left = leftself.right = rightself.feature = rule[0]self.threshold = rule[1]class Leaf:def __init__(self, value):self.value = valueclass DecisionTree:def __init__(self,classifier=True,max_depth=None,n_feats=None,criterion="entropy",seed=None):if seed:np.random.seed(seed)self.depth = 0self.root = Noneself.n_feats = n_featsself.criterion = criterionself.classifier = classifierself.max_depth = max_depth if max_depth else np.infif not classifier and criterion in ["gini", "entropy"]:raise ValueError("{} is a valid criterion only when classifier = True.".format(criterion))if classifier and criterion == "mse":raise ValueError("`mse` is a valid criterion only when classifier = False.")def fit(self, X, Y):self.n_classes = max(Y) + 1 if self.classifier else Noneself.n_feats = X.shape[1] if not self.n_feats else min(self.n_feats, X.shape[1])self.root = self._grow(X, Y)def predict(self, X):return np.array([self._traverse(x, self.root) for x in X])def predict_class_probs(self, X):assert self.classifier, "`predict_class_probs` undefined for classifier = False"return np.array([self._traverse(x, self.root, prob=True) for x in X])def _grow(self, X, Y, cur_depth=0):# if all labels are the same, return a leafif len(set(Y)) == 1:if self.classifier:prob = np.zeros(self.n_classes)prob[Y[0]] = 1.0return Leaf(prob) if self.classifier else Leaf(Y[0])# if we have reached max_depth, return a leafif cur_depth >= self.max_depth:v = np.mean(Y, axis=0)if self.classifier:v = np.bincount(Y, minlength=self.n_classes) / len(Y)return Leaf(v)cur_depth += 1self.depth = max(self.depth, cur_depth)N, M = X.shapefeat_idxs = np.random.choice(M, self.n_feats, replace=False)# greedily select the best split according to `criterion`feat, thresh = self._segment(X, Y, feat_idxs)l = np.argwhere(X[:, feat] <= thresh).flatten()r = np.argwhere(X[:, feat] > thresh).flatten()# grow the children that result from the splitleft = self._grow(X[l, :], Y[l], cur_depth)right = self._grow(X[r, :], Y[r], cur_depth)return Node(left, right, (feat, thresh))def _segment(self, X, Y, feat_idxs):best_gain = -np.infsplit_idx, split_thresh = None, Nonefor i in feat_idxs:vals = X[:, i]levels = np.unique(vals)thresholds = (levels[:-1] + levels[1:]) / 2 if len(levels) > 1 else levelsgains = np.array([self._impurity_gain(Y, t, vals) for t in thresholds])if gains.max() > best_gain:split_idx = ibest_gain = gains.max()split_thresh = thresholds[gains.argmax()]return split_idx, split_threshdef _impurity_gain(self, Y, split_thresh, feat_values):"""Compute the impurity gain associated with a given split.IG(split) = loss(parent) - weighted_avg[loss(left_child), loss(right_child)]"""if self.criterion == "entropy":loss = entropyelif self.criterion == "gini":loss = ginielif self.criterion == "mse":loss = mseparent_loss = loss(Y)# generate splitleft = np.argwhere(feat_values <= split_thresh).flatten()right = np.argwhere(feat_values > split_thresh).flatten()if len(left) == 0 or len(right) == 0:return 0# compute the weighted avg. of the loss for the childrenn = len(Y)n_l, n_r = len(left), len(right)e_l, e_r = loss(Y[left]), loss(Y[right])child_loss = (n_l / n) * e_l + (n_r / n) * e_r# impurity gain is difference in loss before vs. after splitig = parent_loss - child_lossreturn igdef _traverse(self, X, node, prob=False):if isinstance(node, Leaf):if self.classifier:return node.value if prob else node.value.argmax()return node.valueif X[node.feature] <= node.threshold:return self._traverse(X, node.left, prob)return self._traverse(X, node.right, prob)def mse(y):return np.mean((y - np.mean(y)) ** 2)def entropy(y):hist = np.bincount(y)ps = hist / np.sum(hist)return -np.sum([p * np.log2(p) for p in ps if p > 0])def gini(y):hist = np.bincount(y)N = np.sum(hist)return 1 - sum([(i / N) ** 2 for i in hist])

决策树总结(个人学习体会)相关推荐

  1. 决策树模型与学习《一》

    决策树总结<一>.md 决策树模型与学习 1. 定义 一般的,一棵决策树包含一个根结点,若干个内部结点和若干个叶结点:叶结点对应于决策结果,其他每个结点则对应于一个属性测试:每个结点包含的 ...

  2. R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比

    R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...

  3. c#学习体会:使用 ref 和 out 传递数组

    c#学习体会:使用 ref 和 out 传递数组(downmoon),希望与大家分享1.与 所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值. 例如: ...

  4. 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...

    小学信息技术学习体会 大家都对小学信息技术学习体会特别关注,东城教研特别为大家整理了一些有关小学信息技术学习体会的内容,其中,培养学生的创新意识和创造能力.下面就结合我的教学实践,谈谈我的几点体会.一 ...

  5. 近期爬虫学习体会以及爬豆瓣Top250源码实战

    近期爬虫学习体会以及爬豆瓣Top250源码实战 我是在B站https://www.bilibili.com/video/BV12E411A7ZQ?p=25里学习的,至今已经可以手写爬豆瓣Top250代 ...

  6. Office计算机心得,OFFICE心得学习体会.ppt

    OFFICE心得学习体会.ppt 会专61001 唐林 21 会专61001 唐林 21 会专61001 唐林 21 记在大一结束前 * 会专61001 唐林 21 * 我学word 我学习计算机,就 ...

  7. 【DataWhale学习】Day10~13-4章决策树——西瓜书学习摘录笔记

    [DataWhale学习]Day10~13-4章决策树--西瓜书学习摘录笔记 本文参考了周志华老师的西瓜书,李航老师的统计学习方法,谢文睿大佬的南瓜书(无推导尿点,仅加深理解食用) 决策树模型 ​ 决 ...

  8. JavaOOP(面向对象)学习体会

    JavaOOP(面向对象)学习体会 类和对象的概念 类:具体相同特征和行为的事物的抽象 对象:万事万物皆对象 类是对象的类型! 对象是类的实例 ! 封装 //特征---->属性(特性)Strin ...

  9. 操作系统学习体会之进程管理篇

    计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...

最新文章

  1. 华为腾讯百度众安微众360大咖齐聚,2019中国区块链开发者大会首批议程曝光!...
  2. 多维卷积与一维卷积的统一性(运算篇)
  3. 【LeetCode从零单排】No118 Pascal's Triangle
  4. 开放下载!《阿里云存储白皮书》全面解读阿里云存储二十年的技术演进
  5. 设计模式示例_介体设计模式示例
  6. nodejs websocket server
  7. tensorflow之random_normal
  8. 双击获取GridView控件行信息
  9. 数据库访问的性能问题与瓶颈问题
  10. Error creating bean with name 'rocketMQTemplate' defined in class path resource
  11. Flume 1.8.0 用户指南(Flume 1.8.0 User Guide)
  12. AJAX培训第二讲:使用AJAX框架(下)
  13. Python词频统计
  14. c语言题模板大全,C语言试题库完整版整理版
  15. 如何借助表格优化直通车分时折扣
  16. 修改远程git仓库密码 - 报错 fatal: Authentication failed for
  17. Python量化投资——股票择时到底能否赚钱?ADX指标的有效性回测
  18. (Python)Numpy矩阵增加/减少一个维度
  19. esc中文是什么意思_汽车ESC什么意思 汽车ESC有什么用
  20. 用户画像数据指标体系之风险控制维度

热门文章

  1. Ceph分布式集群部署
  2. C++如何创建对角矩阵
  3. 教你如何简单压缩过大的PDF文件
  4. 浏览器获取MAC地址
  5. 面试系列MySql:谈谈MVCC机制的理解
  6. 一篇文章教你如何写出【✨无法维护✨】的代码?
  7. 唐天下文化传播:惹火2021公司新年年会,天下谁人不识君?
  8. webshell一句话木马大全
  9. 【无标题】6. 青蛙与蚊子
  10. 车辆质量与道路坡度估计