零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)

news2024/9/17 9:18:41

零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)

目录

  • 零基础入门转录组数据分析——机器学习算法之SVM-RFE(筛选特征基因)
    • 1. SVM-RFE基础知识
    • 2. SVM-RFE(Rstudio)——代码实操
      • 2. 1 数据处理
      • 2. 2 构建SVM-RFE模型
      • 2. 3 SVM-RFE结果简单可视化
    • 注:配套资源只要改个路径就能运行,本人已检测过可以跑通,请放心食用,食用过程遇到问题,可先自行百度,实在解决不了可以私信



1. SVM-RFE基础知识

1.1 SVM是什么?
SVM(Support Vector Machine)算法是一种常见的监督学习算法,用于进行二分类或多分类任务。其主要思想是找到一个最优的组合,将不同类别的样本分隔开

1.2 RFE是什么?
RFE(Recursive Feature Elimination)算法是一种常用的特征选择方法,其通过逐步迭代,训练模型并剔除最不重要的特征,然后再次训练模型,直到达到指定的特征数量或达到某个性能指标。

1.3 SVM-RFE是什么?
SVM-RFE算法是SVM和RFE算法的结合,通过SVM模型进行特征的重要性评估,并利用RFE的迭代过程逐步剔除不重要的特征。

1.4 SVM-RFE原理?
SVM-RFE算法基于SVM的最大间隔原理,通过模型训练样本,对每个特征进行得分排序,之后利用RFE算法逐步迭代的方式:去掉最小特征得分的特征,然后用剩余的特征再次训练模型,进行下一次迭代,最后选出最优的特征组合。

1.5 SVM-RFE的优势?

  • 结合两种算法的优点: SVM算法主要关注于分类任务,通过寻找最优组合来实现不同类别样本的分离,但它本身并不具备特征选择的能力,而RFE算法则会迭代剔除不重要的特征,这样就能够在模型训练的同时进行特征选择,从而选出对分类结果最有影响的特征子集
  • 考虑特征之间的关联: 在每一轮迭代中,都会重新计算特征的权重,这样可以更好地考虑特征之间的关联关系,避免特征选择过程中的信息丢失。
  • 提高模型泛化能力: 通过剔除不重要的特征,SVM-RFE算法能够减少特征空间的维度,降低模型的复杂性,从而提高模型的泛化能力。
    -提高模型可解释能力: 筛选出的特征子集往往具有更好的可解释性,因为它们是数据中最具代表性的特征组合,同时算法会自动计算特征重要性并进行迭代,这样就减少了人为选择变量的可能性。

1.6 SVM-RFE的本质是什么?
筛选出一些关键特征,这些关键特征相对于其他特征来说,区分样本的能力更加精确。

举个栗子: 输入了8个基因的表达矩阵,此时基于这8个基因构建模型去观测模型对与样本的区分能力,发现区分准确性为80%,之后通过迭代的方式逐一剔除相对不重要的基因,最后发现剔除3个“不重要”基因后剩余5个基因构建的模型区分样本的准确性为95%(最高),那么此时认为这5个基因组合而成的模型为最优模型,这5个基因就作为对分类结果最有影响的特征子集被输出了。

综上所述: SVM-RFE就是一种用来筛选 关键特征 的方法(其结合了SVM算法的优点,同时也结合了RFE算法的优点),这个关键特征可以是临床指标,也可以是重要基因等,并且在关键特征选择的时候避免了人为的选择(算法自动迭代),输出基因重要性提高了可解释性。



2. SVM-RFE(Rstudio)——代码实操

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

废话不多说,代码如下:

2. 1 数据处理

设置工作空间:

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

加载包:

library(tidyverse)
library(caret)
library(ggplot2)
library(cowplot)
library(ggplotify)

导入要分析的表达矩阵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 构建SVM-RFE模型

构建SVM-RFE模型:
(1)使用rfeControl函数来设置递归特征消除过程中的交叉验证(CV)参数。这里指定了使用caretFuncs(一系列预定义的训练和预测函数,包括错误率等评估指标)作为评估函数,使用cv(交叉验证)作为方法,并设置交叉验证的次数为10次(number = 10)。

(2)执行递归特征消除 (rfe)算法构建模型rfe函数常用参数介绍如下

  • x参数——是要输入的基因表达矩阵(也称为特征或自变量)
  • y 参数——这是要区分的目标变量。这里指向的是dat$group,根据前面得知这里是二分类变量分组——disease和control
  • sizes参数——这个参数指定了特征子集(要分析的范围),这里用c(1 : num)表示从1个特征到所有特征(除了最后一列)的所有可能组合都将被评估。
  • rfeControl参数——这个参数传递了之前定义的交叉验证控制参数。
  • method 参数——这个参数指定了用于评估特征子集性能的机器学习算法,这里是使用svmRadial方法——是使用支持向量机作为底层分类器,并且该SVM使用的是径向基函数核 (关于这个方法的介绍在这里不做展开介绍,感兴趣的小伙伴可以自行检索下)

构建SVM-RFE模型中比较关注的参数就是上述的这些,当然还有其他参数,如果想深入了解可自行查看官方说明文档

