【机器学习】决策树算法原理详解

决策树

1 概述

1.1 定义

决策树是一种解决分类问题的算法,决策树算法采用树形结构,使用层层推理来实现最终的分类。

决策树即可以做分类,也可以做回归。它主要分为两种:分类树回归树

1.2 决策树算法

  • 第一个决策树算法: CLS (Concept Learning System)
  • 使决策树受到关注、成为机器学习主流技术的算法: ID3
  • 最常用的决策树算法: C4.5
  • 可以用于回归任务的决策树算法: CART (Classification and Regression Tree)
  • 基于决策树的最强大算法: RF (Random Forest)

1.3 结构

决策树由下面几种元素构成:

  • 根节点:包含样本的全集(全部训练数据)
  • 内部节点:对应特征属性测试
  • 叶节点:代表决策的结果

在这里插入图片描述

决策树学习的目的是为了产生一棵泛化能力强的决策树

2 决策树构建

2.1 构建过程

整体策略:自上而下分而治之

决策树的构建过程就是一个自根至叶的递归过程, 在每个中间结点寻找一个划分属性。

大致过程:

  • 开始:构建根节点,所有训练数据都放在根节点,选择x个最优特征,按着这一特征将训练数据集分割成子集,进入子节点。
  • 所有子集按内部节点的属性递归地进行分割。
  • 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。
  • 每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。

递归的三种停止条件:

  • 当前结点包含的样本全属于同一类别,无需划分;
  • 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
  • 当前结点包含的样本集合为空,不能划分。

2.2 特征选择

信息熵:随机变量的不确定性。
H ( X ) = − ∑ p i l o g 2 p i i = 1, 2, ..., n H(X) = - \sum p_i log_2 p_i \hspace{2em} \text{i = 1, 2, ..., n} H(X)=pilog2pii = 1, 2, ..., n

例:

A集合 [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 ] [1, 1, 1, 1, 1, 1, 1, 1, 2, 2] [1,1,1,1,1,1,1,1,2,2]

B集合 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 ] [1, 2, 3, 4, 5, 6, 7, 8, 9, 1] [1,2,3,4,5,6,7,8,9,1]

A集合熵值低于B集合熵值,因为A集合中只有两种类别,B集合中类别比较多(结构比较乱),熵值就会比较大

信息增益: 表示特征X使得类Y的不确定性减少的程度(熵值减少),即当前划分对信息熵所造成的变化。

信息增益越大,表示特征a来划分所减少的熵最大,即提升最大,应当作为根节点。

3 决策树算法

3.1 ID3(信息增益)

下面是基于信息增益的ID3算法的实例:

我们有14天的数据,4个特征条件:天气,温度,湿度,是否有风。最终结果是去玩不玩。

在这里插入图片描述

在这里插入图片描述

上面有四种划分方式,我们需要判断谁来当根节点,根据的主要就是信息增益这个指标。下面计算信息增益来判断根节点。

本例暂且以ent(a, b)代表以下含义:(只有两种结果的时候的熵值计算)

from math import log2
def ent(a, b):tot = a + bx, y = a / tot, b / totreturn -(x * log2(x) + y * log2(y))

总的数据中,9天玩,5天不玩,熵值为:
− 9 14 l o g 2 9 14 − 5 14 l o g 2 5 14 = 0.940 -\frac{9}{14}log_2 \frac{9}{14} - \frac{5}{14}log_2 \frac{5}{14} = 0.940 149log2149145log2145=0.940
然后对4个特征逐个分析:

  • outlook

    • outlook = sunny时,熵值为0.971,取值为sunny的概率为 5 14 \frac{5}{14} 145
    • outlook = overcast时,熵值为0,取值为overcast的概率为 4 14 \frac{4}{14} 144
    • outlook = rainy时,熵值为0.971,取值为rainy的概率为 5 14 \frac{5}{14} 145

    熵值为:
    5 14 × 0.971 + 4 14 × 0 + 5 14 × 0.971 = 0.693 \frac{5}{14} \times 0.971 + \frac{4}{14} \times 0 + \frac{5}{14} \times 0.971 = 0.693 145×0.971+144×0+145×0.971=0.693
    信息增益:系统熵值从0.940下降到0.693,增益为0.247。

  • temperture

    • temperture = hot时,熵值为1.0(ent(2, 2)),取值为hot的概率为 4 14 \frac{4}{14} 144
    • temperture = mild时,熵值为0.918(ent(4, 2)),取值为mild的概率为 6 14 \frac{6}{14} 146
    • temperture = cool时,熵值为0.81(ent(3,1)),取值为cool的概率为 4 14 \frac{4}{14} 144

    熵值为:
    4 14 × 1.0 + 6 14 × 0.918 + 4 14 × 0.81 = 0.911 \frac{4}{14} \times 1.0 + \frac{6}{14} \times 0.918 + \frac{4}{14} \times 0.81 = 0.911 144×1.0+146×0.918+144×0.81=0.911
    信息增益: G a i n ( S , t e m p e r t u r e ) = 0.940 − 0.911 = 0.029 Gain(S, temperture) = 0.940 - 0.911 = 0.029 Gain(S,temperture)=0.9400.911=0.029

  • 其他特征按照相同方法来做得到:

G a i n ( S , O u t l o o k ) = 0.247 G a i n ( S , H u m i d i t y ) = 0.151 G a i n ( S , W i n d ) = 0.048 G a i n ( S , T e m p e r a t u r e ) = 0.029 Gain(S,Outlook)=0.247 \\ Gain(S, Humidity)=0.151 \\ Gain(S, Wind)=0 .048 \\ Gain(S,Temperature)=0 .029 Gain(SOutlook)=0.247Gain(S,Humidity)=0.151Gain(S,Wind)=0.048Gain(S,Temperature)=0.029

计算出所有的信息增益之后,选择有最大的信息增益的特征作为根节点。

下面找Sunny分支的决策树划分:

总的熵值
− 2 5 × l o g 2 ( 2 5 ) − 3 5 l o g 2 ( 3 5 ) = 0.97 -\frac{2}{5} \times log_2(\frac{2}{5}) - \frac{3}{5}log_2(\frac{3}{5}) = 0.97 52×log2(52)53log2(53)=0.97
以剩下的三个特征进行分析:

  • temperture

    • temperture=hot,熵值为0,概率为 2 5 \frac{2}{5} 52
    • temperture=mild,熵值为1.0,概率为 2 5 \frac{2}{5} 52
    • temperture=cool,熵值为0,概率为 1 5 \frac{1}{5} 51

    熵值为 2 5 \frac{2}{5} 52

    信息增益: 0.97 − 0.4 = 0.57 0.97-0.4 = 0.57 0.970.4=0.57

  • humidy

    • high,熵值为0,概率为 3 5 \frac{3}{5} 53
    • normal,熵值为1,概率为 2 5 \frac{2}{5} 52

    熵值为 2 5 \frac{2}{5} 52

    信息增益: 0.97 − 0.4 = 0.57 0.97 - 0.4 = 0.57 0.970.4=0.57

  • windy

    • false,熵值为0.918,概率为 3 5 \frac{3}{5} 53
    • true,熵值为1,概率为 2 5 \frac{2}{5} 52

    熵值为 0.951 0.951 0.951

    信息增益: 0.97 − 0.95 = 0.02 0.97 - 0.95 = 0.02 0.970.95=0.02

故选择humidy或wind划分

剩下的划分同理,最终决策树为

在这里插入图片描述

3.2 C4.5(信息增益率)

基于信息增益的决策树算法会有哪些问题:

如果有一个特征:id,代表样本的编号,以上述数据为例,id为从1到14,如果计算id特征的根节点,发现信息增益是最大的,因为每一个子节点的信息熵值都为0。

信息增益率:(解决了ID3的问题,考虑自身熵,信息增益除以自身熵)
G H ( x ) G:信息增益, H(x):熵值 \frac{G}{H(x)} \hspace{2em} \text{G:信息增益, H(x):熵值} H(x)GG:信息增益, H(x):熵值

3.3 CART(GINI系数)

使用基尼系数作为衡量标准。
G i n i ( p ) = ∑ k = 1 K p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p) = \sum \limits _{k = 1}^K p_k (1 - p_k) = 1 - \sum \limits _{k = 1}^K p_k^2 Gini(p)=k=1Kpk(1pk)=1k=1Kpk2

