Fork me on GitHub

Caret Package 使用教程

Caret是R中的一个包,他的主要功能是评估不同参数建立的回归和分类模型,通过对这些模型性能的比较得出最新的参数组合,最终得出最优的模型。Caret支持217种不同的机器学习方法的参数调优,换言之,caret可以统一的支持217种不同的建模方法,也是一个应用机器学习的包。以下为我在学习此包的过程中的心得体会。从以下几点展开:
1. Caret的简介与安装
2. train函数:caret包中最主要的函数
3. trainControl函数:train过程中的行为调整
4. 结果可视化及新数据的预测
5. 参数调优并行化

caret的简介与安装

caret(classification and regression training)包含一系列函数,用于方便快捷的对回归和分类问题进行特征选择、模型建立、模型测试和参数调优。他为R中大量建模函数提供了统一的使用接口,提供217种不同的回归分类建模方式。同时,你可以将自己写的模型作为参数提交给caret进行参数调优
要使用caret支持的所有建模算法,先要安装完整的caret包

1
install.packages("caret", dependencies = c("Depends", "Suggests"))

train函数:caret包中最主要的函数

Train函数的主要功能是通过重采样(resample)评估参数调整对模型性能的影响。模型建立只是train函数一个附带的功能,下面这张图片给出了train对参数进行调整的流程。

1
2
3
4
5
6
7
8
9
a. 定义模型需要调整的参数
b. 进入循环,遍历参数空间,使用每一组参数建立模型
c. 第二层循环指每次建立模型时都对数据进行重采样
d. 参数和数据都确定好之后。对数据进行预处理
e. 将部分数据冻结以用于测试
e. 对余下的数据建模,用冻结的这部分数据进行测试
e. 对不同数据的结果进行评估(一般取性能均值)
f. 对参数组进行评估,选出最佳参数
g. 使用最优的这组参数对所有训练集数据进行建模

可以看出train函数在建模过程中就有测试的步骤。因此,计算出来的模型就是最优的。不需要再去努力进行参数调整,只要把train函数中的参数设计好就行了。在这些步骤中,我们可以调整的有测试参数的数值范围重采样算法测试结果的评估方式

其中测试参数的数值范围通过tuneLength和tuneGrid进行调整。每个模型的参数都有调整的默认值,tuneLength用来根据默认值来调整长度,tuneGrid可以直接给出参数的数值。后面的两种类型的调整都与trainControl函数有关。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
library(mlbench)
data("Sonar")
set.seed(107)
inTrain <- createDataPartition(y = Sonar$Class,p = .75,list = F)
training <- Sonar[inTrain,]
testing <- Sonar[-inTrain,]
ctrl <- trainControl(method = 'repeatedcv',
repeats = 3,
summaryFunction = 'twoClassSummary',
classProb = T)
plsFit <- train(Class ~ .,
data = training,
method = 'pls',
preProc = c('center','scale'),
tuneLength = 15,
trControl = ctrl,
metric = 'ROC')

trainControl函数:train过程中的行为调整

通过trainControl函数可以建立ctrl,ctrl作为参数进入train函数执行。

其中method表示重采样的方式(包含默认的boot,repeatedcv等多种),每种方式都有对应的参数进行设置。

SummaryFunction参数设置测试结果的评估方式(defaultSummary和twoClassSummary是两种默认的方式)。其中如果使用twoClassSummary会给出ROC曲线,但是需要将classProb设为T(因为train函数默认并不计算概率)。如果需要ROC曲线,在train函数中也要用metric提出。
至此,模型的训练和测试都已经完成了。

结果可视化及新数据的预测

在caret中,结果可视化非常简单。要展示不同参数值得出的性能结果只需要plot(plsFit)即可。

如果要预测新的数据需要用到predict函数,其中type为prob表示结果用概率表示。使用confusionMatrix函数可以得到新数据的判断结果如何。

1
2
plsClasses <- predict(plsFit, newdata = testing,type = 'prob')
confusionMatrix(data = plsClasses, testing$Class)

有意思的是在testing中不需要去掉Class列也可以,可能是因为Class列并不是数值类型。但这也说明predict对newdata的列是有选择的。

参数调优并行化

因为在参数调优过程中的每一次建模之间是独立的。因此,理论上是可以并行的来做参数调优的。caret也提供了这一功能。只需要在train之前初始化并行环境即可。

1
2
3
4
library(doMC)
registerDoMC(cores = 5)
## All subsequent models are then run in parallel
model <- train(y ~ ., data = training, method = "rf")

Tips

如果你看英文文献,predictor这个词指的是数据中的每一列,比如我用面积,层高和交通便利指数来预测一个小区的房价。那么这三个属性就叫predictor。最开始阅读时,对这个不理解。
关于caret原生支持的模型以及原生支持的参数可以参考引用4和引用5。

Reference

  1. https://www.r-project.org/nosvn/conferences/useR-2013/Tutorials/kuhn/user_caret_2up.pdf
  2. https://cran.r-project.org/web/packages/caret/vignettes/caret.pdf
  3. http://topepo.github.io/caret/
  4. http://topepo.github.io/caret/modelList.html
  5. http://topepo.github.io/caret/bytag.html
No pain, No gain