【机器学习】监督学习算法之:决策树

决策树

  • 1、引言
  • 2、决策树
    • 2.1 定义
    • 2.2 原理
    • 2.3 实现方式
    • 2.4 算法公式
      • 2.4.1 信息增益公式
      • 2.4.2 信息增益率公式
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥,我被你骗了。
小鱼:… 别闹,我怎么可能骗你呢。
小屌丝:你上次说的去泡澡
小鱼:嗯,然后呢。
小屌丝:然后咱俩去的是啥地方
小鱼:…嗯… 这个… 是泡澡的地方啊
小屌丝:你可拉倒吧。
小鱼:那我问你,咱俩去没去泡澡。
小屌丝:去了啊。
小鱼:那咱俩泡澡的地方有没有汗蒸房
小屌丝: 有啊。
小鱼:那咱俩泡澡的地方,有没有提供饮料。
小屌丝:有啊
小鱼:那咱俩泡澡的地方,有没有敲背。
小屌丝:有啊…
小鱼: 那咱俩泡完澡,有没有吃夜宵。
小屌丝:… 也有啊
小鱼: 你看,你都说了,这个流程咱都有,你咋说我骗你呢。
小屌丝:…但不,咱去的泡澡的地方跟原来的不一样
小鱼: …哪不一样了。

在这里插入图片描述
小屌丝:你看,这就是你说你请我去的泡澡的地方。
小鱼:那你说,这次咱俩洗完澡,是不是比平时更舒服了
小屌丝:这么一说,确实是这样的。
小鱼:而且冬天了,咱也得感受一下东北的搓澡文化。
小屌丝:…这么一说,那下次,咱还去这搓澡。
小鱼:你这还喜欢上搓澡了。

2、决策树

2.1 定义

决策树算法是一种常用的机器学习算法,它主要用于分类和回归问题。

该算法通过构建一棵树状结构来对输入数据进行分类或预测。

决策树算法的核心思想是基于一系列的特征对数据集进行分割,使得每个分割后的子集能够更好地满足某种条件,从而逐步逼近最终的分类或预测结果。

2.2 原理

是通过对数据集进行递归地划分,使得每个划分子集中的数据尽可能地相似。

通过计算不同特征的信息增益或基尼不纯度等指标,选择最佳的划分特征。

在划分的过程中,会逐渐减小不确定性,使得每个子集内的数据更加纯净。

2.3 实现方式

决策树的实现通常包括以下几个步骤:

  • 特征选择:选择最优特征进行划分,常用的特征选择方法有信息增益、增益率、基尼不纯度等。
    决策树生成:递归地划分数据集,生成决策树。常用的划分准则是完全划分,即每个子集只包含同一类别的数据。
  • 剪枝:对生成的决策树进行剪枝,以提高模型的泛化能力。常见的剪枝策略有预剪枝和后剪枝。
  • 决策树评估:使用测试数据对决策树进行评估,常用的评估指标有准确率、精确率、召回率和F1分数等。

2.4 算法公式

决策树算法的实现方式可以有多种,包括:

  • ID3算法:ID3算法使用信息增益来选择最佳划分特征
  • C4.5算法:C4.5算法使用信息增益率来选择最佳划分特征
  • CART算法:CART算法则使用基尼不纯度来选择最佳划分特征

2.4.1 信息增益公式

信息增益公式如下:
G a i n ( D , A ) = E n t r o p y ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t r o p y ( D v ) Gain(D, A) = Entropy(D) - \sum_{v=1}^{V}\frac{|D_v|}{|D|}Entropy(D_v) Gain(D,A)=Entropy(D)v=1VDDvEntropy(Dv)
D D D表示原始数据集, A A A表示待选择的划分特征, V V V表示特征 A A A的取值集合, D v D_v Dv表示特征 A A A取值为 v v v的子集, ∣ D ∣ |D| D表示数据集的样本个数, ∣ D v ∣ |D_v| Dv表示子集 D v D_v Dv的样本个数。

2.4.2 信息增益率公式

信息增益率公式如下:
G a i n _ R a t i o ( D , A ) = G a i n ( D , A ) S p l i t _ I n f o ( D , A ) Gain\_Ratio(D, A) = \frac{Gain(D, A)}{Split\_Info(D, A)} Gain_Ratio(D,A)=Split_Info(D,A)Gain(D,A)

