决策树总结(个人学习体会)
决策树总结(个人学习体会)
算法定义
- 决策树:是一种监督学习(Supervised Learning)方法,通过不断对某个属性进行判断得到一个分支最终形成决策树,这个决策树能够对新的数据进行正确的分类。
- 代表算法:ID3,C4.5
- 损失函数:正则化的极大似然函数
算法流程
- 将所有特征看成一个一个的节点。
- 分割每个特征,找到最好的分割点;将数据划分为不同的子节点,N1、N2、…、Nm,计算子节点的纯度信息;
- 由2步选择出最优的特征和划分方式;得出子节点:N1、N2、…、Nm,;
- 对于N1、N2、…、Nm,继续执行2~3步,直到每个最终子节点都足够。
- 流程如下:
If so return 类标签: Else寻找划分数据集的最好特征划分数据集创建分支节点for 每个划分的子集调用函数createBranch()并增加返回结果到分支节点中return 分支节点
特征选择
- 目的:选取能够对训练集分类的特征。
- 标准:信息增益,信息增益比,Gini 指数;
- 特征选择方法:通过数据集进行划分,计算划分前后信息发生的变化,变化最高的就是最好的选择。
树的生成
- 特征选择:选取信息增益最大、信息增益比最大、Gini 指数最小的特征。
- 生成过程:从根节点开始,不断选取局部最优特征;
- 树的生成方法(ID3算法):在决策树各个结点上对应信息增益准则选择特征,递归地构建决策树。
- 从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征。
- 由该特征的不同取值建立子节点,再对子结点递归地调用以上方法,构建决策树;
- 直到所有特征的信息增益均很小或没有特征可以选择为止;
- 最后得到一个决策树。
树的剪枝
- 目的:决策树的剪枝是为了防止树的过拟合,增强其泛化能力。
- 步骤:预剪枝和后剪枝。
算法优缺点
- 优点
- 使用可视化模型。
- 很容易理解和解释。
- 可以与其他决策技术结合使用。
- 即使只有很少的数据也有价值。
- 可以基于分析得出的情况生成确定不同方案的最差,最佳和预期值。
- 缺点:
- 它们是不稳定的,这意味着数据的微小变化可能导致最优决策树结构的巨大变化。
- 它们通常相对不准确。许多其他预测因子使用类似数据表现更好。
- 对于包括具有不同级别数的分类变量的数据,决策树中的信息增益偏向于具有更多级别的那些属性。
- 计算可能变得非常复杂,特别是如果许多值不确定和/或许多结果是相关的。
算法实现
- 算法实现一(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])
决策树总结(个人学习体会)相关推荐
- 决策树模型与学习《一》
决策树总结<一>.md 决策树模型与学习 1. 定义 一般的,一棵决策树包含一个根结点,若干个内部结点和若干个叶结点:叶结点对应于决策结果,其他每个结点则对应于一个属性测试:每个结点包含的 ...
- R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比
R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...
- c#学习体会:使用 ref 和 out 传递数组
c#学习体会:使用 ref 和 out 传递数组(downmoon),希望与大家分享1.与 所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值. 例如: ...
- 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...
小学信息技术学习体会 大家都对小学信息技术学习体会特别关注,东城教研特别为大家整理了一些有关小学信息技术学习体会的内容,其中,培养学生的创新意识和创造能力.下面就结合我的教学实践,谈谈我的几点体会.一 ...
- 近期爬虫学习体会以及爬豆瓣Top250源码实战
近期爬虫学习体会以及爬豆瓣Top250源码实战 我是在B站https://www.bilibili.com/video/BV12E411A7ZQ?p=25里学习的,至今已经可以手写爬豆瓣Top250代 ...
- Office计算机心得,OFFICE心得学习体会.ppt
OFFICE心得学习体会.ppt 会专61001 唐林 21 会专61001 唐林 21 会专61001 唐林 21 记在大一结束前 * 会专61001 唐林 21 * 我学word 我学习计算机,就 ...
- 【DataWhale学习】Day10~13-4章决策树——西瓜书学习摘录笔记
[DataWhale学习]Day10~13-4章决策树--西瓜书学习摘录笔记 本文参考了周志华老师的西瓜书,李航老师的统计学习方法,谢文睿大佬的南瓜书(无推导尿点,仅加深理解食用) 决策树模型 决 ...
- JavaOOP(面向对象)学习体会
JavaOOP(面向对象)学习体会 类和对象的概念 类:具体相同特征和行为的事物的抽象 对象:万事万物皆对象 类是对象的类型! 对象是类的实例 ! 封装 //特征---->属性(特性)Strin ...
- 操作系统学习体会之进程管理篇
计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...
最新文章
- 华为腾讯百度众安微众360大咖齐聚,2019中国区块链开发者大会首批议程曝光!...
- 多维卷积与一维卷积的统一性(运算篇)
- 【LeetCode从零单排】No118	Pascal's Triangle
- 开放下载!《阿里云存储白皮书》全面解读阿里云存储二十年的技术演进
- 设计模式示例_介体设计模式示例
- nodejs websocket server
- tensorflow之random_normal
- 双击获取GridView控件行信息
- 数据库访问的性能问题与瓶颈问题
- Error creating bean with name 'rocketMQTemplate' defined in class path resource
- Flume 1.8.0 用户指南(Flume 1.8.0 User Guide)
- AJAX培训第二讲:使用AJAX框架(下)
- Python词频统计
- c语言题模板大全,C语言试题库完整版整理版
- 如何借助表格优化直通车分时折扣
- 修改远程git仓库密码 - 报错 fatal: Authentication failed for
- Python量化投资——股票择时到底能否赚钱?ADX指标的有效性回测
- (Python)Numpy矩阵增加/减少一个维度
- esc中文是什么意思_汽车ESC什么意思 汽车ESC有什么用
- 用户画像数据指标体系之风险控制维度