那些容易被人忽视的R包——基于caret的机器学习(一)






那些容易被人忽视的R包——基于caret的机器学习(一)

大海哥  生信果  2023-09-02 19:00:34

点击蓝字 关注我们

小伙伴们大家好,大海哥又来安利好东西啦!今天要推荐大家学习的是一个R包,这个R包基本可以实现我们生信分析中常用的大部分机器学习方法,并且还初始化了大部分参数,不再需要我们自己定义一大堆参数,省去了相当大的麻烦,听起来是不是觉得十分强大!是的,掌握了它,大海哥觉得屏幕前的你拿下几篇SCI不在话下!时间紧急,让我们先赶紧了解一下这个R包吧
caret(Classification And REgression Training的缩写)是一个在R语言中广泛使用的包,用于简化机器学习模型的训练、评估和预测过程。它为用户提供了一个统一的界面,可以在多种机器学习算法中进行选择、参数调整、交叉验证等操作,从而使整个模型开发流程更加高效和方便。大海哥大致统计了一下,其包含238种模型和众多函数,简直强到窒息~。不过目前,caret包已经停止更新,其主要作者已加入Rstudio开发了tidymodels,从tidymodels中我们还能看到caret的影子,但对于机器学习的初学者来说,caret是容易理解和学习的,所以大家一定不可以忽视这个R包哦!

caret包的功能包含下面几种

数据拆分

数据预处理

特征选择

模型构建及优化

变量重要性评估

其他函数部分

由于内容过多,所以本文主要介绍数据拆分、数据预处理和模型构建及优化,其余部分在后续文章中介绍。

1、数据预处理

1.1创建虚拟变量

library(caret)library(earth) #利用包内的数据data(etitanic)#使用baseR中的model.matrixhead(model.matrix(survived ~ ., data = etitanic)[,-1])
#数据集etitantic中pclass变量有1st,2nd, 3rd三个水平,需要转换为虚拟变量#model.matrix()函数将pclass转换为三个变量并把第一个水平作为参考,同时生成一个常数列#使用caret包的dummyVars()函数dummies <- dummyVars(survived ~ ., data = etitanic)head(predict(dummies, newdata = etitanic))

可以看到函数将pclass转换为三个单独的变量

1.2数据预处理

#preprocess函数#大海哥先介绍一下它的用法preProcess(x,  需要处理的数据集,数据集为数值型的矩阵或数据框method = c("center","scale"), 数据处理方#  thresh = 0.95, PCA的阈值pcaComp = NULL, PCA主成分个数na.remove = TRUE, 是否去除缺失值#   k = 5,   knn算法的k值knnSummary = mean, knn插值的方法outcome = NULL,  结局变量fudge = 0.2, 公差值numUnique = 3, Box-Cox变换需要多少个唯一值 verbose = FALSE, 是否显示处理过程 freqCut = 95/5, 最常见值与第二常见值的比值 uniqueCut = 10, 不同值占总样本数的百分比 cutoff = 0.9,   相关性的阈值 rangeBounds = c(0, 1), 指定范围内变换数据预处理方法method还有:"BoxCox","YeoJohnson", "expoTrans", "center","scale", "range", "knnImpute","bagImpute", "medianImpute", "pca","ica", "spatialSign", "corr", "zv","nzv", and "conditionalX"
#然后我们找个示例演示一下吧library(AppliedPredictiveModeling)data(schedulingData)#引入示例数据str(schedulingData)
pp <- preProcess(schedulingData[, -8],          method = c("center", "scale", "YeoJohnson", "nzv")
#处理完成后,看看能不能拿来进行预测predict(pp, newdata =schedulingData[1:6, -8])

顺利进行哦!

2、数据拆分

还可以进行数据拆分data(iris)iris <- na.omit(iris)set.seed(123)  # 设置随机种子,以确保结果可重复train_indices <- createDataPartition(iris $Species, p = 0.7, list = FALSE)train_data <-iris[train_indices, ]test_data <- iris[-train_indices, ]

这样就可以实现3:7随机抽取测试集和训练集哦!很方便吧!

3、模型训练

#基本参数设定fitControl <- trainControl(## 10-fold CV                          method = "repeatedcv",                          number = 5,                          ## repeated ten times                          repeats = 3)# method:重采样方法,包括"boot", "boot632", "optimism_boot","boot_all", "cv", "repeatedcv","LOOCV", "LGOCV" (for repeated training/test splits),"none" (only fits one model to the entire training set),"oob" (only for random forest, bagged trees, bagged earth, bagged flexible discriminant analysis, or conditional tree forest models), timeslice,"adaptive_cv", "adaptive_boot" or"adaptive_LGOCV"#number用于设定交叉验证和重复交叉验证的折数、bootstrap抽样次数 #repeats 用于设定交叉验证的次数
#模型拟合set.seed(1)gbmFit1 <- train(factor(Species) ~ .,                 data = train_data,                 method = "gbm",                 trControl = fitControl,                 ## This last option is actually one                 ## for gbm() that passes through                 verbose = FALSE)

可以看到模型拟合并且构建成功!

4、模型调参

迭代次数,即树(在函数中调用)n.trees树的复杂性,称为interaction.depth学习速率:算法适应的速度,称为shrinkage节点中开始拆分的训练集样本的最小数量(n.minobsinnode)#定义调参过程gbmGrid <-  expand.grid(interaction.depth = c(1, 5, 9),                        n.trees = (1:20)*100,                        shrinkage =0.1,                       n.minobsinnode = 20)                       nrow(gbmGrid)
#开始调参set.seed(2)gbmFit2 <- train(factor(Species) ~ .,                  data = train_data,                  method = "gbm",                  trControl = fitControl,                 verbose = FALSE,                  tuneGrid = gbmGrid)gbmFit2$bestTune  #调优结果#这一步需要消耗一点点时间哦!
#可以看到,给出了调优结果gbmFit2$finalModel #最终模型
#我们还可以根据结果,绘制重采样曲线ggplot(gbmFit2) #以Accuracy为基准
#也可以选择ggplot(gbmFit2,metric = "Kappa") #以Kappa为基准

5、模型预测

#这一步也是我们最重要的一步了predict(gbmFit2, newdata = head(test_data))#默认预测分类
#预测成功啦!#还可以预测概率哦!predict(gbmFit2,         newdata = head(test_data), type = "prob")#预测概率

有了预测结果,大家就可以自由发挥啦!

着是不是也还不错
还可以基于ggfittext方法修改节点标签哦


好了大海哥今天就先分享caret包的这几个功能,下次我会继续分享剩下的几个功能哦!大家记得按时学习!(最后推荐一下大海哥新开发的零代码云生信分析工具平台,包含超多零代码小工具,上传数据一件出图,感兴趣的小伙伴欢迎来参观哟,

网址:http://www.biocloudservice.com/home.html)


点击“阅读原文”进入网址