机器学习第四篇:详解决策树算法

机器学习第四篇:详解决策树算法
↑↑↑关注后"星标"简说Python 
人人都可以简单入门Python、爬虫、数据分析 简说Python推荐来源:俊红的数据分析之路 作者:张俊红 

我的2020总结,戳图片,留言抽大奖

大家好,我是老表~

01|背景:

我们在日常生活中经常会遇到一些选择需要去做一些选择,比如我们在找工作的时候每个人都希望能找到一个好的工作,但是公司那么多,工作种类那么多,什么样的工作才能算是好工作,这个时候就需要我们对众多的工作去做一个判断。

最常用的一种方法就是制定几个可以衡量工作好坏的指标,比如公司所处的行业是什么、应聘的岗位是什么、投资人是谁、薪酬待遇怎么样等等。评判一个工作好坏的指标有很多个,但是每一个指标对工作好坏这一结果的决策能力是不一样的,为了更好的对每一个指标的决策能力做出判断,我们引入一个可以量化信息决策能力的概念,这个概念就是信息熵。

信息熵是用来度量(量化)信息的,一条信息的信息量与其不确定性有着直接的联系,当我们需要了解清楚一件不确定的事情的时候,我们就需要了解大量的信息。

02|概念:

决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。(来源于百度百科)

03|模型:

决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据集进行分割,使得对各个子数据集有一个最好的分类过程,这一过程对应着对特征空间的划分,也对应着决策树的构建。

开始构建根节点,将所有的训练数据集都放在根节点,选择一个最有特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下获得最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到对应的叶节点中去;如果还有子集不能够被基本正确分类,那么就对这些子集新的选择最优特征,继续对其进行分割,构建相应的结点。如此递归下去,直到所有的训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶节点上,即都有了明确的分类,这就生成了一颗决策树。

www.zeeklog.com - 机器学习第四篇:详解决策树算法

根节点是决策树最开始的结点,内部结点是可以继续分类的结点。

利用上面递归的方法可能对训练数据有很好的预测能力,但是对未知数据集未必有很好的分类能力,可能发生过拟合的现象,这就需要对决策树进行剪枝,让树变得简单一些,从而拥有更好的泛化能力。

04|学习步骤:

1、特征选择

特征选择就是选择对训练数据具有分类能力的特征,也就是我们在背景里面提到的对工作好坏评判起作用的指标,这样就可以提高决策树学习的效率。如果一个特征的分类能力与随机分类的结果没什么差异,则称这个特征是没有分类能力的。一般我们把这类特征是直接去掉的,我们优先那些能够对我们的分类起到决定作用的特征,我们在具体选取的时候会用到两个准则:信息增益或信息增益比

1.1信息增益

  • 熵:

在信息论和概率统计中,熵表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为:P(X=xi)=pi,i=1,2,...,n。

则随机变量X的熵定义为H(X)=-∑pi log pi。

因熵只依赖于X的分布,而与X无关,所以可将X的熵记作H(p),即H(p)=-∑pi log pi。

熵越大,随机变量的不确定性就越大。

当pi=1或pi=1时,H(p)等于0,此时,随机变量是完全没有不确定性的。当pi=0.5时,H(p)等于1,此时,熵取值最大,随机变量不确定性最大。

  • 条件熵

设有随机变量(X,Y)其联合概率分布为:P(X=xi,Y=yi)=Pij,条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性。随机变量X给定条件下随机变量Y的条件熵H(Y|X),定义为X给定条件下Y的条件概率分布的熵对X的数学期望:H(Y|X)=∑pi H(Y|X=xi)。

  • 信息增益

信息增益表示在得知特征X的信息而使得类Y的不确定性减少的程度

特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A在给定条件下D的经验条件熵H(D|A)之差,即g(D,A)=H(D)-H)(D|A)。

一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息,决策树学习中的信息增益等价于训练数据集中的类与特征的互信息。

根据信息信息增益选择特征的方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。

  • 信息增益算法步骤
  1. 计算训练数据集的经验熵H(D)
  2. 计算特征A对数据集D的经验条件熵H(D|A),这里的条件熵H(D|A)=∑pi H(D|A=Ai)=∑pi H(Di)=∑pi ∑p(Dik)log(p(Dik)),(Di中的i表示根据特征A将样本D分成i个类别,k表示样本D本身按照结果分成k个类别,比如前面的对一个工作好坏进行评定,根据工作内容好坏对样本进行分类,得到的类别数就是k;在拿特征A-工资待遇对样本进行分类得到样本类别数i),p(Dik)表示Di类别中类别k出现的概率,求取方法与朴素贝叶斯中对概率的求取方法一致,用似然估计,即用事件出现的频数的比值来代替概率。
  3. 计算信息增益g(D,A)
  • 信息增益比