其中, S p l i t _ I n f o ( D , A ) Split\_Info(D, A) Split_Info(D,A)表示特征 A A A的分裂信息,用于避免对具有较多取值的特征偏好。

基尼不纯度公式如下:
G i n i ( D ) = 1 − ∑ k = 1 K ( p k ) 2 Gini(D) = 1 - \sum_{k=1}^{K}(p_k)^2 Gini(D)=1k=1K(pk)2
K K K表示类别的个数, p k p_k pk表示属于类别 k k k的样本在数据集 D D D中的比例。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-01-21
# @Author : Carl_DJ

'''
实现功能:
    实现了一个简单的决策树分类器,其中包含了
      信息熵和基尼指数的计算函数,
      构建决策树、预测的方法

'''


import numpy as np

# 定义熵函数,计算给定标签集合的熵(信息熵)
def entropy(y):
    # 获取y中所有唯一值及其出现次数
    _, counts = np.unique(y, return_counts=True)
    # 计算每个类别的概率
    probabilities = counts / len(y)
    # 根据香农熵公式计算熵值
    return -np.sum(probabilities * np.log2(probabilities))

# 定义基尼不纯度指数函数,计算给定标签集合的基尼指数
def gini(y):
    # 同样获取y中所有唯一值及其出现次数
    _, counts = np.unique(y, return_counts=True)
    # 计算每个类别的概率
    probabilities = counts / len(y)
    # 根据基尼指数公式计算基尼不纯度
    return 1 - np.sum(probabilities**2)

# 定义信息增益计算函数,基于某个特征列计算划分数据集的信息增益
def information_gain(X, y, feature_index):
    # 计算原始数据集的熵(或基尼指数)作为总熵
    total_entropy = entropy(y)
    # 获取特征列feature_index上所有唯一值及其出现次数
    values, counts = np.unique(X[:, feature_index], return_counts=True)
    # 计算每个特征值对应的子集熵,并加权求和得到信息增益
    weighted_entropies = []
    for value, count in zip(values, counts):
        subset_y = y[X[:, feature_index] == value]
        # 子集的熵
        subset_entropy = entropy(subset_y)
        # 加权后的熵
        weighted_entropies.append(subset_entropy * count / len(y))
    # 总熵减去加权子集熵之和即为信息增益
    return total_entropy - np.sum(weighted_entropies)

# 定义基尼指数增益计算函数,与信息增益类似,但使用基尼指数代替熵
def gini_index(X, y, feature_index):
    # 计算原始数据集的基尼指数作为总基尼指数
    total_gini = gini(y)
    # 获取特征列feature_index上所有唯一值及其出现次数
    values, counts = np.unique(X[:, feature_index], return_counts=True)
    # 计算每个特征值对应的子集基尼指数,并加权求和得到基尼指数增益
    weighted_ginis = []
    for value, count in zip(values, counts):
        subset_y = y[X[:, feature_index] == value]
        # 子集的基尼指数
        subset_gini = gini(subset_y)
        # 加权后的基尼指数
        weighted_ginis.append(subset_gini * count / len(y))
    # 总基尼指数减去加权子集基尼指数之和即为基尼指数增益
    return total_gini - np.sum(weighted_ginis)

