【机器学习】决策树算法

news2024/9/24 13:28:55

目录

算法引入 

基尼系数:

决策树算法概述

决策树的关键概念

决策树的构建

代码实现

1. 定义决策树节点

2. 计算信息增益

3. 选择最佳分割特征

4. 构建决策树

5. 决策树预测

 决策树的评估指标:

决策树的优缺点

优点:

缺点:

决策树的优化


人工智能领域在当今可谓炙手可热,在人工智能与机器学习领域,决策树是一种简单直观却又功能强大的分类与回归方法。它的思想是通过构建一棵树状模型来进行决策或数据分类,其结构主要是以二叉树的形式为主。决策树是一种常用的机器学习算法,用于分类和回归任务。它通过学习简单的决策规则推断出目标值。

算法引入 

小明大学毕业了,去了一家银行当行长,上班第一天就有了10人申请了贷款,刚刚入行的小明仔细地整理了客户信息。包括是否有工作,是否有房子,是否信誉良好,经过了深思熟虑,小明对这10份申请给出了批复。小明想能不能让AI根据自己所做出的规律进行自动批复,这样小明就大大减少了工作量,又可以上班摸鱼了。申请人的信息如下:

申请人是否工作有无房子信誉结果
1一般拒绝
2良好拒绝
3一般同意
4很好同意
5很好同意
6一般拒绝
7一般同意
8很好同意
9很好拒绝
10良好同意

根据上面信息我们能不能推出某一个规律,使规律都满足上面的结果,如果我们按照是否有工作分类,有工作的批准,没工作的不批准,显然不行,在第5个申请人没有工作也批准了。那么我们按照有无房子分类?在第7、10个申请人没有房子也通过了申请,那按照信誉?第9个申请人信誉很好也被拒绝了。那么我们如何进行批准,这就是要我们的决策树出马了。

基尼系数:

那么在建树的时候,谁当那个头结点呢,这就要引出了我们的基尼系数的概念。

根据上面的公式我们可以计算出Gini=1-(5/10)^2-(5/10)^2=0.5。

Gini(工作,是)=1-(4/4)^2-0=0,Gini(工作,否)=1-(2/6)^2-(4/6)^2=0.44。

根据加权方式求和:Gini(工作)=4/10*(Gini(工作,是))+6/10*(Gini(工作,否))=0.27

Gini(房子,是)=1-(4/5)^2-(1/5)^2=0.32,Gini(房子,否)=1-(2/5)^2-(3/5)^2=0.48。

根据加权方式求和:Gini(房子)=5/10*(Gini(房子,是))+5/10*(Gini(房子,否))=0.4

Gini(信誉,一般)=1-(2/4)^2-(2/4)^2=0.5,Gini(信誉,良好)=1-(1/2)^2-(1/2)^2=0.5,Gini(信誉,很好)=1-(3/4)^2-(1/4)^2=0.375。

根据加权方式求和:Gini(信誉)=4/10*(Gini(信誉,一般))+2/10*(Gini(信誉,良好))+4/10*(Gini(信誉,很好))=0.45

我们比较这三个数Gini(工作)=0.27、Gini(房子)=0.4、Gini(信誉)=0.45。我们发现这个三个数字中Gini(工作)=0.27最小,所以我们按照它来建立决策树。

此时头结点建立完成,然后我们在没有工作的里面,有2个客户是被批准的,4个客户被拒绝了,那么我们在此基础上继续进行分类,继续求解Gini(房子),Gini(信誉)。Gini(房子,是)=1-(2/2)^2- 0=0,Gini(房子,否)=1- 0 -(4/4)^2=0。根据加权方式求和:Gini(房子)=2/6*(Gini(房子,是))+4/6*(Gini(房子,否))=0。此时Gini(信誉)就不用算了,Gini(房子)已经达到最小0了,下一个结点就放是否有房子,那么此时最终的决策树就出来了。

先根据是否有工作进行判断,如果有,那么直接进行批准,没有的话,再进行判断是否有房子,有房子的话直接批准,没有房子的话直接拒绝,当然,我们这个例子没有涉及到信誉一项,如果在没有房子的人里面还有被批准的,那么需要再加一个内部节点信誉,再根据信誉的三个分类:一般、良好、很好,进行批复。这些判断是建立在前一项的基础之上的,只有进行了前一项的判断才能进行下一项的判断,进而给出批复。


