零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)
零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)
目录
- 零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)
- 1. xgboost基础知识
- 2. xgboost(Rstudio)——代码实操
- 2. 1 数据处理
- 2. 2 构建boruta模型
- 2. 3 xgboost结果简单可视化
您首先需要了解本贴是完全免费按实际案例分享基础知识和全部代码,希望能帮助到初学的各位更快入门,但是 尊重创作和知识才会有不断高质量的内容输出 ,如果阅读到最后觉得本贴确实对自己有帮助,希望广大学习者能够花点自己的小钱支持一下作者创作(条件允许的话一杯奶茶钱即可),感谢大家的支持~~~~~~ ^_^ !!!
祝大家能够开心学习,轻松学习,在学习的路上少一些坎坷~~~
1. xgboost基础知识
1.1 xgboost是什么?
XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升(Gradient Boosting)框架的高效、灵活且广泛使用的机器学习算法,通过多次迭代后旨在找到最优预测模型。
1.2 xgboost的算法原理是什么?
XGBoost的核心思想是通过组合多个弱学习器(通常是决策树)来形成一个强学习器。在每一次迭代中,XGBoost都会基于当前模型的预测结果和真实值之间的差异(残差)来训练一个新的弱学习器,然后将这个新的弱学习器加入到已有的模型集合中,以期望能够减少整体的预测误差,从而找到一个最优模型。
1.3 xgboost的优势?
- 高效性: XGBoost在算法层面进行了多项优化,包括使用高效的树学习算法、支持并行和分布式计算、利用CPU缓存进行加速等,这使得它虽然需要经过多次迭代但是速度相对会很快
- 准确性: XGBoost通过引入二阶泰勒展开来近似目标函数,并使用正则化项来控制模型的复杂度,从而能够更准确地拟合数据,提高模型的预测精度。
- 灵活性: XGBoost支持多种类型的损失函数和弱学习器,同时也支持自定义评估函数,这使得它能够适应不同的机器学习任务。
- 鲁棒性: XGBoost通过加入正则化项和使用贪心算法进行节点分裂,来防止过拟合,提高模型的泛化能力
1.4 xgboost的缺点?
在特征选择的时候只能输出每个特征的重要性,无法自动筛选出关键特征,需要人为选择关键特征,给最终结果添加部分主观性。
1.5 xgboost筛选基因的本质是什么?
XGBoost在训练过程中会自动评估每个特征的重要性(重要性通常基于该特征在构建决策树时对模型性能提升的贡献程度),之后人为的手动筛选关键特征。
举个栗子: 有8个基因构建xgboost模型来预测患病的概率,算法结果会输出每个基因的重要性评分,这样就知道哪些基因对预测结果影响最大,之后就人为选择一些关键基因。
综上所述: xgboost先通过多次迭代达到最优模型,然后输出每个特征的重要性,这时就可以根据重要性排序去获取那些比较重要的特征。
2. xgboost(Rstudio)——代码实操
本项目以TCGA——肺腺癌为例展开分析
物种:人类(Homo sapiens)
R版本:4.2.2
R包:tidyverse,Matrix,xgboost,ggplot2
废话不多说,代码如下:
2. 1 数据处理
设置工作空间:
rm(list = ls()) # 删除工作空间中所有的对象
setwd('/XX/XX/XX') # 设置工作路径
if(!dir.exists('./12_xgboost')){dir.create('./12_xgboost')
}
setwd('./12_xgboost/')
加载包:
library(tidyverse)
library(Matrix)
library(xgboost)
library(ggplot2)
导入要分析的表达矩阵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)
train_data 如下图所示,行为基因名(symbol),列为样本名
导入分组信息表group
group <- read.csv("./data_group.csv", row.names = 1) # 为每个样本的分组信息(tumor和normal)
colnames(group) <- c('sample', 'group')
group 如下图所示,第一列sample为样本名,第二列为样本对应的分组 (分组为二分类变量:disease和control)
导入要筛选的基因hub_gene (8个基因)
hub_gene <- data.frame(symbol = gene <- c('ADAMTS2', 'ADAMTS4', 'AGRN', 'COL5A1', 'CTSB', 'FMOD', 'LAMB3', 'LAMB4'))
colnames(hub_gene) <- "symbol"
hub_gene 如下图所示,只有一列:8个基因的基因名
从全部的基因表达矩阵中取出这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'))
dat 如下图所示,行为基因名,前8列为基因对应的表达矩阵,第9列为合并的分组信息表
2. 2 构建boruta模型
前置准备:将前8列转换成matrix矩阵
# 将trainset的1-8列(自变量)转换为矩阵
traindata1 <- data.matrix(dat[, -9])
traindata1 如下图所示,和dat类似,区别就在于traindata1没有第9列分组信息,并且是个矩阵,不是数据框。
之后将traindata1转换成稀疏矩阵traindata2,这一步是为了进一步减少内存使用。
# 利用Matrix函数,将sparse参数设置为TRUE,转化为稀疏矩阵
traindata2 <- Matrix(traindata1, sparse = T)
指定dat的最后一列分组信息作为因变量,并转为数值型
# 将因变量转换为numeric类型,-1是为了从0开始计数
train_y <- as.numeric(dat[, 9])-1
将准备好的稀疏矩阵traindata2和因变量train_y打包成一个列表(这么做是为了方便后续用数据构建xgboost模型)
# 将自变量和因变量拼接为list
traindata <- list(data = traindata2, label = train_y)
将traindata列表里的表达矩阵traindata2和因变量train_y传入到xgb.DMatrix函数中转换成一个DMatrix对象(这个对象是xgboost算法内部用于存储数据和标签的优化格式,可以提高计算效率)
dtrain <- xgb.DMatrix(data = traindata$data, label = traindata$label)
之后就是构建xgboost模型
- data = dtrain —— 这个参数指定了要训练的数据,传入的应该是个DMatrix对象
- max_depth = 5 ——这个参数定义了树的最大深度,增加这个值会使模型更加复杂,可以关注到更多细节,但同时也会导致过拟合。
- eta = 0.3 ——这个参数通常被称为学习率/收缩率。它控制了在每一步中如何更新权重,从而减少每次迭代对模型的影响。较小的eta值就意味着更小的权重更新,可以使模型训练变慢,从而得到更好的结果和更好的泛化能力。
- objective = ‘binary:logistic’ ——这个参数指定了学习任务的类型和相应的损失函数。binary:logistic表明是一个二分类问题,并且使用的是逻辑回归损失函数。xgboost算法支持很多不同的objective,适用于不同的情况,具体在这里不展开介绍,感兴趣的小伙伴可以自行查询函数帮助。
- nround = 25 —— 这个参数指定了迭代次数,数值越大迭代次数越多,会使模型变得更复杂,同时也会增加过拟合风险和训练时间。
res.xgb <- xgboost(data = dtrain, max_depth = 5, eta=0.3, objective='binary:logistic', nround = 25)
构建完模型之后此时就可以从模型中提取变量的贡献度了
xgb_importance <- xgb.importance(train_matrix@Dimnames[[2]], model = res.xgb) ##特征重要度
xgb_importance 如下图所示
- Feature——这一列就是基因的名称
- Gain——这一列表示每个特征在模型构建过程中平均增益的贡献,较高的增益值意味着该特征对于提升模型预测性能有更大的作用(重要) 。
- Cover——这一列可以理解成平均覆盖度(不需要关注)
- Frequency——这一列表示每个特征在树的构建过程中被用作分裂节点的频率,简单来说,值越大表明频率越高,也说明该特征在模型中被频繁使用,同样的对模型的预测能力有重要的贡献。(不需要关注)
接下来从构建好的xgboost模型中提取出最重要的5个基因并输出
## 结果
hub_gene <- xgb_importance[c(1 : 5), ]
hub_gene$Feature <- gsub('.','-',hub_gene$Feature,fixed = T )
write.csv(hub_gene, '01.hub_gene.csv')
write.csv(xgb_importance, '02.xgb_importance.csv')
2. 3 xgboost结果简单可视化
接下来一步就是要对xgboost结果进行简单可视化,毕竟文章里是要放图的,并且图片展现的效果会更好!!!
# xgboost结果简单可视化(ggplot2函数)
ggplot(xgb_importance, aes(x= reorder( Feature,Gain), y=Gain,fill=Feature)) +geom_bar(stat="identity") +theme_classic() +guides(fill=FALSE)+#theme(legend.position = )+scale_fill_manual(values=c("#8DD3C7","#FFFFB3","#BEBADA","#FB8072","#80B1D3","#FDB462","#B3DE69","#FCCDE5","#D9D9D9","#BC80BD","#CCEBC5","#FFED6F","#377EB8","#100EB2","#FDB999"))+coord_flip()+theme_bw()+ggtitle('XGBoost')+theme(plot.title = element_text(size=24,color='black', face = "bold",family='Times'),axis.title.x =element_text(size=18,color='black', face = "bold",family='Times'),axis.text.x =element_text(size=16, color='black', face = "bold",family='Times'),axis.title.y =element_blank(),axis.text.y=element_text(size=16, color='black',face = "bold",family='Times'),legend.title=element_text(size=20, color='black', face = "bold",family='Times'),legend.text=element_text(size=18, color='black', face = "bold",family='Times'),title=element_text(size=20, color='black', face = "bold",family='Times'),strip.text = element_text(size = 14,family = "Times", face = "bold"))+theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())+labs(x="gene",y="Gain",fill="")
结果如下图所示横坐标为贡献度(也可以叫成重要性),纵坐标为基因,柱子越高表明该基因越重要。
结语:
以上就是xgboost算法筛选关键基因的所有过程,如果有什么需要补充或不懂的地方,大家可以私聊我或者在下方评论。
如果觉得本教程对你有所帮助,点赞关注不迷路!!!
- 目录部分跳转链接:零基础入门生信数据分析——导读
相关文章:

零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)
零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因) 目录 零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)1. xgboost基础知识2. xgboost(Rstudio)——代码实操2. 1 数据…...

C#开发常见面试题三(浅复制和深复制的区别)
C#开发常见面试题三(浅复制和深复制的区别) 一.浅复制和深复制定义 (1)浅复制:复制一个对象的时候,仅仅复制原始对象中所有的非静态类型成员和所有的引用类型成员的引用。(新对象和原对象将共享所有引用类型成员的实…...

Linux/C 高级——Linux命令
从这里开始,我们展开对Linux/c 高级的学习,首先介绍的是在Linux/c高级中,Linux的部分 目录 1.Linux简介 1.1Linux起源 1.2查看系统版本命令 1.3分层结构 1.4系统关机重启命令 2.Linux安装工具 2.1软件包安装 2.1.1软件包的管理机制 …...
怎么在 tailwindcss 项目中自定义一些可复用的样式
在 Tailwind CSS 项目中自定义可复用的样式有几种常用方法: 使用 apply 指令 你可以在 CSS 文件中使用 apply 指令来创建可复用的样式类: layer components {.btn-primary {apply py-2 px-4 bg-blue-500 text-white font-semibold rounded-lg shadow-md hover:bg-blue-700 f…...
在vue3中 引入echarts
安装:npm install echarts --save 方式一:直接在组件中引用 <template><divref"myChart"id"myChart":style"{ width: 800px, height: 400px }"></div></template><script>import * as echa…...

栈和队列(数据结构)
1. 栈(Stack) 1.1 概念 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原…...

如何实现ElementUI表单项label的文字提示?
在Vue和ElementUI的丰富组件库中,定制化表单是常见的需求之一。那么如何在表单项label后添加文字提示,以提升用户体验呢? 首先我们来看一下效果图: 这里我们鼠标移动到❓图标上就会出现提示 在 ElementUI 中,el-form-item 组件允许使用 slot 自定义 label。通过在 el-fo…...
c++中的标准库
前言 hello,我是文宇。 正文 C标准库是C编程语言的基本组成部分之一,它为开发人员提供了一套丰富和强大的工具和功能,以便快速开发高效、可靠和可移植的应用程序。C标准库由两个主要部分组成:STL(Standard Template…...

洛谷 B2145 digit 函数 B2146 Hermite 多项式 题解
题目目录: No.1 B2145 digit 函数 No.2 B2146 Hermite 多项式 OK,开始正文! 第一题:B2145 digit 函数 题目描述 在程序中定义一函数 digit(n,k),它能分离出整数 n 从右边数第 k 个数字。 输入格式 正整数 n …...
tailwindcss @apply 和 @layer 有什么区别
在 Tailwind CSS 中,apply 和 layer 是两个不同的指令,它们各自有不同的用途和功能。以下是它们的区别和使用方法: apply 指令 apply 指令用于将一组现有的 Tailwind CSS 工具类应用到一个自定义的 CSS 类中。这对于简化和复用复杂的样式非…...
React 中的 useMemo 和 useCallback
1. useMemo语法 const memoizedValue useMemo(() > computeExpensiveValue(a, b), deps); 1. 传入一个函数进去,会返回一个 memoized 值,需要注意的是,函数内必须有返回值; 2. 第二个参数会依赖值,当依赖值更新…...

idea社区版lombok总是突然失效:log未知的变量
用maven打包运行就没问题,就是idea的原因 有这么个参数 -Djps.track.ap.dependenciesfalse 是用来配置 IntelliJ IDEA 的 JVM 参数,它控制着 IntelliJ IDEA 是否跟踪处理器相关的依赖关系。具体来说,-Djps.track.ap.dependenciesfalse 参数的…...

Java语言程序设计基础篇_编程练习题*16.13(比较不同利率的贷款)
目录 题目:*16.13(比较不同利率的贷款) 习题思路 代码示例 结果展示 题目:*16.13(比较不同利率的贷款) 改写编程练习题5.21,创建一个图形用户界面,如图16-41b所示。程序应该允许…...

正点原子imx6ull-mini-Linux驱动之Regmap API 实验
我们在前面学习 I2C 和 SPI 驱动的时候,针对 I2C 和 SPI 设备寄存器的操作都是通过相关 的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质 上都是对寄存器的操作,所以为了方便内核开发人员统一访问 I2C…...
postgresql 双重排序后 重复项 标识次序
postgresql 双重排序后 重复项 标识次序 在PostgreSQL中,如果你想要在双重排序后标识重复项的次序,可以使用窗口函数(window functions)。一个常见的方法是使用ROW_NUMBER()窗口函数,它会为每个分组内的行分配一个唯一…...

线程池ThreadPoolExecutor使用
文章目录 一、基础-Java中线程创建的方式1.1、继承Thread类创建线程1.2、实现Runnable接口创建线程1.3、实现Calable接口创建线程1.4、使用线程池创建线程二、概念-线程池基本概念2.1、并发和井行的主要区别2.1.1、处理任务不同2.1.2、存在不同2.1.3、CPU资源不同2.2、什么是线…...

Codeforces Round 963 (Div. 2)
A题:Question Marks 题目: Tim正在做一个由 4n 个问题组成的测试,每个问题都有 4 个选项:“A”、“B”、“C”和“D”。对于每个选项,有 n 个正确答案对应于该选项,这意味着有 n 个问题的答案为“A”。 n…...
Mysql函数学习笔记
MySQL 字符串函数 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码。 //返回 CustomerName 字段第一个字母的 ASCII 码 SELECT ASCII(CustomerName) AS NumCodeOfFirstChar FROM Customers;CHAR_LENGTH(s)-返回字符串 s 的字符数 //返回字符串 RUNOOB 的字符数 SELECT CHAR…...

【Linux基础】Linux基本指令(一)
目录 前言1, ls指令2,pwd指令三,cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径 四,创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五,删除目录或文件5.1 rmdir指令5.2 rm 指令 前言 从本章开始࿰…...

全球视野:航空蓄电池的国际标准与技术创新
航空蓄电池是一种专门为满足航空工业独特要求而设计的高性能储能设备。由于航空环境的特殊性,如高海拔、极端温度变化、频繁的充放电需求、以及对于设备重量和体积的严格限制,航空蓄电池需要具备一系列高级特性以确保飞机在各种飞行条件下能够安全有效地…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...