机器学习算法 - 随机森林之决策树初探(1)

news2025/4/3 1:32:26

随机森林是基于集体智慧的一个机器学习算法,也是目前最好的机器学习算法之一。

随机森林实际是一堆决策树的组合(正如其名,树多了就是森林了)。在用于分类一个新变量时,相关的检测数据提交给构建好的每个分类树。每个树给出一个分类结果,最终选择被最多的分类树支持的分类结果。回归则是不同树预测出的值的均值。

要理解随机森林,我们先学习下决策树。

决策树 - 把你做选择的过程呈现出来

决策树是一个很直观的跟我们日常做选择的思维方式很相近的一个算法。

如果有一个数据集如下:

data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7), color=c(rep('blue',5),rep('green',5)))
data

##      x color
## 1  0.0  blue
## 2  0.5  blue
## 3  1.1  blue
## 4  1.8  blue
## 5  1.9  blue
## 6  2.0 green
## 7  2.5 green
## 8  3.0 green
## 9  3.6 green
## 10 3.7 green

那么假如加入一个新的点,其x值为1,那么该点对应的最可能的颜色是什么?

根据上面的数据找规律,如果x<2.0则对应的点颜色为blue,如果x>=2.0则对应的点颜色为green。这就构成了一个只有一个决策节点的简单决策树。

图片

决策树常用来回答这样的问题:给定一个带标签的数据集(标签这里对应我们的color列),怎么来对新加入的数据集进行分类?

如果数据集再复杂一些,如下,

data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7),
                   y=c(1,0.5,1.5,2.1,2.8,2,2.2,3,3.3,3.5),
                   color=c(rep('blue',3),rep('red',2),rep('green',5)))

data

##      x   y color
## 1  0.0 1.0  blue
## 2  0.5 0.5  blue
## 3  1.1 1.5  blue
## 4  1.8 2.1   red
## 5  1.9 2.8   red
## 6  2.0 2.0 green
## 7  2.5 2.2 green
## 8  3.0 3.0 green
## 9  3.6 3.3 green
## 10 3.7 3.5 green



  •  
  • 如果x>=2.0则对应的点颜色为green

  • 如果x<2.0则对应的点颜色可能为blue,也可能为red

这时就需要再加一个新的决策节点,利用变量y的信息。

图片

这就是决策树,也是我们日常推理问题的一般方式。

训练决策树 - 确定决策树的根节点

第一个任务是确定决策树的根节点:选择哪个变量和对应阈值选择多少能给数据做出最好的区分。

比如上面的例子,我们可以先处理变量x,选择阈值为2 (为什么选2,是不是有比2更合适阈值,我们后续再说),则可获得如下分类:

图片

我们也可以先处理变量y,选择阈值为2,则可获得如下分类:

图片

那实际需要选择哪个呢?

实际我们是希望每个选择的变量和阈值能把不同的类分的越开越好;上面选择变量x分组时,Green完全分成一组;下面选择y分组时,Blue完全分成一组。怎么评价呢?

这时就需要一个评价指标,常用的指标有Gini inpurityInformation gain

Gini Impurity

在数据集中随机选择一个数据点,并随机分配给它一个数据集中存在的标签,分配错误的概率即为Gini impurity

我们先看第一套数据集,10个数据点,5个blue,5个green。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?如下表,错误概率为0.25+0.25=0.5(看下面的计算过程)。

probility <- data.frame(Event=c("Pick Blue, Classify Blue",
                                "Pick Blue, Classify Green",
                                "Pick Green, Classify Blue",
                                "Pick Green, Classify Green"), 
                        Probability=c(5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10),
                        Type=c("Blue" == "Blue",
                               "Blue" == "Green",
                               "Green" == "Blue",
                               "Green" == "Green"))
probility

##                        Event Probability  Type
## 1   Pick Blue, Classify Blue        0.25  TRUE
## 2  Pick Blue, Classify Green        0.25 FALSE
## 3  Pick Green, Classify Blue        0.25 FALSE
## 4 Pick Green, Classify Green        0.25  TRUE

我们再看第二套数据集,10个数据点,2个red,3个blue,5个green。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?0.62