决策树算法概述

决策树通过树状图的形式模拟决策过程,在每一个结点都会有分支(除了叶子结点),每个内部节点都代表一个属性上的判断,如果为是则走一个分支,如果为否则走另外一个分支。每个分支代表判断的结果,每个叶节点代表一种决策结果。

决策树的关键概念

- 节点(Node):决策树中的一个决策点。
- 根节点(Root):决策树的起始点。
- 分支(Branch):从一个节点到另一个节点的连接。
- 叶节点(Leaf):没有子节点的节点,是一棵树最下面的结点。代表最终决策。
- 路径(Path):从根节点到叶节点的一系列决策。

决策树的构建

构建决策树通常涉及以下步骤:

1. 选择最佳属性:使用某种度量(如信息增益、基尼不纯度)选择最佳属性进行分割。
2. 创建节点:为所选属性的每个可能值创建一个分支。
3. 分割数据:根据属性值将数据分割成不同的子集。
4. 递归构建:对每个子集递归地重复上述步骤,直到满足停止条件(如所有数据属于同一类别,或已达到树的最大深度)。

代码实现

1. 定义决策树节点

class TreeNode:
    def __init__(self, feature_index=None, threshold=None, left=None, right=None, *, value=None):
        self.feature_index = feature_index  # 特征索引
        self.threshold = threshold          # 阈值
        self.left = left                     # 左子树
        self.right = right                   # 右子树
        self.value = value                   # 节点值(叶节点时的分类结果)

2. 计算信息增益

def information_gain(X, y, split_feature_index, threshold):
    # 计算信息熵
    def calculate_entropy(y):
        # 实现信息熵的计算
        pass

    # 划分数据集
    left_indices = [i for i in range(len(X)) if X[i][split_feature_index] < threshold]
    right_indices = [i for i in range(len(X)) if X[i][split_feature_index] >= threshold]

    # 计算信息增益
    total_entropy = calculate_entropy(y)
    left_entropy = calculate_entropy([y[i] for i in left_indices])
    right_entropy = calculate_entropy([y[i] for i in right_indices])
    weight_left = len(left_indices) / len(X)
    weight_right = len(right_indices) / len(X)

    information_gain = total_entropy - (weight_left * left_entropy + weight_right * right_entropy)
    return information_gain

3. 选择最佳分割特征

def best_split(X, y):
    best_feature = None
    best_threshold = None
    max_information_gain = -1

    for feature_index in range(X.shape[1]):
        for i in range(X.shape[0]):
            threshold = X[i][feature_index]
            gain = information_gain(X, y, feature_index, threshold)
            if gain > max_information_gain:
                best_feature = feature_index
                best_threshold = threshold
                max_information_gain = gain

    return best_feature, best_threshold

4. 构建决策树

def build_tree(X, y, max_depth=None, current_depth=0):
    if len(np.unique(y)) == 1 or current_depth == max_depth:
        return TreeNode(value=np.argmax(np.unique(y)))

    best_feature, best_threshold = best_split(X, y)
    if best_feature is None:
        return TreeNode(value=np.argmax(np.unique(y)))

    left_indices = [i for i in range(len(X)) if X[i][best_feature] < best_threshold]
    right_indices = [i for i in range(len(X)) if X[i][best_feature] >= best_threshold]

    left_X = [X[i] for i in left_indices]
    left_y = [y[i] for i in left_indices]
    right_X = [X[i] for i in right_indices]
    right_y = [y[i] for i in right_indices]

    left_child = build_tree(left_X, left_y, max_depth, current_depth + 1)
    right_child = build_tree(right_X, right_y, max_depth, current_depth + 1)

    return TreeNode(feature_index=best_feature, threshold=best_threshold, left=left_child, right=right_child)

5. 决策树预测

