【机器学习】决策树算法

目录

算法引入 

基尼系数:

决策树算法概述

决策树的关键概念

决策树的构建

代码实现

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 = Nonebest_threshold = Nonemax_information_gain = -1for 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_indexbest_threshold = thresholdmax_information_gain = gainreturn 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.valueif x[tree.feature_index] < tree.threshold:return predict(tree.left, x)else:return predict(tree.right, x)

 决策树的评估指标:

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

决策树的优缺点

优点:

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

缺点:

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

决策树的优化

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


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

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

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

相关文章

Github优质项目推荐-第一期

文章目录 Github优质项目推荐一、【free-for-dev】&#xff0c;88.4k stars二、【linux-command】&#xff0c;31.5k stars三、【system-design-primer】&#xff0c;270k stars四、【GitHub-Chinese-Top-Charts】&#xff0c;99.1k stars五、【Docker-OSX】&#xff0c;46k st…

汇智生物---农业与植物基因组分析专家

1.博导团队免费指导设计 2.博导团队免费解读实验结果 3.实验整体!打包服务 4.实验整体!打包服务 表观组 互作组 DNA亲和纯化测序 DNA亲和纯化测序技术通过体外表达转录因子鉴定转录因子结合位点&#xff0c;不受抗体和物种限制&#xff0c;且具有高通量的优势。DAP-Seq将蛋…

鸿萌数据恢复:NAND 内存协议,SDR 与 DDR 之间的区别

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 从事 NAND 数据恢复的人都知道&#xff0c;读取 NAND 需要使…

不可错过的10款文件加密软件,2024最新文件加密软件排行榜

在数字化时代&#xff0c;数据安全变得尤为重要。无论是个人用户还是企业组织&#xff0c;保护敏感文件和数据免受未经授权的访问是至关重要的。文件加密软件通过将文件内容转换为不可读的格式&#xff0c;确保只有授权用户才能解密和访问数据。本文将为您介绍2024年不可错过的…

828华为云征文 | 在华为云上通过Docker容器部署Elasticsearch并进行性能评测

目录 前言 1. 华为云X实例介绍及优势 1.1 柔性算力 1.2 vCPU和内存的灵活配比 1.3 成本效益与性能 2. 安装并运行 Docker 2.1 修改仓库配置文件 2.2 安装 Docker 2.3 启动 Docker 3. 使用Docker部署Elasticsearch 3.1 拉取Elasticsearch镜像 3.2 启动Elasticsearch…

数据结构算法题

目录 轮转数组原地移除数组中所有元素val删除有序数组中的重复项合并两个有序数组 轮转数组 思路1&#xff1a; 1.利用循环将最后一位数据放到临时变量&#xff08;n&#xff09;中 2.利用第二层循环将数据往后移一位 3.将变量&#xff08;n&#xff09;的数据放到数组第一位 时…

React 启动时webpack版本冲突报错

报错信息&#xff1a; 解决办法&#xff1a; 找到全局webpack的安装路径并cmd 删除全局webpack 安装所需要的版本

SOMEIP_ETS_128: SD_Multicast_FindService_Major_Minor_Version_set_to_all

测试目的&#xff1a; 验证DUT能够对设置了主版本号和次版本号为0xFF的多播FindService请求做出响应&#xff0c;并为每个请求至少回复一个单播OfferService消息。 描述 本测试用例旨在确保DUT能够正确处理多播FindService请求&#xff0c;特别是当请求中的主版本号和次版本…

使用Adobe XD进行制作SVG字体

制作SVG字体的办法有很多&#xff0c;我这里选择了Adobe XD进行制作。 1.选择画布尺寸 2 输入文本 设置字体样式 3 设置画布背景 4 转换字体&#xff08;物件&#xff09;路径 5 设置组 复制SVG代码 6 放入到Html中 <!DOCTYPE html> <html lang"zh">&l…

超级干货,OSPF协议无敌详解

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 大家都知道&#xff0c;为了实现高效的数据传输和网络资源利用&#xff0c;路由协议的选择可以说是非常重要的…

面经 | ES6

ES6 ES6set vs weakSetmap vs weakMapPromise创建三个状态 ES6 set vs weakSet 都是集合&#xff0c;只不过weakSet里面只能存引用类型的变量。weakSet相对set的好处就是&#xff0c;可以避免内存泄漏。因为weakSet中的成员&#xff0c;如果在外部消失了&#xff0c;会自动消…

问题:vscode 打印中文时终端输出乱码

文章目录 问题分析解决 问题 在 vscode 编辑器中的终端运行出来的中文是乱码 分析 乱码原因&#xff1a;因windows中文版系统cmd编码默认为GBK&#xff0c;而vscode默认新建文件的编码为UTF-8所以会出现中文乱码情况 解决 终端下输入 chcp 查看当前的cmd编码设置。如图&…

【LeetCode】动态规划—打家劫舍(附完整Python/C++代码)

动态规划—#198. 打家劫舍 前言题目描述基本思路1. 问题定义:2. 理解问题和递推关系:3. 解决方法:4. 进一步优化:5. 小总结: 代码实现Python3代码实现Python 代码解释C代码实现C 代码解释 总结: 前言 在这个问题中&#xff0c;你是一个专业的小偷&#xff0c;计划偷窃沿街的房…

9.2 Linux_标准I/O_相关函数

打开与关闭 文件打开就是判断这个文件资源可不可以被占用&#xff0c;如果可以&#xff0c;就能够打开成功&#xff0c;否则打开失败 文件关闭就是释放文件资源 1、打开文件 1.1 函数声明 FILE *fopen(const char *pathname, const char *mode); 返回值&#xff1a;出错返…

排序算法Java实现

文章目录 排序算法概述比较排序算法非比较排序算法稳定 vs 不稳定Java 中的排序 外部排序1) 冒泡排序2) 选择排序3) 堆排序4) 插入排序5) 希尔排序6) 归并排序递归实现时间复杂度非递归实现 7) 归并插入8) 快速排序随机基准点处理重复值 9) 计数排序10) 桶排序11) 基数排序 排序…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手&#xff08;可以从上方文件中获取&#xff09;并安装。手机按音量减键和电源键进入 Fastboot 模式&#xff0c; 打开搞机助手&#xff0c;点击进入 9008 模式 等待手机…

功能强大的项目管理平台通常融合多种方法论,系统化解决项目管理难点

难、质量管理难等难点&#xff0c;使用科学的方法论配合专业的项目管理工具&#xff0c;能够更快更好管理项目&#xff0c;提高项目成功率。 那么项目管理的不同阶段分别会用到哪些关键方法论呢&#xff1f; 例如&#xff1a;启动阶段&#xff0c;会用到SMART目标原则制定合理且…

C# winforms 使用菜单和右键菜单

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

20240924替换电脑微信消息提示音

一.准备工作 1.先关闭电脑微信,退出进程 2.打开资源管理器,找到微信的安装位置,进入微信软件的资源目录,找到"WeChatResource.dll"文件 3.将"WeChatResource.dll"文件复制2份,其中一份复制到桌面(用作等下修改),另一份任意保存起来(用作保存原始文件,防止出…

如何使用MacPorts安装tesseract来进行简单的OCR识别

希望文章能给到你启发和灵感&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏 支持一下博主吧&#xff5e; 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、下载MacPorts三、如何使用macPorts安装Tesseract四、 配置并使用Tesseract五、最…