probility <- data.frame(Event=c("Pick Blue, Classify Blue",
                                "Pick Blue, Classify Green",
                                "Pick Blue, Classify Red",
                                "Pick Green, Classify Blue",
                                "Pick Green, Classify Green",
                                "Pick Green, Classify Red",
                                "Pick Red, Classify Blue",
                                "Pick Red, Classify Green",
                                "Pick Red, Classify Red"
                              ),
                        Probability=c(3/10 * 3/10, 3/10 * 5/10, 3/10 * 2/10, 
                                      5/10 * 3/10, 5/10 * 5/10, 5/10 * 2/10,
                                      2/10 * 3/10, 2/10 * 5/10, 2/10 * 2/10),
                        Type=c("Blue" == "Blue",
                               "Blue" == "Green",
                               "Blue" == "Red",
                               "Green" == "Blue",
                               "Green" == "Green",
                               "Green" == "Red",
                               "Red" == "Blue",
                               "Red" == "Green",
                               "Red" == "Red"
                               ))
probility

##                        Event Probability  Type
## 1   Pick Blue, Classify Blue        0.09  TRUE
## 2  Pick Blue, Classify Green        0.15 FALSE
## 3    Pick Blue, Classify Red        0.06 FALSE
## 4  Pick Green, Classify Blue        0.15 FALSE
## 5 Pick Green, Classify Green        0.25  TRUE
## 6   Pick Green, Classify Red        0.10 FALSE
## 7    Pick Red, Classify Blue        0.06 FALSE
## 8   Pick Red, Classify Green        0.10 FALSE
## 9     Pick Red, Classify Red        0.04  TRUE

Wrong_probability = sum(probility[!probility$Type,"Probability"])
Wrong_probability

## [1] 0.62

Gini Impurity计算公式:

假如我们的数据点共有C个类,p(i)是从中随机拿到一个类为i的数据,Gini Impurity计算公式为:

$$ G = \sum_{i=1}^{C} p(i)*(1-p(i)) $$ 

图片

对第一套数据集,10个数据点,5个blue,5个green。从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?错误概率为0.25+0.25=0.5

图片

对第二套数据集,10个数据点,2个red,3个blue,5个green

从中随机选一个数据点,再随机选一个分类标签作为这个数据点的标签,分类错误的概率是多少?0.62

图片

决策树分类后的Gini Impurity

对第一套数据集来讲,按照x<2分成两个分支,各个分支都只包含一个分类数据,各自的Gini IMpurity值为0。

这是一个完美的决策树,把Gini Impurity0.5的数据集分类为2Gini Impurity0的数据集。Gini Impurity== 0是能获得的最好的分类结果。

图片

图片

第二套数据集,我们有两种确定根节点的方式,哪一个更优呢?

我们可以先处理变量x,选择阈值为2,则可获得如下分类:

图片

每个分支的Gini Impurity可以如下计算:

图片

当前决策的Gini impurity需要对各个分支包含的数据点的比例进行加权,即

图片

我们也可以先处理变量y,选择阈值为2,则可获得如下分类:

图片

每个分支的Gini Impurity可以如下计算:

图片

当前决策的Gini impurity需要对各个分支包含的数据点的比例进行加权,即

图片

两个数值比较0.24<0.29,选择x作为第一个分类节点是我们第二套数据第一步决策树的最佳选择。

前面手算单个变量单个分组不算麻烦,也是个学习的过程。后续如果有更多变量和阈值时,再手算就不合适了。下一篇我们通过暴力方式自写函数训练决策树。

当前计算的结果,可以作为正对照,确定后续函数结果的准确性。(NBT:你想成为计算生物学家?)

参考:

  • https://victorzhou.com/blog/intro-to-random-forests/

  • https://victorzhou.com/blog/gini-impurity/

  • https://stats.stackexchange.com/questions/192310/is-random-forest-suitable-for-very-small-data-sets

  • https://towardsdatascience.com/understanding-random-forest-58381e0602d2

  • https://www.stat.berkeley.edu/~breiman/RandomForests/reg_philosophy.html

  • https://medium.com/@williamkoehrsen/random-forest-simple-explanation-377895a60d2d

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

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

相关文章

原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表

对于大多数的开发者来言&#xff0c;看了很多文档可能遇见不到什么有用的&#xff0c;就算有用从文档上看&#xff0c;把代码复制到自己的本地大多数也是不能用的&#xff0c;非常浪费时间和学习成本&#xff0c; 尤其是three.js &#xff0c; cesium.js 这种难度较高&#xff…

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API&#xff0c;通常需要以下步骤&#xff1a; 1. 获取 DeepSeek API 密钥 首先&#xff0c;确保你已经在 DeepSeek 平台上注册并获取了 API 密钥&#xff08;API Key&#xff09;。如果没有&#xff0c;请访问 DeepSeek 的官方网站注册并申请 …

