机器学习 - 树结构1 - 随机森林

news2024/10/27 15:30:51

算法原理

    随机森林由多个决策树构成,每棵树在训练时使用随机选择的样本和特征子集。在分类任务中,每棵树对新的输入样本进行分类,最终的分类结果由多数树的分类结果决定。这种方法可以提高预测的准确性,并且通过平均或投票机制减少过拟合的风险。

   决策树示例

    假如共有5个学生样本:每个学生的属性包含姓名、年龄、身高、体重,现有需要通过一个决策树对这些学生进行分类,决策树就是根据这些属性对学生进行分类,如下面的样本所示:小明在年龄方面与其它学生相比,较小,因此作为第一个区分特征,如下图中的决策树,首先通过年龄特征将小明区分出来;然后对样本2、3、4,即小李、小刘和小王进行进一步区分,可见,小刘身高明显较高,因此通过身高特征将小刘区分出来;然后对样本2、4,即小李和小王进行区分,此时通过体重将两者区分开来。

    样本示例:

         样本编号             姓名                年龄                      身高(cm)                  体重(kg)

   1                       小明                  11                           145                               37.5

   2                       小李                  21                           172                                 65

   3                       小刘                  22                           178                                 70 

   4                       小王                  23                           170                                 55 

   样本对应决策树: 

    

                                                              决策树示意图 

随机森林实现过程:

1. 数据准备

  • 加载数据集:加载待处理的数据集,如鸢尾花数据集。
  • 数据分割:通常需要将数据集分割为训练集和测试集,以便后续评估模型性能。

2. 参数设置

  • 树的数量:决定随机森林中决策树的数量,这个参数也称为n_estimators
  • 特征选择:设置在每个决策树节点分裂时考虑的特征数量。
  • 最小叶节点样本数:设置决策树叶节点的最小样本数,这个参数有助于控制过拟合。
  • bootstrap 采样:决定是否在构建每棵决策树时使用 bootstrap 采样方法从原始数据集中抽取样本。

3. 构建决策树

对于随机森林中的每一棵决策树:

  • 样本抽取:如果使用 bootstrap 采样,从训练集中有放回地随机抽取样本。
  • 特征随机选择:在每个决策节点,随机选择一部分特征,然后选择最佳分裂特征进行节点分裂。
  • 树的构建:使用选定的特征和样本构建决策树,直到满足停止条件(如达到最大深度、最小叶节点样本数或纯度)。

4. 模型训练

  • 集成多棵树:重复步骤3,构建多棵决策树,每棵树都在数据的一个随机子集上训练。
  • 存储模型:将每棵树的模型存储在森林中。

5. 预测和投票

  • 分类问题:对于新的输入样本,每棵树给出一个类别预测,然后通过多数投票机制决定最终的类别预测。
  • 回归问题:对于新的输入样本,每棵树给出一个数值预测,然后计算这些预测的平均值作为最终的回归预测。

6. 模型评估

  • 测试集评估:使用测试集评估随机森林模型的性能,计算准确率、精确率、召回率等指标。
  • 特征重要性:评估每个特征对模型预测的贡献度。

示例

数据集介绍

    鸢尾花(Iris)数据集是机器学习和统计分类中最著名的数据集之一,常被用作分类算法的测试数据。这个数据集包含150个样本,分为3个类别,每个类别有50个样本。每个样本有4个特征,分别是:

  1. 花萼长度(Sepal Length):花萼的最大长度,单位为厘米。
  2. 花萼宽度(Sepal Width):花萼的最大宽度,单位为厘米。
  3. 花瓣长度(Petal Length):花瓣的最大长度,单位为厘米。
  4. 花瓣宽度(Petal Width):花瓣的最大宽度,单位为厘米。

    这些特征都是连续的数值型数据。鸢尾花数据集的三个类别分别是:

  1. Iris Setosa(山鸢尾)
  2. Iris Versicolor(变色鸢尾)
  3. Iris Virginica(维吉尼亚鸢尾)

    对该数据集通过matlab进行可视化,可视化效果图如下所示:

    效果图中的四个feature和4个特征的对应关系如下:

  • feature1:花萼长度(Sepal Length)- 单位为厘米。
  • feature2:花萼宽度(Sepal Width)- 单位为厘米。
  • feature3:花瓣长度(Petal Length)- 单位为厘米。
  • feature4:花瓣宽度(Petal Width)- 单位为厘米。

    效果图中每张图表示的是两个特征组合后样本的分布结果,从左到右、从上到下,每张图分别表示不同的两个特征组合后样本的分布图。