# 定义决策树类
class DecisionTree:
    # 初始化方法,设置最大深度和分裂标准(默认为基尼指数)
    def __init__(self, max_depth=None, criterion='gini'):
        self.max_depth = max_depth
        self.criterion = criterion

    # 训练方法,构建决策树模型
    def fit(self, X, y):
        # 调用私有方法构建决策树
        self.tree = self._build_tree(X, y)

    # 预测方法,根据输入样本X预测类别
    def predict(self, X):
        # 对于每个样本x,遍历决策树进行预测,并将结果存放在数组中
        return np.array([self._traverse_tree(x, self.tree) for x in X])

    # 私有方法,递归构建决策树
    def _build_tree(self, X, y, depth=0):
        # 如果达到最大深度或者所有样本标签相同,则返回该标签作为叶子节点
        if depth == self.max_depth or len(np.unique(y)) == 1:
            return np.bincount(y).argmax()
        
        # 选择最优特征并根据最优特征划分数据集
        best_feature = self._select_best_feature(X, y)
        tree = {best_feature: {}}
        
        # 获取当前最佳特征的所有可能取值
        values = np.unique(X[:, best_feature])
        for value in values:
            # 根据特征值筛选出子集,并对子集继续构建子树
            subset_X = X[X[:, best_feature] == value]
            subset_y = y[X[:, best_feature] == value]
            tree[best_feature][value] = self._build_tree(subset_X, subset_y, depth + 1)
        
        # 返回当前结点及其包含的子树
        return tree

    # 私有方法,选择最优特征(根据信息增益或基尼指数)
    def _select_best_feature(self, X, y):
        # 根据设定的标准选取相应的评价函数
        if self.criterion == 'gini':
            criterion_func = gini_index
        elif self.criterion == 'entropy':
            criterion_func = information_gain
        else:
            raise ValueError("Invalid criterion.")
        
        # 遍历所有特征,找到具有最高信息增益/基尼指数增益的特征
        best_feature = None
        best_score = -np.inf
        for feature_index in range(X.shape[1]):
            score = criterion_func(X, y, feature_index)
            if score > best_score:
                best_score = score
                best_feature = feature_index
        
        # 返回最优特征索引
        return best_feature

    # 私有方法,遍历决策树进行预测
    def _traverse_tree(self, x, tree):
        # 如果当前结点是字典类型(非叶节点),则继续深入决策树
        if isinstance(tree, dict):
            feature_index = list(tree.keys())[0]
            value = x[feature_index]
            subtree = tree[feature_index][value]
            return self._traverse_tree(x, subtree)
        # 如果当前结点不是字典类型(叶节点),则返回预测类别
        else:
            return tree

3、总结

看到这里,监督爱学习的决策树就讲到这里了。
我们不仅要理解决策树的定义,还需要通过实例来掌握其原理,
因为只要在实践中,才能掌握其技能。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习机器学习领域的知识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零开始学Linux之gcc链接

目录 创建静态库并使用 创建动态库(共享库)并使用 链接:将.o目标文件链接起来生成一个可执行程序文件,可分为静态链接和动态链接 静态链接:链接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整…

VUE PC端可拖动悬浮按钮

一、实现效果&#xff1a; 二、FloatButton.vue <template><div><div class"sssss"><div class"callback float" mousedown"down" touchstart"down" mousemove"move" touchmove"move" mous…

[opencvsharp]C#基于Fast算法实现角点检测

角点检测算法有很多&#xff0c;比如Harris角点检测、Shi-Tomas算法、sift算法、SURF算法、ORB算法、BRIEF算法、Fast算法等&#xff0c;今天我们使用C#的opencvsharp库实现Fast角点检测 【算法介绍】 fast算法 Fast(全称Features from accelerated segment test)是一种用于角…

脚本工具 mktemp 和 install

1.创建临时文件 mktemp 1.1 介绍 mktemp 命令用于创建并显示临时文件&#xff0c;可避免冲突 使用mktemp命令时&#xff0c;它会根据指定的模板在临时目录&#xff08;默认为/tmp&#xff09;中创建一个唯一的临时文件或目录&#xff0c;并返回该文件或目录的完整路径。临时…

【大厂AI课学习笔记】1.4 算法的进步(2)

关于感知器的兴衰。 MORE&#xff1a; 感知器的兴衰 一、感知器的发明与初期振动 在人工智能的历史长河中&#xff0c;感知器&#xff08;Perceptron&#xff09;无疑是一个里程碑式的存在。它最初由心理学家Frank Rosenblatt在1950年代提出&#xff0c;并在随后的几年中得到…

Python爬虫http基本原理

HTTP 基本原理 在本节中&#xff0c;我们会详细了解 HTTP 的基本原理&#xff0c;了解在浏览器中敲入 URL 到获取网页内容之间发生了什么。了解了这些内容&#xff0c;有助于我们进一步了解爬虫的基本原理。 2.1.1 URI 和 URL 这里我们先了解一下 URI 和 URL&#xff0c;URI…

vscode下python的设置