set.seed(21) # 设置种子
control <- rfeControl(functions = caretFuncs, method = "cv", number = 10) # cv 交叉验证次数10
# 执行SVM-RFE算法
num <- ncol(dat)-1
results <- rfe(x = dat[, 1:num], # 除去最后一列,其余列均为预测变量(也就是hubgene的表达量)
               y = dat$group, # 分组信息
               sizes = c(1:num), 
               rfeControl = control,
               method = "svmRadial"
)

注:在构建模型的时候切记要设置种子(设置随机种子是为了确保结果的可重复性。由于交叉验证涉及随机分割数据,因此设置种子可以确保每次运行代码时,数据的分割方式都是相同的,从而得到相同的模型结果)

注2:这一步在构建模型的时候花费的时间会比较长,属于正常情况!

接下来从构建的最优模型中提取出最优模型组合,并保存关键基因

## 结果分析
svmrfe_result <- data.frame(symbol = predictors(results)) ## 7个基因

write.csv(svmrfe_result, file = 'svm_rfe_gene.csv')

svmrfe_result中就对应着最优模型组合中的基因,如下图所示,可以看到只有7个基因,有个基因被剔除了,这7个基因就被认为是更加重要的特征基因。
在这里插入图片描述

2. 3 SVM-RFE结果简单可视化

接下来一步就是要对SVM-RFE结果进行简单可视化,毕竟文章里是要放图的,并且图片展现的效果会更好!!!

# SVM-RFE结果简单可视化
p1 <- plot(results, type=c("o"),
           xgap.axis = 1)
p1 <- as.ggplot(plot_grid(p1))+
  labs(title="SVM_RFE_analyse", x="", y = "",size=25) +
  # theme_bw()+
  theme(plot.title = element_text(hjust =0.5,colour="black",face="bold",size=25),
        axis.text.x = element_blank(), 
        axis.text.y = element_blank(), 
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        legend.text = element_blank(),
        legend.title = element_blank(),
        legend.position = "none",
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank())
p1

SVM-RFE结果如下图所示,横坐标为变量对应的数目(这里指的是基因数目),纵坐标为区分样本的准确性,可以看到当所有基因都存在的时候(最右侧的点)区分准确度为0.96,剔除掉一个相对不重要的基因后区分准确度最高,之后再剔除基因就会导致模型区分准确度下降。
在这里插入图片描述



结语:

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

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


与教程配套的原始数据+代码+处理好的数据见配套资源

注:配套资源只要改个路径就能运行,本人已检测过可以跑通,请放心食用,食用过程遇到问题,可先自行百度,实在解决不了可以私信


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

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

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

相关文章

从零到一:用Go语言构建你的第一个Web服务

使用Go语言从零开始搭建一个Web服务&#xff0c;包括环境搭建、路由处理、中间件使用、JSON和表单数据处理等关键步骤&#xff0c;提供丰富的代码示例。 关注TechLead&#xff0c;复旦博士&#xff0c;分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、…

【Git-驯化】一文搞懂git中rm命令的使用技巧

【Git-驯化】一文搞懂git中rm命令的使用技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#xff1a;微信公…

Day12--Servlet实现前后端交互(案例:学生信息管理系统登录页面)

&#xff08;在一个完整的项目架构中&#xff0c;servlet的角色和位置&#xff09; Servlet、GenericServlet和HttpServlet三者之间的关系是Java Web开发中的一个重要概念&#xff0c;它们共同构成了基于Java的服务器端程序的基础。以下是具体分析&#xff1a; 1. Servlet接口…

Windows下nmap命令及Zenmap工具的使用方法

一、Nmap简介 nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端&#xff0c;并且推断计算机运行哪个操作系统&#xff08;这是亦称 fingerprinting&#xff09;。它是网络管理员必用的软件之一&#xff0c;以及用以评…

算法-DFS-树形DP

题目一 解题思路 比较标准的深搜&#xff0c;难点主要在题目的理解&#xff0c;通俗的说就是要找到一个树结构中的点&#xff0c;使之在去掉该点后剩余数的结构最均等&#xff08;剩余连接节点的最大值最小&#xff09;。 无向图邻接表 使用代码实现需要一个数组存储数值、一…

速看!2024年5月软考通过率解析

根据湖南省工业和信息化厅最新发布的《2024年上半年软考湖南考区工作总结报告》及《考试安全顺利完成的通报》&#xff0c;我们了解到湖南地区在2024年上半年度的软件与信息技术专业人才考试&#xff08;简称“软考”&#xff09;中&#xff0c;报名人数达到了13,762人&#xf…

无人机1公里WiFi图传遥控模组,飞睿智能无延迟传输方案,高效稳定告别卡顿

在信息众多的时代&#xff0c;我们享受着科技带来的便利&#xff0c;同时也期待着更多前沿技术的出现。今天&#xff0c;就让我们一起走进一个充满神秘与可能性的领域——飞睿智能1公里WiFi图传遥控模组。这个看似简单的设备&#xff0c;却蕴含着巨大的能量&#xff0c;它正在悄…

深度学习-感知机