实现代码及步骤效果

% 1. 数据准备
load fisheriris
data = meas;  % 特征数据
labels = species;  % 标签

% 随机分割数据集为训练集和测试集
cv = cvpartition(labels, 'HoldOut', 0.3);
idx = cv.test;

% 训练集
trainData = data(~idx, :);
trainLabels = labels(~idx);

% 测试集
testData = data(idx, :);
testLabels = labels(idx);

% 2. 参数设置
nTrees = 100;  % 树的数量
numVariablesToSample = 'sqrt';  % 或者使用 2 或 'all'
minLeafSize = 1;  % 最小叶节点样本数
numVariablesToSample = 'all';  % 使用所有特征


% 3. 构建决策树
model = TreeBagger(nTrees, trainData, trainLabels, ...
                   'OOBPrediction', 'On', ...
                   'MinLeafSize', minLeafSize, ...
                   'NumVariablesToSample', numVariablesToSample, ...
                   'OOBPredictorImportance', 'On');  % 确保这一行在这里

% 4. 进行预测
predictions = predict(model, testData);

% 5. 评估模型性能
confMat = confusionmat(testLabels, predictions);
accuracy = sum(diag(confMat)) / sum(confMat(:));

% 显示混淆矩阵和准确率
disp('Confusion Matrix:');
disp(confMat);
disp(['Accuracy: ', num2str(accuracy)]);

获得的混淆矩阵如下所示:

    混淆矩阵的行列分别为三个类别:如图所示的混淆矩阵表示:属于类别1的样本在通过随机森林分类器的识别下全部被识别为类别1;属于类别2的样本有13个被识别为类别2,有2个被识别为类别3,属于类别3的样本全部被识别为类别3。

获得的分类正确率如下所示:

% 6. 计算特征重要性
imp = model.OOBPermutedVarDeltaError;

% 可视化特征重要性
figure;
bar(imp);
xlabel('Features');
ylabel('Importance');
title('Feature Importance');
set(gca, 'XTickLabel', {'SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth'});

获得的特征重要性图如下图所示:

    如图所示:在识别鸢尾花类别中,第三个特征的重要性最大,第二个特征的重要性最小。 

% 7. 可视化训练集和测试集
figure;
gscatter(data(:,1), data(:,2), labels);
hold on;
gscatter(trainData(:,1), trainData(:,2), trainLabels, 'g', 'o', 5);
gscatter(testData(:,1), testData(:,2), testLabels, 'r', 'x', 5);
title('Training and Testing Data');
legend('Setosa', 'Versicolor', 'Virginica', 'Train', 'Test');
hold off;

可视化结果如下图所示:

    如图所示,为三个类别的鸢尾花数据各自的训练样本和测试样本的分布,其中三种颜色的表示三个类别的训练样本,叉号的表示测试样本。 可见,本次随机选取的测试样本的分布过于集中到绿色类别样本中,需要对测试样本进行进一步的样本多样化的调整,才能得到更加可靠可信的结果。


 

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

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

相关文章

【C++】动态库动态加载实例详解

动态库动态加载:LoadLibrary与函数地址获取详解 一、概述三、加载失败的原因及解决方案DLL文件不存在或路径不正确:依赖的其他DLL未找到:权限问题:DLL版本不兼容: 四、总结 在软件开发中,模块化设计是一种非…

基于Spring Boot的学生宿舍信息资源整合

3系统分析 3.1可行性分析 通过对本学生宿舍信息管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本学生宿舍信息管理系统采用Spring Boot框架&#xff0…

【C++笔记】内存管理

前言 各位读者朋友们大家好,上期我们讲了类和对象下的内容,类和对象整体的内容我们就讲完了,接下来我们开启新的部分内存管理的讲解。 目录 前言一. C/C内存分布二. C语言中内存管理的方式三. C内存管理方式3.1 new/delete操作内置类型3.2…

时间序列预测(九)——门控循环单元网络(GRU)

