零基础入门转录组数据分析——机器学习算法之boruta(训练模型)

零基础入门转录组数据分析——机器学习算法之boruta(训练模型)

目录

  • 零基础入门转录组数据分析——机器学习算法之boruta(训练模型)
    • 1. boruta基础知识
    • 2. boruta(Rstudio)——代码实操
      • 2. 1 数据处理
      • 2. 2 构建boruta模型
      • 2. 3 训练模型结果简单可视化


您首先需要了解本贴是完全免费按实际案例分享基础知识和全部代码,希望能帮助到初学的各位更快入门,但是 尊重创作和知识才会有不断高质量的内容输出 ,如果阅读到最后觉得本贴确实对自己有帮助,希望广大学习者能够花点自己的小钱支持一下作者创作(条件允许的话一杯奶茶钱即可),感谢大家的支持~~~~~~ ^_^ !!!

注:当然这个并不是强制的哦,大家也可以白嫖~~,只是一点点小的期盼!!!

祝大家能够开心学习,轻松学习,在学习的路上少一些坎坷~~~请添加图片描述



1. boruta基础知识

1.1 训练模型是什么?
训练模型指的是利用特定的算法和大量的数据,让计算机生成一个可以解决特定问题的模型,这个过程的目的是使模型能够对新的、未见过的数据进行准确的预测或分类

1.2 训练模型和上一章筛选特征基因有什么联系?
上一章筛选完特征基因后就可以用筛选后的那些特征基因作为输入来训练模型

1.3 训练模型能干什么?
其可以在筛选完特征基因后验证特征筛选的有效性,即通过在一个新的数据集(通常是测试集或验证集)上训练模型,并评估其性能,可以验证特征筛选是否真正提高了模型的泛化能力。同时还可以看看用这些特征基因构建模型对于预测和分类的准确性。

举个栗子: 在上一章中筛选出来了7个特征基因,想进一步了解下这7个特征基因在什么样的参数条件下能够构建出最优模型,以及构建出来的模型它的预测准确性是多少,就可以在训练模型中找到答案。

注意:关于特征基因的验证通常不是用模型去验证的,通常可以直接用实验的手段去检测基因的表达水平,因此在这一章中仅介绍如何训练模型,对于如何验证不做过多介绍。

这一章可以作为拓展知识大家了解即可(前面的处理方式都与上一章一致)



2. boruta(Rstudio)——代码实操

本项目以TCGA——肺腺癌为例展开分析
物种:人类(Homo sapiens)
R版本:4.2.2
R包:tidyverse,Boruta,caret,cowplot

废话不多说,代码如下:

2. 1 数据处理

设置工作空间:

rm(list = ls()) # 删除工作空间中所有的对象
setwd('/XX/XX/XX') # 设置工作路径
if(!dir.exists('./11_boruta_train')){dir.create('./11_boruta_train')
} 
setwd('./11_boruta_train/') 

加载包:

library(tidyverse)
library(Boruta)
library(caret)
library(cowplot)