3 决策树剪枝

3.1 预剪枝

在建立决策树边的时候进行剪枝的操作,比较使用实用。

剪枝策略:

  • 限制深度
  • 限制叶子结点个数
  • 限制叶子结点样本数
  • 限制信息增益量等。

3.2 后剪枝

建立完决策树后进行剪枝操作。

4 连续值和缺失值处理

  • 连续值属性可取数值不是有限的,不能根据连续树形的可取值对节点进行划分。常见做法是:二分法对其进行离散化。

  • 现实应用中,经常会遇到属性值缺失现象仅使用无缺失的样例,这是对数据的极大浪费使用带缺失值的样例,需解决:

    • 如何进行划分属性选择?
    • 给定划分属性,若样本在该属性上的值缺失,如何进行划分?

    基本思路:样本赋权,权重划分

集成算法

1 概述

集成算法:Ensemble Learning

Bagging:训练多个分类器取平均
f ( x ) = 1 M ∑ m = 1 M f m ( x ) f(x) = \frac{1}{M} \sum \limits_{m = 1}^M f_m(x) f(x)=M1m=1Mfm(x)
Boosting:从弱学习器开始加强,通过加权来训练。
F m ( x ) = F m − 1 ( x ) + a r g m i n h ∑ i = 1 n L ( y i , F m − 1 ( x i ) + h ( x i ) ) F_m(x) = F_{m - 1}(x) + argmin_h \sum \limits_{i = 1}^n L(y_i, F_{m - 1}(x_i) + h(x_i)) Fm(x)=Fm1(x)+argminhi=1nL(yi,Fm1(xi)+h(xi))
Stacking:聚合多个分类或回归模型。

2 Bagging模型-随机森林

其实就是并行训练一堆分类器(每个分类器互相独立)。典型代表为随机森林(多个决策树并行放在一起)。

随机指的是:数据随机采样,特征随机选择

每个分类器喂的数据随机,数据的特征数随机。二重随机性,会让每个树基本都不一样,最终的结果也不一样。

随机森林优势:

  • 可以处理高维度(feature多)数据,不用做特征选择
  • 训练完之后,可以给出那些feature比较重要
  • 容易做成并行化方法,速度快
  • 可以进行可视化展示,便于分析

3 Boosting模型

提升模型典型代表:AdaBoost,XgBoost

AdaBoost:会根据前一次的分类效果调整数据权重

4 Stacking模型

堆叠模型:可以堆叠各种各样的分类器(KNN,SVM,RF等)

分阶段进行:第一阶段得出各自的结果,第二阶段再利用前一阶段结果进行训练。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的车牌检测系统的设计与实现(安卓、YOLOV、CRNNLPRNet)+文档

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

中国省级金融发展水平指数(金融机构存款余额、贷款余额、GDP)2020-2023年

数据范围: 包含的数据内容如下: 分省份金融机构存款余额、分省份金融机构贷款余额、分省份金融机构存贷款余额、分省份GDP、分省份金融发展指数 西藏自治区、贵州省、黑龙江省2023年数据暂未公布,计算至2022年,其他省份数据无缺失…

如何在 Ubuntu 上安装 Mosquitto MQTT 代理

如何在 Ubuntu 上安装 Mosquitto MQTT 代理 Mosquitto 是一个开源的消息代理,实现了消息队列遥测传输 (MQTT) 协议。在 Ubuntu 22.04 上安装 MQTT 代理,您可以利用 MQTT 轻量级的 TCP/IP 消息平台,该平台专为资源有限的物联网 (IoT) 设备设计…

【青牛科技】带 ALC 双通道前置放大器电路D3308

概述: D3308 是一块带有 ALC 的双通道前置放大器。它适用于立体声收录机 和盒式录音机。 采用 SIP9、SOP14 的封装形式封装。 主要特点: ● 带内置 ALC 回路的双通道均衡放大器。 ● 低噪声: VNI1.0V(典型值)。 …

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化(I18n)指的是设计和开发产品的过程,使得它们能够适应多种语言和文化环境,而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品,然后通过配置和资源文件来添加对不同语言和地区的支持。 这…

百度AI人脸检测与对比

