机器学习(五) -- 监督学习(3) -- 决策树

系列文章目录及链接

上篇:机器学习(五) -- 监督学习(2) -- 朴素贝叶斯
下篇:机器学习(五) -- 监督学习(4) -- 集成学习方法-随机森林


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


一、决策树通俗理解及定义

1、什么叫决策树(What)

        决策树(decision tree)是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。决策树本质是一颗由多个判断节点组成的树。

        决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-else结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。

        决策树的决策过程就是从根节点开始,测试待分类项中对应的特征属性,并按照其值选择输出分支,直到叶子节点,将叶子节点的存放的类别作为决策结果。

2、决策树的目的(Why)

决策树学习的目的是为了产生一棵泛化能力强(即处理未见示例能力强)的决策树。

3、怎么做(How)

决策树通常有三个步骤:特征选择、决策树的生成、决策树的修剪。

特征选择:从训练数据的特征中选择一个特征作为当前节点的分裂标准(特征选择的标准不同产生了不同的特征决策树算法)。
决策树生成:根据所选特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止声场。
决策树剪枝:决策树容易过拟合,需要剪枝来缩小树的结构和规模(包括预剪枝和后剪枝)。

决策树:决策和树两步,构建树形结构在前,决策在后。决策树的生成过程中分割方法,即 属性选择的度量 是关键 

几个问题:如何进行特征选择?

按照某个特征对数据进行划分时,它能最大程度地将原本混乱的结果尽可能划分为几个有序的大类,则就应该先以这个特征为决策树中的根结点。

二、原理理解及公式

1、决策树原理

1.1、决策树组成

        决策树由结点和有向边组成。结点有两种类型:内部结点和叶节点。
                内部结点表示一个特征或属性,
                叶节点表示一个类别,
                有向边则对应其所属内部结点的可选项(属性的取值范围)。

        在用决策树进行分类时,首先从根结点出发,对实例在该结点的对应属性进行测试,接着会根据测试结果,将实例分配到其子结点;然后,在子结点继续执行这一流程,如此递归地对实例进行测试并分配,直至到达叶结点;最终,该实例将被分类到叶结点所指示的结果中。 

1.2、决策树的构建

决策树的本质是从训练集中归纳出一套分类规则,使其尽量符合以下要求:

  1. 具有较好的泛化能力;
  2. 在 1 的基础上尽量不出现过拟合现象。

当目标数据的特征较多时,应该将样本数据的特征按照怎样的顺序添加到一颗决策树的各级结点中?这便是构建决策树所需要关注的问题核心。
也就是前面说的如何特征选择。按照某个特征对数据进行划分时,它能最大程度地将原本混乱的结果尽可能划分为几个有序的大类,则就应该先以这个特征为决策树中的根结点。

基于此,引入信息论中的“熵”。

2、信息论基础

2.1、熵

2.1.1、概念

熵(Entropy)是表示随机变量不确定性的度量,即物体内部的混乱程度。
比如下图中,从 左到右表示了熵增的过程。
系统越有序,熵值越低;系统越混乱或者分散,熵值越高
对于决策树希望分类后的结果能使得整个样本集在各自的类别中尽可能有序,即最大程度地降低样本数据的熵。

2.1.2、熵的公式

D为训练数据集所有样本,K为所划分的类别数量,pk是k类样本的概率密度:(H(X)是另一种表达形式。)

当pk=0或pk=1时,H(X)=0,随机变量完全没有不确定性
当pk=0.5时,H(X)=1,此时随机变量的不确定性最大

eg:显然A集合的熵值要低,A中只有两种类别,而B中类别太多了,熵值就会大很多。

常用的最优属性选取方法有三种:

  • 信息增益:在 ID3 决策树中使用
  • 信息增益率:在 C4.5 决策树中使用
  • 基尼系数:在 CART 决策树中使用

2.2、信息增益(决策树的划分依据一)--  ID3

2.2.1、概念

以某特征划分数据集前后的熵的差值。

熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。

信息增益 = ent(前) - ent(后)

2.2.2、公式

特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:

信息熵:

条件熵:(D为训练数据集所有样本,A为某一特征,n为特征A的特征值种类,|Di|为第i类数量,

K为所划分的类别数量,|Dik|第i类划分为第k类的数量)

其实就是父节点的信息熵与其下所有子节点总信息熵之差。

2.2.3、栗子

用一个栗子(银行贷款数据)来理解:eg:

 “年龄”信息增益:

“有工作”信息增益: 

“有房子”信息增益: 

 

“信贷情况”信息增益: 

 

对4种特征的Gain进行比较,Gain(D,有房子)≈0.420最大,所以应该选择“有房子”作为决策树的根节点。