def predict(tree, x):
    if tree.value is not None:
        return tree.value
    if x[tree.feature_index] < tree.threshold:
        return predict(tree.left, x)
    else:
        return predict(tree.right, x)

 决策树的评估指标:

  • 准确率:正确分类的样本数占总样本数的比例。
  • 精确度:预测为正的样本中实际为正的比例。
  • 召回率:实际为正的样本中预测为正的比例。
  • F1分数:精确度和召回率的调和平均。

决策树的优缺点

优点:

- 易于理解和解释。
- 可以处理数值和类别数据。
- 不需要数据标准化。
- 可以可视化。

缺点:

- 容易过拟合。
- 对于某些数据集,构建的树可能非常大。
- 对于缺失数据敏感。

决策树的优化

- 剪枝:通过减少树的大小来减少过拟合。
- 集成方法:如随机森林和梯度提升树,可以提高模型的泛化能力。


下一篇文章更新决策树算法ID3、C4.5、CART的介绍以及实现。执笔至此,感触彼多,全文将至,落笔为终,感谢各位的支持。

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

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

相关文章

Mitsuba 渲染基础

Mitsuba 渲染基础 0. Abstract1. 安装 Mitsuba21.1 下载 Mitsuba2 源码1.2 选择后端 (variants)1.3 编译 2. [Mitsuba2PointCloudRenderer](https://github.com/tolgabirdal/Mitsuba2PointCloudRenderer)2.1 Mitsuba2 渲染 XML2.2 Scene 场景的 XML 文件格式2.2.1 chair.npy to…

哪种电容笔更好用?2024精选推荐五款黄金畅销平替电容笔!

在当今信息化高速发展的时代&#xff0c;电容笔已成为众多电子设备用户不可或缺的重要配件。无论是专业的绘画创作者&#xff0c;还是日常学习、办公的人群&#xff0c;都对电容笔有着广泛的需求。可是市面上的品牌很多&#xff0c;到底哪种电容笔更好用呢&#xff1f;大家别担…

基于TCP协议的网络通信

TCP即传输控制协议&#xff0c;基于TCP协议的网络通信总是面向连接的&#xff0c;在通信过程中需要进行“三次握手&#xff0c;四次挥手”&#xff0c;这是众所周知的&#xff0c;所以这里不过多赘述。我们都知道TCP协议传输数据比较稳定&#xff0c;那么为什么稳定&#xff0c…

【Windows 同时安装 MySQL5 和 MySQL8 - 详细图文教程】

卸载 MySQL 参考文章&#xff1a; 完美解决Mysql彻底删除并重装_怎么找到mysql并卸载-CSDN博客使用命令卸载mysql_卸载mysql服务命令-CSDN博客 先管理员方式打开 cmd &#xff0c;切换到 MySQL 安装目录的 bin 文件夹下&#xff0c;执行如下命令&#xff0c;删除 MySQL 服务mys…

基于DPU的OpenStack裸金属服务快速部署及存储解决方案

1 方案背景和挑战 Openstack作为开源云计算领域的领军项目&#xff0c;凭借其强大的功能、灵活的架构以及活跃的社区支持&#xff0c;在全球范围内得到了广泛的采用。通过Openstack&#xff0c;企业和云服务提供商可以更加高效地管理和利用计算资源、存储资源和网络资源&#…

秋招面试准备:《小米2024数字芯片岗面试题》

在数字芯片设计的浪潮中&#xff0c;验证工程师的角色愈发重要。他们如同守门人&#xff0c;确保每一块芯片在投入市场前都能稳定、高效地运行。小米&#xff0c;作为全球知名的智能设备制造商&#xff0c;对数字芯片岗位的人才选拔尤为严格。 本文分享《小米2024数字芯片岗面…

Cat2Bug-Platform报告功能介绍

报告 报告是对团队、项目、测试用例、缺陷、交付物等工作管理做出的总结性报表&#xff0c;目前可通过OPEN API方式创建。 报告列表 报告列表中展示了已经提交的报表信息&#xff0c;点击某一个报告后可查看报告详情&#xff0c;报告可通过markdown格式展示&#xff0c;如下…

Java List初始化的六种方式

在日常的开发中,List作为我们常用的一种数据结构,那么有谁了解过在Java中如何对一个List进行初始化操作。在这些初始化操作中又有哪些遇到的坑呢? 1、常规方式 List<String> languageList = new ArrayList<>(); languageList.add("Java"); language…

C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

如何构建出更好的大模型RAG系统?

ChatGPT爆火之后&#xff0c;以ChatPDF为首的产品组合掀起了知识库问答的热潮。 在过去一整年中&#xff0c;大多数人都在完成RAG系统到高级RAG系统的迭代升级。但是技术发展是迅速的&#xff0c;如何深入了解RAG的发展&#xff0c;做出更好的RAG系统&#xff0c;其实还是非常…

32岁前端干了8年,是继续做前端开发,还是转其它工作_ui设计师转开发

前端发展有瓶颈&#xff0c;变来变去都是那一套&#xff0c;只是换了框架换了环境。换了框架后又得去学习&#xff0c;虽然很快上手&#xff0c;但是那些刚毕业的也很快上手了&#xff0c;入门门槛越来越低&#xff0c;想转行或继续卷&#xff0c;该如何破圈? 这是一位网友的自…

使用SBP打AssetBundle时脚本引用丢失

1&#xff09;使用SBP打AssetBundle时脚本引用丢失 2&#xff09;在UE 5.3中连接Power节点为何10的3次幂等于1009 3&#xff09;如何在Widget中倾斜一张纹理贴图 4&#xff09;如何在打开关卡蓝图时更改游戏模式 这是第401篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热…

uni-app快速入门

目录 一、什么是 uni-app二、快速创建 uni-app 项目1.创建 uni-app2.运行 uni-app 三、uni-app 相对传统 H5 的变化1.网络模型的变化2.文件类型变化3.文件内代码架构的变化4.外部文件引用方式变化5.组件/标签的变化6.js的变化&#xff08;1&#xff09;运行环境从浏览器变成v8引…

MCU自动测量单元采集振弦式应变计测值的过程

振弦式应变计是一种广泛应用于土木工程、地质勘探等领域的高精度传感器&#xff0c;用于测量结构的应变变化。近年来&#xff0c;随着微控制器单元(MCU)的发展&#xff0c;自动化测量技术得到了极大的提升&#xff0c;使得振弦式应变计的测值采集更加高效和精确。本文将详细介绍…

关于 mybatis-plus-boot-starter 与 mybatis-spring-boot-starter 的错误

不是知道你是否 出现过这样的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): 经过各种度娘&#xff0c;无非就是让你检查三种情况 情况一&#xff1a;mapper.xml没有按照传统的maven架构进行放置 情况二&#xff1a;mybatis的配置信…