vscode的注释块设置 在代码的头部输入pyh在方法的上面输入func {// Place your snippets for python here. Each snippet is defined under a snippet name and has a prefix, body and // description. The prefix is what is used to trigger the snippet and the body will …

C++类与对象:默认成员函数

文章目录 1.类的6个默认成员函数2.构造函数3.析构函数4. 拷贝构造函数5.赋值运算符和运算符重载6.日期类实现7.const成员8.重载流插入<< &#xff0c;流提取>>1.流插入2.流提取 9.取地址及const取地址操作符重载 1.类的6个默认成员函数 空类:也就是什么成员都没有的…

【AG32VF407】国产MCU+FPGA,更新官方固件解决8Mhz内部晶振不准,Verilog实测7.9Mhz!

视频讲解 [AG32VF407]国产MCUFPGA&#xff0c;更新官方固件解决8Mhz内部晶振不准&#xff0c;Verilog实测7.9Mhz&#xff01; 实验过程 之前出现的双路pll不同频率的测试中&#xff0c;提出了内部晶振输出不准的问题&#xff0c;和官方沟通后得到极大改善&#xff0c;方法如下…

基于SSM+MySQL的的新闻发布系统设计与实现

目录 项目简介 项目技术栈 项目运行环境 项目截图 代码截取 源码获取 项目简介 新闻发布系统是一款基于Servletjspjdbc的网站应用程序&#xff0c;旨在提供一个全面且高效的新闻发布平台。该系统主要包括后台管理和前台新闻展示两个平台&#xff0c;涵盖了新闻稿件的撰写…

ElasticSearch-IK分词器(elasticsearch插件)安装配置和ElasticSearch的Rest命令测试

四、IK分词器(elasticsearch插件) IK分词器&#xff1a;中文分词器 分词&#xff1a;即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库中或者索引库中的数据进行分词&#xff0c;然后进行一一个匹配操作&…

四、CPU架构介绍和分类

中央处理器&#xff08;central processing unit&#xff0c;简称CPU&#xff09;作为计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元 1、CPU架构 CPU架构是CPU厂商给属于同一系列的CPU产品定的一个制作规范&#xff0c;主要目的是为了作为区分不同…

菜鸡后端的前端学习记录-2

前言 记录一下看视频学习前端的的一些笔记&#xff0c;以前对Html、Js、CSS有一定的基础&#xff08;都认得&#xff0c;没用过&#xff09;&#xff0c;现在不想从头再来了&#xff0c;学学Vue框架&#xff0c;不定时更新&#xff0c;指不定什么时候就鸽了。。。。 忘了记一下…

软件测试Bug系列之4个基本步骤(一)

目录 1.发现bug 2.提交bug 3.跟踪bug 4.总结bug 只要你一个测试人员 &#xff0c;就肯定离不开提交bug&#xff0c;跟踪bug的工作 。对于大多数的功能测试人员来说 &#xff0c;占比最多的工作就是和bug打交道 。可以说它是我们最重要的一块业绩 。所以&#xff0c;有必要静…

Maya------跟随路径生成物体

21.扫描网格_哔哩哔哩_bilibili

探索微服务治理:从发展到实践构建高效稳定的系统|负载均衡技术解析

二、微服务治理的相关技术 微服务治理涉及多个方面&#xff0c;包括服务注册与发现、负载均衡、容错处理、服务配置管理等&#xff0c;这些技术共同确保微服务架构的稳定运行。 2、负载均衡 负载均衡作为服务治理中的核心技术之一&#xff0c;对于提高系统的可用性、性能和扩…

迁移windows操作系统

最近有个朋友跟我说他电脑台卡了&#xff0c;我帮他大概看了下&#xff0c;归集原因磁盘还是机械硬盘&#xff0c;需要将他的电脑的磁盘的机械硬盘换一下&#xff0c;内存也比较小&#xff0c;4GB的&#xff0c;换一下&#xff0c;换成8GB的&#xff0c;本文只涉及到更换系统盘…

【CSS3线性渐变·元素转换·HTML】

线性渐变 线性渐变是向下、向上、向左、向右、对角方向的颜色渐变。 background-image: linear-gradient(); .gradient2 {margin-left: 10px;width: 100px;height: 100px;background-image: linear-gradient(to right, #ff9d72, #c6c9ff);}/*从左上角到右下角的渐变*/.gradien…

three.js CSS3DRenderer、CSS3DSprite渲染HTML标签

有空的老铁关注一下我的抖音&#xff1a; 效果: <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red;position: relative;"></div><…

杂题——试题 算法训练 区间最大和

分析&#xff1a; 如果使用两个for循环遍历所有情况&#xff0c;运行会超时解决运行超时的关键点在于&#xff1a;及时停止累加&#xff0c;丢弃当前的子序列 比如【1&#xff0c;-2&#xff0c;3&#xff0c;10】从第一个数字开始的子序列的和小于从第三个数字开始的子序列的和…