以信息增益作为划分训练数据集的特征,存在偏向于选取取值较多的特征的问题使用信息增益比可以对这一问题进行校正。

特征A对训练数据集D的信息增益比gR(D,A)定义为信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即gR(D,A)=g(D,A)/HA(D)。其中

HA(D)=∑p(Di)log(p(Di))。

2、决策树的生成

常用的决策树生成的方法有ID3,C4.5算法。本篇也着重介绍这两种算法。

2.1ID3算法

ID3算法的核心是在决策树各个结点的上应用信息增益准则选择特征,递归地构建决策树。

具体方法就是从根节点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树;直至所有特征的信息增益均很小或没有特征可以选择为止,最后得到一个决策树。

  • 算法步骤

输入:训练数据集D,特征集A,阈值z。

输出:决策树T。

  1. 若D中所有的实例都属于同一类Ck(k表示样本D本身按照结果分成k个类别),则T为单节点树,并将类Ck作为该节点的类标记,返回T。
  2. 若特征A集合为空,则T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T。
  3. 如果不符合上面两种情况,则按照信息增益算法公式计算A中每个特征对D的信息增益,选择信息增益最大的特征Ag。
  4. 如果Ag的信息增益小于阈值z,则置T为单节点树,并将D中的实例数最大的类Ck作为该节点的类标记,返回T。
  5. 如果Ag的信息增益大于阈值z,则对Ag的每一个取值ai,依据Ag=ai将D分割为若干非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由结点及其子节点构成树T,返回T。
  6. 对第i个子节点,以Di为训练集,以A-Ag为特征集,递归地调用上面5个步骤,得到子树Ti,返回Ti。

2.2C4.5的生成算法

C4.5和ID3算法相似,C4.5是在ID3的基础上进行了改进,从ID3用信息增益来选取特征改成了用信息增益比来选取特征,其他步骤均与ID3算法一致,不展开阐述。

3、决策树的修剪

决策树生成算法是通过递归的方法产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知数据的分类却没那么准确,即出现过拟合的现象。过拟合的原因在于学习时过度考虑如何提高训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的方法是考虑决策树的复杂度,对已生成的决策树进行简化,我们把这种对已生成的树进行简化的过程称为剪枝。

剪枝是从已生成的树上裁掉一些子树或叶节点,并将其根结点或父节点作为新的叶节点,从而简化分类树模型。

决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树T的叶节点个数为|T|,t是树T的叶节点,该叶结点由Nt个样本点,其中k类的样本点由Ntk个,k=1,2,...,K,Ht(T)为叶节点t上的经验熵,α≥0为参数,则决策树学习的损失函数可以定义为:

再来看一下常规意义上的损失函数:

www.zeeklog.com - 机器学习第四篇:详解决策树算法

公式的前半部分表示训练误差,对于这一部分,我们希望他的值越小越好,后半部分是正则化项,是为了防止过拟合而加的一个惩罚项。

所以我们可以把决策树的损失函数写成:

上式中,C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型复杂度,参数参数α≥0控制两者之间的影响。较大的α促使选择较简单的模型(树),较小的α促使选择较复杂的模型(树)。α=0意味着只考虑模型与训练数据的拟合程度,不考虑模型的复杂度。

剪枝,就是当α确定时,选择损失函数最小的模型,即损失函数最小的子树。

  • 算法步骤:

输入:生成算法产生的整个树T,参数α

输出:修剪后的子树Tα

  1. 计算每个结点的经验熵
  2. 递归地从树的叶节点向上回缩,设一组叶节点回缩到其父节点之前与之后的整体树分别为TB与TA,其对应的损失函数值分别为Cα(TB)与Cα(TA),如果:

,则进行剪枝,即将父节点变为新的叶节点。

  1. 返回步骤2,直到不能继续为止,得到损失函数最小的子树Tα。

05|python实例:

本实例来源于《机器学习实战》中决策树章节。

www.zeeklog.com - 机器学习第四篇:详解决策树算法
www.zeeklog.com - 机器学习第四篇:详解决策树算法
www.zeeklog.com - 机器学习第四篇:详解决策树算法
www.zeeklog.com - 机器学习第四篇:详解决策树算法
www.zeeklog.com - 机器学习第四篇:详解决策树算法
www.zeeklog.com - 机器学习第四篇:详解决策树算法

关于决策树剪枝、CART以及模型的利用在后续的章节中继续介绍。

简说Python 2021第一波学习交流群入群开启,加微信:pythonbrief,回复:2021,即可加入。

入群规则:满足以下三个条件任意一个即可进入学习交流群