选择根节点后,在划分后的基础上,在对其他特征递归计算,得到下一个Gain最大的特征,以此类推构建一颗决策树。

2.3、信息增益率(决策树的划分依据二)--C4.5

2.3.1、概念

增益率是用前面的增益度量Gain(D,A)和特征A的“固有值”(intrinsic value)的比值来共同定义的。

信息增益率⽤ “信息增益 / 内在信息”‘,会导致属性的重要性随着内在信息的增⼤⽽减⼩(也就是说,如果这个属性本身不确定性就很⼤,那我就越不倾向于选取它),这样算是对单纯⽤信息增益有所补偿。

(信息增益倾向于特征值较多的,信息增益率倾向于特征值较少的)

2.3.2、公式

2.3.3、栗子

还是用上面的例子继续计算:

“年龄”信息增益率:

“有工作”信息增益率: 

“有房子”信息增益率: 

“信贷情况”信息增益率: 

对4种特征的Gain_ratio进行比较,Gain_ratio(D,有房子)≈0.433最大,所以应该选择“有房子”作为决策树的根节点。

选择根节点后,在划分后的基础上,在对其他特征递归计算,得到下一个Gain_ratio最大的特征,以此类推构建一颗决策树。

2.4、基尼值和基尼指数(决策树的划分依据三)--CART

CART (Classification and Regression Tree)

2.4.1、基尼值

Gini(D):从数据集D中随机抽取两个样本,其类别标记不⼀致的概率。Gini(D)值

越⼩,数据集D的纯度越⾼。 数据集 D 的纯度可⽤基尼值来度量

2.4.2、基尼指数

Gini_index(D,A):⼀般,选择使划分后基尼系数最⼩的属性作为最优化分属性。

2.4.3、栗子

还是用上面的例子继续计算:

“年龄”基尼指数:

 “有工作”基尼指数:

 “有房子”基尼指数:

 “信贷情况”基尼指数:

对4种特征的Gini_index进行比较,Gini_index(D,有房子)≈0.264最低,所以应该选择“有房子”作为决策树的根节点。

选择根节点后,在划分后的基础上,在对其他特征递归计算,得到下一个Gini_index最小的特征,以此类推构建一颗决策树。

2.4.4、栗子

针对连续值进行划分

咱们直接考虑年收入的Gini:

会将每两个连续年收入取中值进行划分,并求出其Gini系数增益,从表中可知,将年收入从95,和100处分成两部分Gini增益最高。

3、cart剪枝

 实线显示的是决策树在训练集上的精度,虚线显示的则是在一个独立的测试集上测量出来的精度。

随着树的增长,在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。

出现这种情况的原因:

        1、噪声、样本冲突,即错误的样本数据。

        2、特征即属性不能完全作为分类标准。

        3、巧合的规律性,数据量不够大。

2.1、预剪枝

1、每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;

2、指定树的高度或者深度,例如树的最大深度为4;

3、指定结点的熵小于某个值,不再划分。随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降

2.2、后剪枝

后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。

4、优缺点

4.1、ID3

信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息.

ID3算法只能对描述属性为离散型属性的数据集构造决策树

4.2、C4.5

改进:

  1. 用信息增益率来选择属性
  2. 可以处理连续数值型属性
  3. ​采用了一种后剪枝方法
  4. 对于缺失值的处理

优点:
        产生的分类规则易于理解,准确率较高。

​ 缺点:
        在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。
        C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

4.3、cart

CART算法相比C4.5算法的分类方法,采用了简化的二叉树模型,同时特征选择采用了近似的基尼系数来简化计算。

C4.5不一定是二叉树,但CART一定是二叉树。

三、**算法实现

四、接口实现

1、API

sklearn.tree.DecisionTreeClassifier导入:
from sklearn.tree import DecisionTreeClassifier语法:
DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)criterion:划分标准;{"gini","entropy"},default="gini"max_depth:树的深度大小;int,default="None"min_samples_split:某节点的样本数少于min_samples_split,不会继续再尝试选择最优特征来进行划分;int,default=2min_samples_leaf:限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝;int,default="None"max_leaf_nodes:限制最大叶子节点数,可以防止过拟合;int,default="None"random_state:随机数种子 max_features:限制最大特征数;{None,log2,sqrt},default="None"

2、流程

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifier

2.1、获取数据

# 加载数据
iris = load_iris()  

2.2、数据预处理

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=1473) 

2.3、特征工程

2.4、决策树模型训练

# 实例化预估器
dtc = DecisionTreeClassifier()  # 确定决策树参数# 模型训练
dtc.fit(x_train, y_train) 