1.注册账号 打开网站 https://ai.baidu.com/ &#xff0c;注册百度账号并登录 2.创建应用 3.技术文档 https://ai.baidu.com/ai-doc/FACE/yk37c1u4t 4.Spring Boot简单集成测试 pom.xml 配置&#xff1a; <!--百度AI--> <dependency> <groupId>com.baidu.…

MoeCTF 2024 web

ProveYourLove 前端页面限制了重复提交, 需要绕过, 可以通过BurpSuite抓包爆破, 或者代码直接发包 import requestsurlhttp://127.0.0.1:44395/questionnairedata {nickname: 1,target: 1,message: 1,user_gender: male,target_gender: male,anonymous: false }for i in ran…

使用WebHooks实现自动化工作流程的技术详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebHooks实现自动化工作流程的技术详解 文章目录 使用WebHooks实现自动化工作流程的技术详解引言WebHooks 的基本概念什么是…

如何通过低代码逻辑编排实现业务流程自动化?

随着数字化转型的加速&#xff0c;企业对高效、灵活的业务流程自动化需求日益增加。传统开发模式下的定制化解决方案往往周期长、成本高且难以适应快速变化的需求。低代码平台以其直观、简便的操作界面和强大的功能逐渐成为企业实现业务流程自动化的理想选择。本文将探讨低代码…

DNS记录类型详解(DNS Record Detailed Type)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

分布式专题-Redis核心数据结构精讲

1. redis安装&#xff1a; redis.conf是redis启动配置文件&#xff1b; redis连接&#xff1a; 数据类型&#xff1a; redis命令&#xff1a; String类型&#xff1a; INCRBY orderId 1000 是 Redis 数据库中的一个命令&#xff0c;用于将存储在键 orderId 中的整数值增加 10…

原生微信小程序中封装一个模拟select 下拉框组件

1.首先在components 里面设置组件名称&#xff1a;van-select&#xff08;随便取名字&#xff09;&#xff1b; 2.新建文件写代码&#xff1a; wxml&#xff1a; <view class"w100 select_all_view"><!-- 标题&#xff0c;可以没有 --><view class…

C++小白实习日记——Day 1 怎么跑github上下载的程序

研二&#xff0c;通信专业&#xff0c;实习&#xff0c;记录一下实习经历 在本地服务器跑github代码&#xff1a; 第一天老板给了一个github上的小项目链接让我看&#xff1a; https://github.com/MengRao/tscns 用git clone 命令下载下来&#xff0c;文件夹下有这些&#…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器&#xff0c;尽管我们不…

常用Adb 命令

# 连接设备 adb connect 192.168.10.125# 断开连接 adb disconnect 192.168.10.125# 查看已连接的设备 adb devices# 安装webview adb install -r "D:\webview\com.google.android.webview_103.0.5060.129-506012903_minAPI23(arm64-v8a,armeabi-v7a)(nodpi)_apkmirror.co…

Redis-08 Redis集群

Redis槽位 Redis分片 Redis集群优势 主要掌握第三种 为什么槽位是16384&#xff1f; 三主三从&#xff1a; 每个主机只能写在自己的槽位 所以登录redis集群记得加参数 -c 比如redis-cli -a dc123 -p 6380 -c 加了 -c 相当于会进行路由转发&#xff0c;不属于自己槽位的…

《Django 5 By Example》阅读笔记:p645-p650

《Django 5 By Example》学习第8天&#xff0c;p645-p650总结&#xff0c;总计6页。 一、技术总结 1.django-rest-framework (1)serializer p648, Serializer: Provides serialization for normal Python class instances。Serializer又细分为Serializer, ModelSerializer,…

设计模式-Adapter(适配器模式)GO语言版本

前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上&#xff0c;而不是系统上 问题 就用一个简单的问题&#xff0c;懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈&#xff08;stack&#xff09;或…

【Pythonr入门第二讲】你好,世界

"Hello, World!" 是一种传统的编程入门示例&#xff0c;通常是程序员学习一门新编程语言时编写的第一个程序。这个程序的目标非常简单&#xff1a;在屏幕上输出 "Hello, World!" 这个字符串。尽管它非常简单&#xff0c;但具有重要的象征意义和实际价值。 …

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本&#xff0c;本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…