1)本公众号留言总次数199+的读者可以直接添加好友进入;

2)2021年留言次数9+次的读者可以直接添加好友进入;

3)成功添加好友后,支付9.9元入群费用的读者可以直接进入(自动退群时会归还9.9元);

入群截止时间:2021.1.8 20:00

【注】设置入群规则主要是为了排除伸手党和推广营销的人,学习交流群不欢迎伸手党和推广者加入,一经发现直接清除、拉黑。

【最新投稿福利】

1>投稿规则:Java、前端、Python等方向的技术文章;内容不少于500字;可以是实战,也可以是欢快程序员类型,也可以是知识点科普;需要是首次发布在微信公众号平台,以原创发布,会注明作者及相关作者简介。

2>福利:按文章质量每1000字(不含代码)激励50-100元不等,投稿被采纳4次及以上者,可以另外获得赠书和简说编程专栏勋章,投稿越多,激励越多。

扫码,备注:投稿

 长按扫码关注,一起学Python 学习更多: 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了 

爱点赞的人,运气都不会太差

Read more

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)

引言 掌握表的基本运作之后,若想优化查询效率并简化数据访问,就要去学习“索引”和“视图”的运用,索引类似于“书籍目录”,可以极大地加快查询速度;视图类似“数据窗口”,能够隐藏复杂的查询逻辑,还能控制数据的可见性。本文就“ksql命令行操作索引与视图”展开论述,把从“作用到创建,再到查看,维持直至删除”的全过程拆解成实际操作步骤,并结合例子和避坑提示,以使初学者能够领悟并付诸实行。 文章目录 * 引言 * 一、前置准备:确认操作基础(衔接前文,确保连贯) * 1.1 1. 连接数据库并切换目标模式 * 1.2 2. 插入测试数据(用于验证索引 / 视图效果) * 二、索引管理:给表 “加目录”,加速查询 * 2.1 1.

By Ne0inhk
从 Express 到企业级架构:NestJS 实战指南与深度解析

从 Express 到企业级架构:NestJS 实战指南与深度解析

在 Node.js 的后端开发生态中,Express 长期以来以其极简主义占据统治地位。然而,随着项目规模的扩大,缺乏约束的“自由”往往会导致代码结构混乱,也就是我们常说的“意大利面条式代码”。 为了解决这个问题,NestJS 应运而生。NestJS 是一个用于构建高效、可扩展且易于维护的企业级后端应用的框架。它基于 TypeScript 构建,深受 Angular 架构的影响,引入了模块化、依赖注入(DI)和装饰器等先进概念。 本文将结合一个包含待办事项(Todos)管理和 PostgreSQL 数据库连接的实战 Demo,带你深入理解 NestJS 的核心架构。 一、 为什么选择 NestJS? 在开始写代码之前,我们需要理解 NestJS 试图解决什么问题。 1. 架构标准化:Express 让你自己决定文件放哪,而

By Ne0inhk
Go语言零基础小白学习知识点【基础版详解】

Go语言零基础小白学习知识点【基础版详解】

✅ 纯白话拆解+代码示例+实战场景,零基础能直接照着敲 ✅ 技术适配:基于Go 1.23(LTS长期支持版,企业主流),聚焦高并发、云原生核心场景 ✅ 条理清晰:从“环境搭建→基础语法→核心特性→实战入门”层层拆解,每个知识点落地到代码 ✅ 核心目标:小白不仅“懂概念”,更能“写得出、跑得起”,掌握Go语言入门核心能力 一、前置准备:先搞定环境和核心认知 1. Go语言是什么? Go(又称Golang)是谷歌2009年推出的编程语言,2026年已是云原生、高并发后端的首选语言——简单说: * 快:运行速度接近C/C++,编译速度秒杀Java; * 简单:语法比Java/Python更简洁,零基础3天能写业务代码; * 强:天生支持高并发,写直播、聊天、

By Ne0inhk
告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

告别重复数据烦恼!MySQL ON DUPLICATE KEY UPDATE 优雅解决存在更新/不存在插入难题

目录 * 前言 * 一、基本概念 * 1、什么是 ON DUPLICATE KEY UPDATE? * 2、工作原理 * 3、基本语法 * 二、使用场景 * 1、计数器更新 * 2、配置项更新 * 3、购物车商品更新 * 三、高级用法 * 1、条件更新 * 2、多表关联 * 3、批量操作优化 * 四、其他处理冲突的方案 * 1、REPLACE INTO * 2、INSERT IGNORE 前言 在日常的数据库操作中,我们经常会遇到这样的场景:“如果数据存在,就更新它;如果不存在,就插入一条新的”。这种模式通常被称为 “Upsert”(Update + Insert)。在

By Ne0inhk