2.5、模型评估

# 预测测试集结果
y_pred = dtc.predict(x_test)
print('前20条记录的预测值为:\n', y_pred[:20])
print('前20条记录的实际值为:\n', y_test[:20])

# 求出预测准确率和混淆矩阵
from sklearn.metrics import accuracy_score, confusion_matrixprint("预测结果准确率为:", accuracy_score(y_test, y_pred))
print("预测结果混淆矩阵为:\n", confusion_matrix(y_test, y_pred))

 

2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2.7、决策树可视化

2.7.1、导出dot文件
# 决策树可视化
from sklearn.tree import export_graphvizexport_graphviz(# 传入构建好的决策树模型dtc,# 设置输出文件(需要设置为 .dot 文件,之后再转换为 jpg 或 png 文件)out_file="./data/iris_tree.dot", # 设置特征的名称feature_names=iris.feature_names,# 设置不同分类的名称(标签)class_names=iris.target_names
)

2.7.2、下载Graphviz插件

官网:Graphviz官网

!!!注意:这里一定要把加入系统路径(环境变量)勾上哦。

等待安装完成即可

2.7.3、生成可视化图片

找到导出的dot文件位置

打开cmd(输入cmd,回车)

输入命令

dot -Tpng iris_tree.dot -o iris_tree.png或dot -Tjpg iris_tree.dot -o iris_tree.jpg

 分析:非叶节点的第一行如petal length(cm)<=2.35,为划分属性即条件,如将petal length属性按照不高于2.35和高于2.35分成两部分。

gini=0.666,表示该节点的gini值。

samples=120,为总样本数量。

value=[43,38,39],为各类别样本数量。

class=setosa,为该节点被划分的类别(样本类别数量最多的类别),叶节点才具有参考价值。


旧梦可以重温,且看:机器学习(五) -- 监督学习(2) -- 朴素贝叶斯
欲知后事如何,且看: ​​​​​​​ 机器学习(五) -- 监督学习(4) -- 集成学习方法-随机森林

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习Uni-app开发小程序Day23

今天学习了将上一章的所有核算的js&#xff0c;抽离出去&#xff0c;让在其他地方可以直接调用&#xff0c;然后和适配抖音的办法&#xff0c;封装网络请求&#xff1b; 抽离公共方法 如何将公共方法抽离&#xff1f; 1、在根目录创建一个目录&#xff0c;一般起名是:utils 2…

物联网网关在电梯按需维保方案中起到什么作用?梯联网网关

为减少电梯故障和预防电梯事故&#xff0c;保障人身和财产安全&#xff0c;基于物联网技术的电梯按需维保已在全国多地陆续推行&#xff0c;做到了电梯安全隐患预测式排查&#xff0c;处理问题更具科学性、针对性和精准性&#xff0c;有效提升了电梯运行的安全性。那么&#xf…

深度学习之基于YoloV5入侵检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。入侵检测系统&#xff08;IDS&#xff0…

IC设计运营管理ERP适合中小型芯片公司

在数字化、智能化的今天&#xff0c;企业资源计划(ERP)系统已成为企业管理的重要工具。特别是在中小型芯片公司中&#xff0c;IC设计运营管理ERP更是发挥着举足轻重的作用。 首先&#xff0c;ERP系统能够实现对企业内各种资源的集成管理&#xff0c;包括资金、人力资源、设备和…

我的第一个JAVA程序IDEA版

目录 第一步 新建一个空项目第二步 新建模块第三步 新建包第四步 新建类第五步 新建main方法 第一步 新建一个空项目 第二步 新建模块 第三步 新建包 第四步 新建类 然后在包文件夹下新建类 第五步 新建main方法

线程池(C++)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 线程池 实现线程类 #pragma once#include <pthread.h> #include <iostream> #include <vector> #include <string> #include <cstdlib> #include <cstring> #include <functional&…

Python深度学习基于Tensorflow(12)实战生成式模型

文章目录 Deep Dream风格迁移参考资料 Deep Dream DeepDream 是一项将神经网络学习模式予以可视化展现的实验。与孩子们观察云朵并尝试解释随机形状相类似&#xff0c;DeepDream 会过度解释并增强其在图像中看到的图案。 DeepDream为了说明CNN学习到的各特征的意义&#xff0c…

「51媒体」线下活动媒体同步直播,云分发,分流直播

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 线下活动除了邀请嘉宾&#xff0c;邀请媒体&#xff0c;邀请行业大咖KOL&#xff0c;来为活动站台&#xff0c;背书外&#xff0c;我们也可以将线下的活动同步在线上进行直播&#xff0c…