导入要分析的表达矩阵train_data ,并对train_data 的列名进行处理(这是因为在读入的时候系统会默认把样本id中的“-”替换成“.”,所以要给替换回去

train_data <- read.csv("./data_fpkm.csv", row.names = 1, check.names = F)  # 行名为全部基因名,每列为样本名
colnames(train_data) <- gsub('.', '-', colnames(train_data), fixed = T)

导入分组信息表group

group <- read.csv("./data_group.csv", row.names = 1) # 为每个样本的分组信息(tumor和normal)
colnames(group) <- c('sample', 'group')

导入要筛选的基因hub_gene (8个基因)

hub_gene <- data.frame(symbol = gene <- c('ADAMTS2', 'ADAMTS4', 'AGRN', 'COL5A1', 'CTSB', 'FMOD', 'LAMB3', 'LAMB4'))
colnames(hub_gene) <- "symbol"

从全部的基因表达矩阵中取出这8个基因对应的表达矩阵,并且与之前准备的分组信息表进行合并

dat <- train_data[rownames(train_data) %in% hub_gene$symbol, ] %>%t() %>%as.data.frame() # 整理后行为样本名,列为基因名
dat$sample <- rownames(dat)
dat <- merge(dat, group, var = "sample")
dat <- column_to_rownames(dat, var = "sample") %>% as.data.frame()table(dat$group)
dat$group <- factor(dat$group, levels = c('disease', 'control'))

2. 2 构建boruta模型

设置随机种子并运行Boruta特征选择

set.seed(123)
boruta.train <- Boruta(group~., data = dat, doTrace = 2, maxRuns = 500)

boruta.train结果如下图所示,运行了499次迭代,耗时20.38秒,其中有7个特征是确定的,有一个特征—LAMB4是不确定的。
在这里插入图片描述

修正Boruta结果(这一步是可选的,主要用于修正Boruta算法可能产生的某些不稳定的特征选择结果

final.boruta <- TentativeRoughFix(boruta.train)

修正后的final.boruta结果如下图所示,其余没什么变化,唯独那个不确定的LAMB4变成了不重要的
在这里插入图片描述

------------------------------注意:从这一步开始就和上一章不一致了----------------------------

定义一个函数用来生成用于随机森林模型调参的mtry值列表

  • mtry值——是随机森林(Random Forest)算法中的一个重要参数,它决定了每个决策树在进行特征选择时考虑的特征数量。具体来说,mtry参数定义了每个决策树节点可用于分割的特征的最大数量

那么选择什么样的mtry值是合适的?(mtry值的选择)

  • (1)经验值: 通常,mtry的取值范围是0到p,其中p是特征的总数。取特征总数的平方根是一个常见的经验值,但这并不是绝对的,实际选择时需要根据数据和任务进行调整。
  • (2)交叉验证: 为了找到最佳的mtry值,可以通过交叉验证等方法进行调优。例如,在R的randomForest包中,可以使用rfcv()函数来执行随机森林交叉验证,从而选择最佳的mtry值。
  • (3)自适应选择: 有些随机森林实现支持自适应地选择mtry的值。在每次分裂时,算法会动态调整mtry的大小,以便更好地适应数据。
# 交叉验证选择参数并拟合模型,定义一个函数生成一些列用来测试的mtry (一系列不大于总变量数的数值)。
generateTestVariableSet <- function(num_toal_variable){max_power <- ceiling(log10(num_toal_variable))tmp_subset <- c(unlist(sapply(1:max_power, function(x) (1:10)^x, simplify = F)), ceiling(max_power/3))#return(tmp_subset)base::unique(sort(tmp_subset[tmp_subset<num_toal_variable]))
}

函数的具体作用分解如下:

  • (1)输入num_toal_variable——这个表示特征的总数
  • (2)计算最大幂次——通过 max_power <- ceiling(log10(num_toal_variable)) 计算特征总数的以10为底的对数的上整,这个值用于确定在生成候选 mtry 值时要考虑的幂次范围
  • (3)生成幂次序列——使用 sapply 函数和匿名函数 (1:10)^x 生成一个包含从1的幂到max_power的幂(每个幂次都取1到10的幂次方)的列表。这个列表通过 unlist 展开,以便形成一个单一的向量
  • (4)筛选和排序——从生成的幂次序列中筛选出小于或等于特征总数的值,以确保 mtry 值不会超过可用的特征数量。然后,使用 sort 函数对这些值进行排序,并使用 unique 函数去除任何重复的值,以生成一个有序的、无重复的 mtry 候选值列表。
  • (5)输出结果——最终返回这个排序且去重的 mtry 候选值列表

定义好计算mtry值的函数后就要准备输入的数据(从boruta模型中提取出通过筛选的基因

#提取重要的变量和可能重要的变量
boruta.finalVarsWithTentative <- data.frame(Item = getSelectedAttributes(final.boruta, withTentative = T), Type = "Boruta_with_tentative")

boruta.finalVarsWithTentative如下图所示,第一列item就是那7个通过检验的特征基因,第二列type就是对应的类型
在这里插入图片描述

之后从全部的基因表达矩阵中提取出这7个基因对应的表达矩阵

boruta_train_data <- dat[, boruta.finalVarsWithTentative$Item]

boruta_train_data 如下图所示,行名为样本名,每一列对应一个基因。
在这里插入图片描述
之后将这个boruta_train_data 作为参数,输入到自定义函数中去计算相应的mtry值列表

boruta_mtry <- generateTestVariableSet(ncol(boruta_train_data))

可以看出输出mtry值列表有6个数值,分别是123456,不同的mtry值计算出来的结果不一样
在这里插入图片描述
接下来就要为训练模型做准备,首先是设置交叉验证方式

这里采用trainControl函数去设置:
(1)method=“repeatedcv”——指定了交叉验证的方法为“重复交叉验证”(repeatedcv)
(2)number=10——表示每次交叉验证将数据集分成10
(3)repeats=5——表示这个过程将重复5次

trControl <- trainControl(method = "repeatedcv", number = 10, repeats = 5)

接下来就要根据前面计算出来的mtry值列表生成一个网格,这个网格将用于在训练过程中测试不同的mtry值,以找到最优的mtry

tuneGrid <- expand.grid(mtry = boruta_mtry)

做好上述准备后就可以开始通过train函数尝试训练模型

  • x——表示输入的特征数据(boruta_train_data)
  • y——表示指定的目标变量(可以理解成分组)
  • method——使用的模型类型(这里是"rf",即随机森林)。
  • tuneGrid——用于调优的网格(这里是前面计算出来的mtry不同值)
  • metric——用于评估模型性能的度量标准
  • trControl——交叉验证的控制参数
train_data_group <- as.factor(dat$group)
borutaConfirmed_rf_default <- train(x = boruta_train_data, y = train_data_group, method = "rf", tuneGrid = tuneGrid, metric = "Accuracy", trControl = trControl)

注意:在metric参数中,如果分组是一个二元分类问题的目标变量,需要选择"Accuracy"(准确率)或"ROC"(对于二分类问题的AUC值)。如果分组是一个具有多个类别的分类问题的目标变量,应该选择"Kappa"或"Accuracy"。

borutaConfirmed_rf_default如下图所示,介绍训练模型相对应的信息,比如:7个特征(7 predictor),二分类变量(2 classes),以及不同mtry对应的模型精确性,最后发现当mtry = 2时,模型为最优模型,其预测准确性为0.9613(最高)。
在这里插入图片描述
明确了最优模型之后,就要从模型中进一步提取出筛选后的基因及其对应的重要性并保存输出

gene_importance <- varImp(borutaConfirmed_rf_default)
gene_importance <- gene_importance$importance
gene_importance$symbol <- rownames(gene_importance)
colnames(gene_importance) <- c('importance', 'symbol')
gene_importance <- dplyr::select(gene_importance, symbol, importance)
gene_importance <- gene_importance[order(gene_importance$importance, decreasing = T), ]
write.csv(gene_importance, file = 'gene_importance_all.csv')

2. 3 训练模型结果简单可视化

接下来一步就是要对训练模型结果进行简单可视化,毕竟文章里是要放图的!!!

{p1 <- plot(borutaConfirmed_rf_default, xlab = "", xaxt = "n")p2 <- ggplot(gene_importance, aes(x = reorder(symbol, importance), y = importance , fill=importance)) + #x、y轴定义;根据ONTOLOGY填充颜色geom_bar(stat="identity", width=0.8) +  #柱状图宽度scale_fill_continuous(low = '#8ECFC9', high = '#72B063')+  #柱状图填充颜色coord_flip() +  #让柱状图变为纵向xlab("") +  #x轴标签ylab("Importance") +  #y轴标签labs(title = "Boruta_analyse")+  #设置标题theme_bw() +theme(panel.grid = element_blank(),axis.text.x = element_text(family="Times", face = "bold", color="gray50", size = 14),axis.text.y = element_text(family="Times", face = "bold", color="black", size = 14),legend.title = element_text(family="Times", face = "bold", size = 15), # 图例标题大小legend.text = element_text(family="Times", face = "bold", size = 15), # 图例标签文字大小axis.title = element_text(family="Times", face = "bold", size = 15), # 坐标轴标题大小legend.position = "right",plot.title = element_text(family="Times", face = "bold", size = 15, hjust = 0.45), # 标题设置panel.background = element_rect(fill = "#f2f2f2") # 面板背景颜色)combined_plot <- plot_grid(p1, p2, ncol = 2, rel_heights = c(1, 4), align = 'v')}

结果如下图所示,左边的图就是在训练模型的时候不同mtry对用的预测准确性,可以直观的看出当mtry = 2的时候此时模型预测准确性最高,右边的图就是输出了用于构建模型那7个基因的重要性。

在这里插入图片描述



结语:

以上就是boruta算法筛选完关键基因后训练模型的所有过程,如果有什么需要补充或不懂的地方,大家可以私聊我或者在下方评论。

如果觉得本教程对你有所帮助,点赞关注不迷路!!!


  • 目录部分跳转链接:零基础入门生信数据分析——导读

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SQL Server】默认端口与自定义端口

目录 第4章&#xff1a;默认端口与自定义端口 SQL Server 默认端口号 更改 SQL Server 端口号 使用自定义端口的好处 示例&#xff1a;更改 SQL Server 端口为 1434 示例代码&#xff1a;更新连接字符串 安全注意事项 第4章&#xff1a;默认端口与自定义端口 SQL Serve…

只有4%知道的Linux,看了你也能上手Ubuntu桌面系统,Ubuntu简易设置,源更新,root密码,远程服务...

创作不易 只因热爱!! 热衷分享&#xff0c;一起成长! “你的鼓励就是我努力付出的动力” 最近常提的一句话&#xff0c;那就是“但行好事&#xff0c;莫问前程"! 与辉同行的董工说​&#xff1a;​守正出奇。坚持分享&#xff0c;坚持付出&#xff0c;坚持奉献&#xff0c…

深化理解电子商务领域的“二清”风险与合规路径

在电子商务的快速发展中&#xff0c;“二清”风险成为了不容忽视的话题。这一现象不仅触及金融监管红线&#xff0c;还潜藏诸多风险&#xff0c;包括资金安全、信息泄露、合规性挑战以及监管盲点。鉴于“二清”问题的复杂性与潜在危害&#xff0c;电商平台必须采取有效措施&…

NLB快速实现IPv4服务的负载均衡

阿里云网络型负载均衡NLB&#xff08;Network Load Balancer&#xff09;支持TCP、UDP和TCPSSL协议&#xff0c;提供了强大的四层负载均衡能力。 为了实现IPv4服务的负载均衡&#xff0c;需要快速创建一个NLB实例&#xff0c;并将来自客户端的访问请求转发至后端服务器。 操作…

AI-WEB-1.0 靶机

AI-WEB-1.0 一、安装靶机环境 下载地址&#xff1a; https://www.vulnhub.com/entry/ai-web-1,353/ 下载压缩文件打开 开启虚拟机 二、信息收集 1.查看NAT模式IP段 编辑–>虚拟网络编辑器 御剑2014查IP 找到ip之后就访问网站 用扫描目录的工具扫描当前网站的目录 访问…

MongoDB change stream 详解

文章目录 什么是 Chang Streams实现原理故障恢复使用场景Spring Boot整合Chang Stream 什么是 Chang Streams Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类…

职场进阶还是智商税?一文看六西格玛绿带培训的真面目

随着企业对精细化管理需求的日益增长&#xff0c;六西格玛绿带培训逐渐成为职场人士争相追逐的热门课程。它不仅能够帮助学员掌握先进的质量管理工具&#xff0c;还能培养逻辑思维、数据分析能力以及团队合作精神&#xff0c;这些都是现代职场不可或缺的软实力。 职场助力or智商…

ElasticSearch优化实战:打造高性能搜索引擎的秘籍

在当今这个大数据时代&#xff0c;信息的海量增长对搜索技术提出了前所未有的挑战。用户不仅需要快速准确地从数以亿计的数据中找到所需信息&#xff0c;还希望搜索引擎能够提供个性化和智能化的搜索体验。ElasticSearch作为市场上领先的搜索引擎&#xff0c;因其强大的全文搜索…

Spring框架和Maven项目搭建

Spring Spring框架是一个用于构建企业级应用程序的开源Java框架。它提供了一个全面的编程和配置模型&#xff0c;用于开发现代化的Java应用程序。 Spring从早期的大量XML配置逐渐演变为采用注解和自动配置的方式&#xff0c;显著减少了配置的工作量。同时&#xff0c;Maven的…

mysql更改密码后,若依 后端启动不了解决方案

我原先的mysql 密码是 数字字符串 我想改成000 纯数字 改完之后&#xff0c;连接的数据库的代码 也更改后 &#xff0c;后端启动不了 因为原先 密码数字字符串 不需要用引号" " 括起来 我改成纯数字 需要用 " " 括起来 如下图 然后就可以运行成功了

软件测试基础1--功能测试

1、什么是软件测试&#xff1f; 软件是控制计算机硬件运行的工具。 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求&#xff0c;为了发现软件功能和需求不相符合的地方&#xff0c;或者寻找实际输出和预期输出之间的差异。 软件测试的目的&#xff1a;减少软件缺陷…

C#用Socket实现TCP客户端

1、TCP客户端实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks;namespace PtLib.TcpClient {public delegate void Tcp…

CSS 的工作原理

我们已经学习了CSS的基础知识,它的用途以及如何编写简单的样式表。在本课中,我们将了解浏览器如何获取 CSS 和 HTML 并将其转换为网页。 先决条件:已安装基本软件,了解处理文件的基本知识以及 HTML 基础知识(学习 HTML 简介。目的:要了解浏览器如何解析 CSS 和 HTML 的基…

总线①I2C

很久以前就听说总线这个词了&#xff0c;一直不懂&#xff0c;所以觉得很牛叉。。。这次有机会学习&#xff0c;就干脆一起看看吧。 1 环境介绍 说实话&#xff0c;计算机的学习最好还是有个环境&#xff0c;裸学真的要难一些。这次搭的环境总的来说还是用之前的树莓派Pico搭配…

标题:组合式API:优化Vue代码结构的艺术

摘要&#xff1a; 在Vue 3中&#xff0c;引入了组合式API&#xff0c;它提供了一种新的方式来组织组件逻辑。虽然组合式API带来了更高的灵活性和可维护性&#xff0c;但开发者也面临着代码组织和可读性的挑战。本文将探讨如何有效地利用组合式API&#xff0c;优化Vue代码结构&a…

gpio的使用,---->使用sysfs 控制gpio(第二节)

目的&#xff1a; 在 linux 文件系统上使用 sysfs 来控制 &#xff0c;gpio的高低的变化。 逻辑&#xff1b;我只在 内核中是能 &#xff47;&#xff50;&#xff49;&#xff4f; 的&#xff50;&#xff49;&#xff4e;&#xff43;&#xff54;&#xff52;&#xff4…

FPGA开发——状态机的使用

一、概述 我们在使用FPGA进行开发的过程当中&#xff0c;实现一个东西用得最多的实现方法就是状态机的实现方法&#xff0c;用一句话总结就是万物皆可状态机&#xff0c;这和我们在学习Linux时常说的在Linux中万物都是文件差不多&#xff0c;这里就主要就是突出状态机的应用范…

使用模版完成不同数据类型的数组的选择排序

目录 6.模版(167-263) 6.1函数模板 6.1.1函数模版注意事项 6.1.2函数模版案例--选择排序 1. 比较排序的基本概念 2. 决策树 3. 决策树的深度 4. 结论 5.选择排序示例: 6.模版(167-263) (项目先跳过) 模板不能直接使用,它只是一个框架. 模板不是万能的. 6.1函数模板…

JNPF全新V5.0版本!重磅升级——APP篇

尊敬的JNPF用户们&#xff1a; 我们非常高兴地宣布&#xff0c;经过团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本&#xff01;这一版本的更新发布&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是…