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

零基础入门转录组数据分析——机器学习算法之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.rhkb.cn/news/389814.html

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

相关文章

VS Code C/C++ MSVC编译器

官方教程 通过快捷方式打开VS Code是编译不了的,需要对tasks.json修改(Tasks: Configure default build task) 先创建tasks.json 复制这段配置到tasks.json,记得修改VsDevCmd.bat的路径 {"version": "2.0.0","windows": {"options"…

Gradle 统一管理依赖

BOM 介绍 BOM 是 Bill of Material 的简写&#xff0c;表示物料清单。BOM 使我们在使用 Maven 或 Gradle 构建项目时对于依赖版本的统一变得更加规范&#xff0c;升级依赖版本更容易。 比如我们使用 SpringBoot 和 SpringCloud 做项目时&#xff0c;可以使用他们发布的 BOM …

ARM 离线安装k8s + harbor私有镜像库(麒麟)

目录 1.1 K8S 服务集群安装部署 1.1.1 主机配置说明 1.1.2 主机名称、host配置 1.1.3 防火墙配置 1.1.4 关闭selinux 1.1.5 配置内核转发及网桥过滤 1.1.6 关闭SWAP分区 1.1.7 安装ipset及ipvsadm 1.1.8 时间同步(麒麟系统自带了chronyd) 1.1.9 docker安装 1.1.10 …

用户画像系列——Spark任务调优实践

在画像标签的加工和写入hbase中&#xff0c;我们采用了spark来快速进行处理和写入。但是在实际线上运行的过程中&#xff0c;仍然遇到了不少问题&#xff0c;下面来总结下遇到的一些问题 1.数据倾斜问题 其实spark 数据倾斜思路和hive、mapreduce 数据倾斜思路处理类似&…

ELK对业务日志进行收集

ELK对业务日志进行收集 下载httpd 进到文件设置收集httpd的文件进行 设置 编辑内容 用于收集日志的内容 将日志的内容发送到实例当中 input {file{path > /etc/httpd/logs/access_logtype > "access"start_position > "beginning"}file{path &g…

基于SpringCloud alibaba的流媒体视频点播平台

基于SpringCloud alibaba的流媒体视频点播平台 前言整体架构具体实现视频播放 总结 先把项目地址放这 》基于SpringCloud alibaba的流媒体视频点播平台《 然后咱们来看看这个项目是干啥的。 前言 今天和大家分享一个项目&#xff0c;基于SpringCloud alibaba的流媒体视频点…

嵌入式单片机中在线调试工具使用方法

大家好,相信很多小伙伴都听说过,或者用过SystemView这款工具。 它是一个可以在线调试嵌入式系统的工具,它可以分析RTOS有哪些中断、任务执行了,以及这些中断、任务执行的先后关系。 还可以查看一些内核对象持有和释放的时间点,比如信号量、互斥量、事件、消息队列等,这在…

紫辉创投开启Destiny of Gods首轮投资,伯乐与千里马的故事仍在继续

近日&#xff0c;上海紫辉创业投资有限公司&#xff08;以下简称“紫辉创投”&#xff09;宣布开启GameFi链游聚合平台Destiny of Gods首轮投资500,000美金&#xff0c;并与其达成全面战略及业务层合作&#xff0c;双方将协同布局链上生态&#xff0c;共同推动链游行业健康发展…

开发板与ubuntu不能ping通怎么办?

TOC 第一步&#xff1a;VMware 设置 打开 VMware Workstation Pro 里的 虚拟机 -> 设置 设置网络适配器为桥接模式。这里不要勾选“复制物理网络连接状态”。 因为电脑是 WiFi 上网&#xff0c;所以需要添加一个网络适配器并设置成 NAT 模式&#xff0c;供虚拟机上网。具…

C#:枚举及位标志周边知识详解(小白入门)

文章目录 枚举为什么要有枚举?枚举的性质设置默认类型和显式设置成员的值 位标志(重要)位标记是什么及作用位标志周边知识HasFlag判断是否有该功能枚举前面加Flags的好处 关于枚举的更多知识using static简化代码获取枚举成员的字面量 枚举 为什么要有枚举? 为了增加代码的…

ComfyUI 实战教程:一键扩图

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 本文给大家分享一个很有用的技术&#xff1a;AI扩图。所谓扩图就是扩展图像的边界&#xff0c;在图像的边界外新增更多画面元素&#xff0c;这不仅仅是扩大图像的尺寸&#xff0c;还要让新添加的部分与原有图像的内…

xss漏洞(二,xss入靶场搭建以及简单利用)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一&#xff0c;环境搭建。 使用工具&#xff1a;PHP study&#xff0c;dvwa靶场。 1&#xff0c;GitHub上下载dvwa到PHP study的WWW文件夹内&#xff0c;并解压。 dvwa下载地址 …

区块链核心概念与技术架构简介

引言 区块链&#xff0c;一种分布式账本技术&#xff0c;不仅为数字货币提供了基础设施&#xff0c;更在金融、供应链、物联网等多个领域展现出广泛的应用前景。区块链技术被认为是继蒸汽机、电力、互联网之后&#xff0c;下一代颠覆性的核心技术。 如果说蒸汽机释放了人们的…

[网鼎杯 2020 青龙组]AreUSerialz1

打开题目 熟悉的php&#xff0c;代码审计 可知这是一题反序列化类型的题目。 按照常规方法&#xff0c;首先&#xff0c;我们先将代码复制到本地进行序列化构造&#xff0c; 根据代码逻辑分析&#xff0c;咱们可知 function __construct() { $op "1"…

深入理解操作系统--绪论

文章目录 概述操作系统的基本概念多用户系统用户和组进程 小结 概述 最近在读操作系统&#xff0c;发现一些新的概念。写出来&#xff0c;让自己印象更深&#xff0c;希望也帮助一些不懂的朋友&#xff1b;但愿有所帮助吧。 操作系统的基本概念 计算机都包含操作系统的基本程…

Docker 安装 GitLab教程

本章教程,主要介绍如何在Docker 中安装GitLab。 GitLab 是一个开源的 DevOps 平台,提供了一整套工具,用于软件开发生命周期的各个阶段,从代码管理到 CI/CD(持续集成和持续交付/部署),再到监控和安全分析。 一、拉取镜像 docker pull gitlab/gitlab-ce:latest二、创建 G…

Photoshop 运行时常见问题及修复

安装完成后无法运行 出现“由于找不到 MSVCP140.dll&#xff0c;无法继续执行代码。重新安装程序可能会解决此问题。”等问题时&#xff0c;可以从网上搜索 Microsoft Visual C 运行库&#xff0c;下载并安装&#xff0c;一般可解决问题。 暂存盘不够的问题 软件在运算过程中会…

UE5 敌人血条

这样处理就完毕&#xff0c;然后 User Widget 尽可能分成多个进行处理

vue2-级联选择器

级联选择器 一、市面上的级联选择器二、功能实现1、数据类型2、隐藏下拉框的方法3、html结构4、CSS代码5、各个方法代码 三、实现样式截图1、一级菜单1、鼠标放到一级菜单&#xff0c;就显示二级菜单2、鼠标点击一级菜单的时候 2、二级菜单1、鼠标放到二级菜单的时候&#xff0…

Java中的二叉搜索树(如果想知道Java中有关二叉搜索树的知识点,那么只看这一篇就足够了!)

前言&#xff1a;Java 提供了丰富的数据结构来处理和管理数据&#xff0c;其中 TreeSet 和 TreeMap 是基于红黑树实现的集合和映射接口。它们有序地存储数据&#xff0c;提供高效的搜索、插入和删除操作。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…