【2025新】基于springboot的问卷调查小程序设计与实现

目录 一、整体目录&#xff08;示范&#xff09;&#xff1a; 文档含项目技术介绍、E-R图、数据字典、项目功能介绍与截图等 二、运行截图 三、代码部分&#xff08;示范&#xff09;&#xff1a; 四、数据库表(示范)&#xff1a; 数据库表有注释&#xff0c;可以导出数据…

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 &#xff08;1&#xff09;创建Makefile文件 &#xff08;2&#xff09;编译规则 &#xff08;3&#xff09;编译 &#xff08;4&#xff09;变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…

什么是Docker多架构容器镜像

什么是Docker多架构容器镜像 在 Docker 中&#xff0c;同一个 Docker 镜像可以在不同的平台上运行&#xff0c;例如在 x86、ARM、PowerPC 等不同的 CPU 架构上。 为了支持这种多平台的镜像构建和管理&#xff0c;Docker 在 17.06 版本时引入了 Manifest 的概念&#xff0c;在…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…

RocketMQ及和Kafka的区别

目录 1 从场景入手2 RocketMQ是什么&#xff1f;3 RocketMQ及和Kafka的区别3.1 在架构上做了减法3.1.1 简化协调节点3.1.2 简化分区3.1.3 底层存储3.1.3.1 Kafka底层存储3.1.3.1 RocketMQ底层存储 3.1.4 简化备份模型3.1.4.1 Kafka备份模型3.1.4.2 RocketMQ备份模型 3.1.5 Rock…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

Datawhale Ollama教程笔记3

小白的看课思路&#xff1a; Ollama REST API 是什么&#xff1f; 想象一下&#xff0c;你有一个智能的“盒子”&#xff08;Ollama&#xff09;&#xff0c;里面装了很多聪明的“小助手”&#xff08;语言模型&#xff09;。如果你想让这些“小助手”帮你完成一些任务&#…

基于JavaWeb开发的Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaWeb开发的JavaSpringvueelement实现旅游信息管理平台系统 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各…

【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析

引言 在大数据与云原生技术快速发展的时代&#xff0c;开源技术成为推动行业进步的重要力量。本文将深入探讨三个备受瞩目的开源产品组件&#xff1a;DeepSeek、DataSophon 和 DolphinScheduler&#xff0c;分别从产品定义、功能、技术架构、应用场景、优劣势及社区活跃度等方面…

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展&#xff0c;相关领域人才需求激增&#xff0c;许多本科及职业院校纷纷开设云计算及相关专业方向。 然而&#xff0c;大多数院校在专业建设过程中面临以下困难&…

我的新书《青少年Python趣学编程(微课视频版)》出版了!

&#x1f389; 激动人心的时刻来临啦&#xff01; &#x1f389; 小伙伴们久等了&#xff0c;我的第一本新书 《青少年Python趣学编程&#xff08;微课视频版&#xff09;》 正式出版啦&#xff01; &#x1f4da;✨ 在这个AI时代&#xff0c;市面上的Python书籍常常过于枯燥&…

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…

DBSCAN 基于密度的空间带噪聚类法

DBSCAN 基于密度的空间带噪聚类法 DBSCAN&#xff08;Density - Based Spatial Clustering of Applications with Noise&#xff09;即基于密度的空间聚类算法&#xff0c;它是一种典型的密度聚类算法&#xff0c;以下从核心概念、算法步骤、优缺点及应用场景等方面进行解释。…

Python基于Django的漏洞扫描系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

或非门组成的SR锁存器真值表相关问题

PS&#xff1a;主要是给大家抛砖引玉&#xff0c;不喜勿喷。 问题描述&#xff1a;或非门组成的SR锁存器&#xff0c;为什么当SD和RD等于0时候的真值表一个是Q0&#xff0c;Q0.一个结果是Q1&#xff0c;Q1&#xff1f;

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…

【前端框架】Vue3 面试题深度解析

本文详细讲解了VUE3相关的面试题&#xff0c;从基础到进阶到高级&#xff0c;分别都有涉及&#xff0c;希望对你有所帮助&#xff01; 基础题目 1. 简述 Vue3 与 Vue2 相比有哪些主要变化&#xff1f; 答案&#xff1a; 响应式系统&#xff1a;Vue2 使用 Object.definePrope…

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…