社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

很容易解释的单细胞机器学习分类树

生信技能树 • 2 年前 • 489 次点击  

前面我们演示了 一个完美的单细胞亚群随机森林分离器是如何炼成的,以及 LASSO回归也可以用来做单细胞分类 的两个机器学习算法可以用来做单细胞分类器,而且效果杠杠的。而且也尝试了多种机器学习的算法,比如:不输于LASSO的SVM单细胞分类器

无论是随机森林,LASSO回归,还是支持向量机, 他们的模型都是有点抽象,不容易直观的可视化解释清楚。但是接下来我们要介绍的决策树模型,就不一样。

训练决策树模型

首先,复制粘贴前面的 一个完美的单细胞亚群随机森林分离器是如何炼成的 ,就可以把单细胞表达量矩阵划分为训练集和测试集,然后简单的安装和加载 rpart 包,运行里面的 rpart 函数即可:


library('rpart.plot')
library('rpart')
library('survival')

df = cbind(target=target,as.data.frame(predictor_data))
head(colnames(df)) 
multivariate 1],collapse = '-'
s 'target ~ ', multivariate )
# as.formula(s) 
fit              data=df, method="class" ) 

summary(fit)  
save(fit,file = 'rpart_output.Rdata')

可以看到,我们输入的表达量矩阵是 2000 个基因在接近 2000个细胞里面的表达量信息:

>  dim(predictor_data)
[1] 1977 2000
> predictor_data[1:4,1:4]
                    ISG15     CPSF3L     MRPL20      ATAD3C
AAACATACAACCAC -0.8353028 -0.2741145  1.5056616 -0.04970561
AAACATTGAGCTAC -0.8353028 -0.2741145 -0.5625993 -0.04970561
AAACATTGATCAGC  0.3922351 -0.2741145  1.2450489 -0.04970561
AAACCGTGCTTCCG  2.2197621 -0.2741145 -0.5625993 -0.04970561

我们的决策树模型就是把这2000个基因组合一下,来划分细胞的分类。我们简单的可视化一下这个效果:


library(rpart.plot);  
rpart.plot(fit, branch=1, branch.type=2, type=2, extra=102,  
           shadow.col="gray", box.col="green",  
           border.col="blue", split.col="red",  
           split.cex=1.2 )

如下所示,虽然是有6个单细胞亚群,但是只需要5个基因就足以区分它们了 :

5个基因就足以区分它们了

在测试集看模型效果

同样的,训练好的模型,也需要在另外一个数据集看看效果:

test_outputs = predict(fit, as.data.frame(test_expr))
head( test_outputs ) 
pred_y = colnames(test_outputs)[apply(test_outputs, 1, which.max)]
pred_y = factor(pred_y,levels = levels(test_y))


pdf('rpart-performance.pdf',width = 10)
gplots::balloonplot(table(pred_y,test_y))
dev.off()

可以看到, 容易出问题的仍然是CD8和NK细胞的混入,以及CD4和CD8的混入,这个目前来说是无解的:

CD8和NK细胞的混入

我们可以简单的可视化前面的决策树模型的5个基因:

library(Seurat)
sce=CreateSeuratObject(counts = t(predictor_data) )
Idents(sce) = target
cg = c('FTL','HLA-DRA','NKG7','FCER1G','CST3')
VlnPlot(sce,features = cg , 
        stack = T
ggplot2::ggsave('rpart_models_VlnPlot.pdf' )

如下所示:

决策树模型的5个基因

对照前面的决策树模型看:

  • 确实是FTL基因可以区分单核细胞和其它细胞
  • 然后是HLA-DRA可以区分B细胞以及树突细胞和其它细胞,其中B细胞以及树突细胞的区分靠CST3
  • 然后T细胞里面的CD4靠NKG7区分出来,然后CD8和NK细胞靠FCER1G区分

这样的模型就非常容易解释清楚,比起前面的随机森林,LASSO回归,支持向量机来说。

文末友情宣传

强烈建议你推荐给身边的博士后以及年轻生物学PI,多一点数据认知,让他们的科研上一个台阶:


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/150872
 
489 次点击