大学网站建设方案,专注江苏网站建设,网站建设月流量,seo分析与优化实训心得零基础入门转录组数据分析——机器学习算法之xgboost#xff08;筛选特征基因#xff09; 目录 零基础入门转录组数据分析——机器学习算法之xgboost#xff08;筛选特征基因#xff09;1. xgboost基础知识2. xgboost#xff08;Rstudio#xff09;——代码实操2. 1 数据…零基础入门转录组数据分析——机器学习算法之xgboost筛选特征基因 目录 零基础入门转录组数据分析——机器学习算法之xgboost筛选特征基因1. xgboost基础知识2. xgboostRstudio——代码实操2. 1 数据处理2. 2 构建boruta模型2. 3 xgboost结果简单可视化 您首先需要了解本贴是完全免费按实际案例分享基础知识和全部代码希望能帮助到初学的各位更快入门但是 尊重创作和知识才会有不断高质量的内容输出 如果阅读到最后觉得本贴确实对自己有帮助希望广大学习者能够花点自己的小钱支持一下作者创作条件允许的话一杯奶茶钱即可感谢大家的支持~~~~~~ ^_^ !!!
祝大家能够开心学习轻松学习在学习的路上少一些坎坷~~~ 1. xgboost基础知识
1.1 xgboost是什么 XGBoosteXtreme 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. xgboostRstudio——代码实操
本项目以TCGA——肺腺癌为例展开分析
物种人类Homo sapiens
R版本4.2.2
R包tidyverseMatrixxgboostggplot2废话不多说代码如下
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) - symbolhub_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, eta0.3, objectivebinary:logistic, nround 25)构建完模型之后此时就可以从模型中提取变量的贡献度了
xgb_importance - xgb.importance(train_matrixDimnames[[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), yGain,fillFeature)) geom_bar(statidentity) theme_classic() guides(fillFALSE)#theme(legend.position )scale_fill_manual(valuesc(#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(size24,colorblack, face bold,familyTimes),axis.title.x element_text(size18,colorblack, face bold,familyTimes),axis.text.x element_text(size16, colorblack, face bold,familyTimes),axis.title.y element_blank(),axis.text.yelement_text(size16, colorblack,face bold,familyTimes),legend.titleelement_text(size20, colorblack, face bold,familyTimes),legend.textelement_text(size18, colorblack, face bold,familyTimes),titleelement_text(size20, colorblack, face bold,familyTimes),strip.text element_text(size 14,family Times, face bold))theme(panel.grid.majorelement_blank(),panel.grid.minorelement_blank())labs(xgene,yGain,fill)结果如下图所示横坐标为贡献度也可以叫成重要性纵坐标为基因柱子越高表明该基因越重要。 结语
以上就是xgboost算法筛选关键基因的所有过程如果有什么需要补充或不懂的地方大家可以私聊我或者在下方评论。
如果觉得本教程对你有所帮助点赞关注不迷路 目录部分跳转链接零基础入门生信数据分析——导读