目录 一、GRU结构 二、GRU核心思想 1、更新门(Update Gate):决定了当前时刻隐藏状态中旧状态和新候选状态的混合比例。 2、重置门(Reset Gate):用于控制前一时刻隐藏状态对当前候选隐藏状态的影响程度。…

idea 无法输入中文 快速解决

idea在某些情况会出现无法输入中文的情况,我们不去深究内部原因,直接上解决方案: 1、点击菜单help->Edit Custom VM Options 2、最后一行,追加: -Drecreate.x11.input.methodtrue 、 3、重启

计算机毕业设计Java连锁超市销售与分析系统 销售数据管理 超市运营分析 数据可视化 (源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

10月27日

取P为A 秩1矩阵只有1个特征值为正,其余为1

YOLO11 目标检测 | 自动标注 | 预标注 | 标签格式转换 | 手动校正标签

本文分享使用YOLO11进行目标检测时,实现模型推理预标注、自动标注、标签格式转换、以及使用Labelme手动校正标签等功能。 目录 1、预训练权重 2、生成预标注 3、分析YOLO11的目标检测格式 4、分析Labelme标注工具的格式 5、生成json标注文件 6、手动校正标签 …

#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶VNC

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

PHPOK 4.8.338 后台任意文件上传漏洞(CVE-2018-12941)复现

PHPOK企业站(简称PHPOK)建设系统是一套基于PHP和MySQL构建的高效企业网站建设方案之一,全面针对企业网(以展示为中心)进行合理的设计规划。 PHPOK是一套开源免费的建站系统,可以在遵守LGPL协议的基础上免费使用。系统具…

trueNas 24.10 docker配置文件daemon.json无法修改(重启被覆盖)解决方案

前言 最近听说truenas的24.10版本开放docker容器解决方案放弃了原来难用的k3s,感觉非常巴适,就研究了一下,首先遇到无法迁移老系统应用问题比较好解决,使用sudo登录ssh临时修改daemon.json重启docker后进行docker start 容器即可…

腾讯云视频文件上传云存储时自动将mp4格式转码成m3u8

针对问题: 弱网环境下或手机网络播放mp4格式视频卡顿。 存储环境:腾讯云对象存储。 处理流程: 1:登录腾讯云控制台,进入对象存储服务,找到对应的存储桶,点击进入。 在任务与工作流选项卡中找…

Linux复习-C++

参考博客: https://blog.csdn.net/qq_45254369/article/details/126023482?ops_request_misc%257B%2522request%255Fid%2522%253A%252277629891-A0F3-4EFC-B1AC-410093596085%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&req…

深入探索:AI模型在各行业的实际应用

深入探索:AI模型在各行业的实际应用 前言一、卷积神经网络(CNN)图像分类 二、循环神经网络(RNN)及其变体(LSTM、GRU)自然语言处理(NLP) 三、基于Transformer架构的模型&a…

基于树型结构实现顺序结构堆

目录 前言 一、树 1、树的概念与结构 2、树的相关术语 3、二叉树 4、满二叉树 ​ 5、完全二叉树 ​ 6、二叉树的存储 1、顺序结构 2、链式结构 二、堆 1、堆的结构 2、堆的初始化 3、入堆(大根堆) 4、出堆(大根堆&#xf…

C++网络编程之C/S模型

C网络编程之C/S模型 引言 在网络编程中,C/S(Client/Server,客户端/服务器)模型是一种最基本且广泛应用的架构模式。这种模型将应用程序分为两个部分:服务器(Server)和客户端(Clien…

Java审计对比工具JaVers使用

最近有个需求,需要将页面的内容生成excel或者word文档,而且每次的修改都需要生成新的版本,同时需要记录每次修改变化的内容。我们会把每次的修改的内容提交赋值给一个java对象,同时存储到数据库一条新数据,对应数据表一…

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果,要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度,看参考一下效果。 实现思路 这个效果看着挺复杂的,那么我们…

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

索引的使用和优化

索引就是一种快速查询和检索数据的数据结构&#xff0c;mysql中的索引结构有&#xff1a;B树和Hash。 索引的作用就相当于目录的作用&#xff0c;我么只需先去目录里面查找字的位置&#xff0c;然后回家诶翻到那一页就行了&#xff0c;这样查找非常快&#xff0c; 创建一个表结…