目录 感知机训练感知机感知机模型感知机学习算法 收敛定理XOR问题总结 多层感知机学习XOR隐藏层单隐藏层---单分类激活函数Sigmoid激活函数Tanh 激活函数ReLU 激活函数 多类分类---单隐藏层多类分类---多隐藏层总结 多层感知机从零开始多层感知机的简洁实现总结 感知机 给定输…

智慧通信|IEEE Trans. Commun. 论文解读:延迟敏感的能量收集无线传感器的最佳调度、结构特性和近似分析

原文信息 Sharma, Nikhilesh, Nicholas Mastronarde, and Jacob Chakareski. “Delay-sensitive energy-harvesting wireless sensors: Optimal scheduling, structural properties, and approximation analysis.” IEEE Transactions on Communications 68.4 (2019): 2509-25…

OZON如何查询销量,OZON查销量哪里可以看

在竞争激烈的电商市场中&#xff0c;了解商品销量是每位卖家优化销售策略、提升竞争力的关键。作为俄罗斯领先的跨境电商平台&#xff0c;Ozon为卖家提供了丰富的数据支持&#xff0c;帮助卖家更好地掌握市场动态。然而&#xff0c;对于新手卖家来说&#xff0c;如何在Ozon上查…

1、爬⾍概述

1. 什么是爬虫&#xff1f; 爬虫&#xff08;Web Crawler&#xff09;是一种通过编写程序自动访问并提取互联网上数据的技术。爬虫可以帮助我们在浏览网页时自动收集和保存一些有用的数据&#xff0c;例如图片、视频和文本信息。简单来说&#xff0c;爬虫就是自动化的浏览器。…

InsightFace 人脸识别算法实现过程解析

最近研究了一下人脸识别算法&#xff0c;初步实现了基础的人脸识别。 源码github下载地址&#xff1a;insightface 第一步 解压源码配置环境 1、使用conda虚拟环境创建insightface环境 conda create -n insightface python3.8创建环境完成后&#xff0c;激活环境 conda ac…

手把手教你如何在宝塔上添加可道云登录页面的ICP备案信息,别跟权威开玩笑。

如何在宝塔上添加可道云登录页面的ICP备案信息 事情的原由来我们开始吧首先登录你的宝塔页面双击打开index.php文件保存退出即可 感谢大佬&#xff0c;希望对被查到的朋友有所帮助&#xff01; 事情的原由 今天突然收到腾讯云发来的一封Email&#xff0c;说我需要整改我的网站…

如何在职场上生存,送你3条秘技

洞悉本质才能方向明确&#xff0c;掌握方法才能事半功倍。 下面这3条职场生存的秘技&#xff0c;都是“过来人”的经验之谈&#xff0c;不管在哪里工作&#xff0c;都能管中窥豹、可见一斑&#xff0c;实在是值得深刻领悟。 01 你和领导的本质关系是工作关系 你有价值&#xff…

嵌入式开发服务器与客户端交互 日志2024/7/31

嵌入式开发服务器与客户端交互 客户端 网页 操作 请求相关代码: 这里为了适配 低版本浏览器 用的不是fetch 当然用fetch更好 var curUlr window.location.href; //获取当前网页地址var newURL curUlr.lastIndexOf("/");//截取到最后一个斜杠索引var pathUrl…

Python:如何实现对表格的自动化

前情提要&#xff1a;需要有openpyxl哦 如果没有请参考上一篇文章 http://t.csdnimg.cn/fjbLJ 先介绍一下对表格的基本操作 首先创立一个 transactions.xlsx 基本操作&#xff1a;获取表格&#xff0c;获取值 import openpyxl as xl # 这个as 单纯简化 相当于别名 wbxl.load_…

02 I/O多路复用---进程的聊天

服务器同时和很多客户端连在一起 管道的read&#xff0c;总是能读出来

mysql逻辑架构与sql执行过程

目录 1.背景 2.mysql逻辑架构图 3.逻辑架构解读 第一层:连接层 第二层:服务层 1.Management Serveices & Utilities 2.SQL Interface:SQL接口 3.Parser:解析器 4.Optimizer:查询优化器 5.Caches 和 Buffers:查询缓存组件 第三层:存储引擎层 第四层:数据存储层 …

【数据结构初阶】千字文章带你征服 “ 双向链表 ”(附源码)

hi&#xff0c;bro&#xff01;又见面啦 目录 前言&#xff1a; 一、链表的分类 二、双向链表 1、 概念与结构 2、 双向链表的实现 2.1 定义双向链表的结构 2.2 初始化 2.3 尾插 2.4 头插 2.5 打印 2.6 尾删 2.7 头删 2.8 查找 2.9 在pos结点之后插入…

实验室责任人员管理保障实训系统安全

在智慧校园的实训管理生态中&#xff0c;实验室责任人员的角色犹如精密机器中的关键齿轮&#xff0c;他们不仅是实验室安全与高效运转的守护者&#xff0c;更是实训教学质量的直接塑造者。这一角色的重要性&#xff0c;在智慧校园的数字化转型中得到了前所未有的凸显&#xff0…