react【框架原理详解】JSX 的本质、SyntheticEvent 合成事件机制、组件渲染过程、组件更新过程

JSX 的本质 JSX 代码本身并不是 HTML&#xff0c;也不是 Javascript&#xff0c;在渲染页面前&#xff0c;需先通过解析工具&#xff08;如babel&#xff09;解析之后才能在浏览器中运行。 babel官网可查看 JSX 解析后的效果 更早之前&#xff0c;Babel 会把 JSX 转译成一个 R…

AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

区块链fisco联盟链搭建(二)搭建多群组联盟链

本文章只讲搭建的命令方法 以单机、四机构、三群组、八节点的星形组网拓扑为例 第一步创建并进入工作目录&#xff08;继续以fisco为例&#xff09; mkdir /fisco cd /fisco 获取搭链脚本上一篇文章区块链fisco联盟链搭建 (一)搭建单群组四节点联盟链中有 第二步生成多群组…

抖音小店没有流量不出单?归根到底,就是转化率不行!

哈喽~我是电商月月 新手做抖音小店&#xff0c;最忧愁的就是&#xff1a;店铺不出单怎么办&#xff1f; 商家通常会把没有销量的原因&#xff0c;都推向于“店铺没有流量” 但在抖音&#xff0c;这个日活量高达9亿的平台来说&#xff0c;任何商铺最不缺的应该就是流量了 但…

dll文件是什么?电脑丢失某个dll文件有什么解决办法

Dll文件是什么&#xff1f;这个文件在电脑中是什么样的地位&#xff1f;如果电脑提示丢失了某个dll文件那么有什么办的解决这个问题呢&#xff1f;如何将丢失的dll文件进行修复呢&#xff1f;今天这篇文章将按就来教大家几种修复丢失dll文件问题的方法。 DLL 文件&#xff0c;全…

[Redis]基本全局命令

Redis存储方式介绍 在 Redis 中数据是以键值对的凡事存储的&#xff0c;键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;是基本的数据存储单元。以下是对 Redis 键值对的详细讲解&#xff1a; 键&#xff08;Key&#xff09;&#xff1a; 类型&#xff1a;…

全局配置路径无法识别的解决——后端

在全局配置路径reggie.path的时候&#xff0c;无法正常启动SpringBoot项目 Value("${reggie.path}")private String basePath; 查看application.yml的配置情况: 发现path没有起作用&#xff0c;推测是格式问题&#xff0c;冒号后面空格后即可

Web API——获取DOM元素

目录 1、根据选择器来获取DOM元素 2.、根据选择器来获取DOM元素伪数组 3、根据id获取一个元素 4、通过标签类型名获取所有该标签的元素 5、通过类名获取元素 目标&#xff1a;能查找/获取DOM对象 1、根据选择器来获取DOM元素 语法&#xff1a; document.querySelector(css选择…

第19讲:自定义类型:结构体

目录 1.结构体类型的声明1.1 结构体回顾1.1.1 结构的声明 特殊的结构声明1.3 结构的⾃引⽤ 2. 结构体内存的对齐2.2 为什么存在内存对⻬?2.3 修改默认对⻬数 3. 结构体传参4. 结构体实现位段4.1 什么是位段4.2 位段的内存分配4.3 位段的跨平台问题4.5 位段使⽤的注意事项 正文…

梳理 JavaScript 中空数组调用 every方法返回true 带来惊讶的问题

前言 人生总是在意外之中. 情况大概是这样的. 前两天版本上线以后, 无意中发现了一个bug, 虽然不是很大, 为了不让用户使用时感觉到问题. 还是对着一个小小的bug进行了修复, 并重新在上线一次, 虽然问题不大, 但带来的时间成本还是存在的. 以及上线后用户体验并不是很好. 问题…

JVM学习-垃圾收集器(二)

Serial回收器&#xff1a;串行回收 Serial收集器是最基本、历史最悠久的收集器JDK1.3之前新生代唯一的选择Hotpot中Client模式下的默认新生代垃圾收集器采用复制算法&#xff0c;串行回收“Stop-the-world”机制的方式执行内存回收除了年轻代之外&#xff0c;Serial收集器还提…

TG-5006CG温补晶振在WiFi6无线路由器模块的应用

WiFi6无线路由器是采用了wiFi6技术的无线网络设备&#xff0c;旨在为家庭、办公室或其他场所提供高速、稳定的无线网络连接。它不仅能实现更高的数据传输速率和更低的延迟&#xff0c;还提供了更先进的加密和安全措施&#xff0c;确保用户数据安全。为了支持这些高级功能&#…