机器学习方法往往需要结合统计学、概率论、线性代数和算法复杂性理论等数学知识,对于生物医学研究者是一个巨大的挑战。本文综述了机器学习方法在基于微生物组数据预测宿主表型方面的应用,简要介绍了微生物组研究中常用的机器学习方法、数据处理步骤以及性能评价指标,并提供了一个基于唾液微生物组数据预测口腔异味的研究案例。
虽然在大数据时代获得数据往往比较容易,但由于获取带标签数据的成本与难度较大,因此大规模数据中往往仅有部分带有标签,而大多数样本是无标签数据,例如大型人群队列检测样本中只有小部分是经诊断的癌症患者样本。此时就需要通过一部分有标签数据对其余数据进行预测。半监督(semi-supervised)学习就是可应用在有标签数据与无标签数据混合的训练数据中的机器学习算法。常见的半监督学习有简单自训练(self-training)、标签传播算法和半监督深度学习等。
与监督学习相反,当标签信息不可用或在建模过程中不使用的情况下称为无监督学习,无监督学习模型可以推断出数据的一些内在结构,主要用于聚类(clustering)与降维(dimensionreduction)两个方面。
下面介绍基于微生物组数据的机器学习流程中的一些关键要点。
数据预处理主要包括:缺失值处理,即对数据集的错误及缺失数据进行修改或填补;特征提取,即在原始数据中提取更有用的特征或生成新特征;数据降维,用于降低数据的维度,进而降低数据集的复杂度;特征变换,主要包括对数据特征的归一化或标准化等。
其中,TP:truepositive;FN:falsenegative;TN:truenegative;FP:falsenegative。F1值(F1-score)是精确率和召回率的加权调和平均值(最大值是1,最小值是0)。它有两种计算方式分别为F1-micro与F1-macro,在二分类问题中两者计算方式完全一致,但在多分类问题中有差异。
运行Windows、Linux或macOS操作系统的64位计算机;计算机的处理器与内存需求依赖分析数据的大小与分析模型。
通过以下命令安装本案例需要的R包:install.packages(c(“randomForest”,“pROC”,“ggplot2”))。
在R中设置本机工作目录在“D:\microbioML”,并载入所需要的数据集:S1_table.csv(样本中OTU丰度数据集)。
setwd(“D:\microbioML”)#按数据实际路径修改
data<-read.csv(“S1_table.csv”,header=TRUE,row.names=1,sep=“,”)
data$Malodour<-as.factor(data$Malodour)
head(data)#显示部分数据
进行交叉检验首先要对数据分组,数据分组要符合随机且平均的原则。K-折交叉验证(K-foldcross-validation)是交叉验证方法里一种,数据分折(k-fold)函数如下:
CVgroup<-function(k,datasize,seed){
cvlist<-data.frame()
set.seed(seed)
n<-rep(1:k,ceiling(datasize/k))[1:datasize]#将数据分成k份,并生成的完整数据集n
temp<-sample(n,datasize)#随机化
x<-1:k
dataseq<-1:datasize
cvlist<-lapply(x,function(x)dataseq[temp==x])#随机生成k个随机有序数据列
return(cvlist)
}#定义分折函数
k<-10#k-fold设为10
datasize<-90#样本数为90
cvlist<-CVgroup(k=k,datasize=datasize,seed=123)#代入参数
随机森林预测模型使用R包randomForest构建,变量pred显示实际值与预测初步结果概率的数据框,方便绘制ROC曲线。
library(randomForest)#载入模型库
pred<-data.frame()#存储预测结果
for(iin1:10){
train<-data[-cvlist[[i]],]#训练集
test<-data[cvlist[[i]],]#测试集
#建立randomforest模型,ntree指定树数
rf.model<-randomForest(Malodour~.,data=train,ntree=100)
summary(rf.model)
rf.pred<-predict(rf.model,test,type="prob")[,2]#预测
kcross<-rep(i,length(rf.pred))#i为第几次循环交叉,共K次
temp<-cbind(Malodour=test$Malodour,rfPredict=as.data.frame(rf.pred),kcross)
pred<-rbind(pred,temp)
}#循环计算K次模型
head(pred)
通过pROC包里的roc函数和ggplot2里的ggroc函数绘制ROC曲线。
library(pROC)
library(ggplot2)
rf.roc<-roc(pred$Malodour,as.numeric(pred$rf.pred))
rf.roc$auc
ggroc(rf.roc,alpha=0.5,colour=“red”,linetype=1,size=2,legacy.axes=TRUE)+
annotate(“text”,x=.75,y=.15,label=paste(“AUCofRandomForest=”,round(rf.roc$auc,3)))