C语言实现简单凯撒密码算法

**实验2&#xff1a;传统密码技术 【实验目的】 通过本次实训内容&#xff0c;学习常见的传统密码技术&#xff0c;通过编程实现简单代替密码中的移位密码算法&#xff0c;加深对传统密码技术的了解&#xff0c;为深入学习密码学奠定基础。【技能要求】 分析简单代替密码中的移…

R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】 2207.字符串中最多数目的子序列方法&#xff1a;贪心 一次遍历 2207.字符串中最多数目的子序列 方法&#xff1a;贪心 一次遍历 从题意中可以看出来&#xff0c;对于 pattern.charAt(0) 一定是插入到最左侧是最优…

什么是SSL证书?它能保护你的网络安全!

相信大家在浏览网页时经常会看到一些网址前面有个“小锁”图标&#xff0c;它代表的网站是安全的&#xff0c;而这背后的秘密就是SSL证书。那SSL证书到底是什么&#xff1f;它有什么用呢&#xff1f; 什么是SSL证书&#xff1f; SSL证书的全称是Secure Sockets Layer证书&…

php发送邮箱教程:如何实现邮件发送功能?

php发送邮箱性能优化策略&#xff1f;怎么使用PHPMail发送邮箱&#xff1f; 无论是用户注册验证、密码重置&#xff0c;还是系统通知&#xff0c;邮件发送都是不可或缺的一部分。AokSend将详细介绍如何使用PHP实现邮件发送功能&#xff0c;帮助开发者快速掌握这一技能。 php发…