caret包介绍学习之train函数介绍

caret包在机器学习会经常用到,它可以进行:数据预处理,特征选择,建模与参数优化,模型预测与检验。关于caret包在这些方面的应用可以参看文章:
R语言之-caret包应用
R语言caret包的学习(四)–建立模型及验证
R中模型性能的提升

本次介绍的是caret包在模型与参数优化上面的应用,主要函数为train函数
caret包中提供了很多种工具进行自动调整参数,train()函数作为接口,可以选择评估方法和度量性指标,自动寻找最优的参数。
主要考虑的问题:
(1)训练哪种模型法,(2)模型中哪些参数可以调整,可以调整的空间多大,(3)选择评价的标准

总结:train函数可以建立很多种模型,而且对于模型还可以根据不同的评价标准自动调整参数来找出最优的结果。所以train可以选择何种模型,选择调整哪些参数,调整参数的范围,和选择判断模型优劣的评判方式

train函数介绍

train(x, y, method = "rf", preProcess = NULL, ...,
	weights = NULL, metric = ifelse(is.factor(y), "Accuracy",  "RMSE"),
	maximize = ifelse(metric %in% c("RMSE", "logLoss", "MAE"), FALSE, TRUE),
   trControl = trainControl(), tuneGrid = NULL,
   tuneLength = ifelse(trControl$method == "none", 1, 3))

参数介绍:
x 行为样本,列为特征的矩阵或数据框。列必须有名字
y 每个样本的结果,数值或因子型
method 指定具体的模型形式,支持大量训练模型
preProcess 代表自变量预处理方法的字符向量。默认为空,可以是 “BoxCox”, “YeoJohnson”, “expoTrans”, “center”, “scale”, “range”, “knnImpute”, “bagImpute”, “medianImpute”, “pca”, “ica” and “spatialSign”.
weights 加权的数值向量。仅作用于允许加权的模型
metric 指定将使用什么汇总度量来选择最优模型。默认情况下,“RMSE” and “Rsquared” for regression and “Accuracy” and “Kappa” for classification
maximize 逻辑值,metric是否最大化
trControl 定义函数运行参数的列表。具体见下
tuneGrid 可能的调整值的数据框,列名与调整参数一致
tuneLength 调整参数网格中的粒度数量,默认时每个调整参数的level的数量

#例子

> #自动参数调整
> #使用caret包进行自动参数调整
> #举例
> #使用决策树模型对iris数据进行建模,
> #使用caret包中的train函数进行建模并进行自动参数调整
> 
> library(caret)
> set.seed(1234)
> m_C50 <- train(Species~., data=iris,method='C5.0')
There were 40 warnings (use warnings() to see them)
> m_C50
C5.0 

150 samples
  4 predictor
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Bootstrapped (25 reps) 
Summary of sample sizes: 150, 150, 150, 150, 150, 150, ... 
Resampling results across tuning parameters:

  model  winnow  trials  Accuracy   Kappa    
  rules  FALSE    1      0.9353579  0.9019696
  rules  FALSE   10      0.9370844  0.9045424
  rules  FALSE   20      0.9325835  0.8976068
  rules   TRUE    1      0.9382311  0.9062975
  rules   TRUE   10      0.9407392  0.9099910
  rules   TRUE   20      0.9385430  0.9066136
  tree   FALSE    1      0.9347127  0.9009924
  tree   FALSE   10      0.9369888  0.9044013
  tree   FALSE   20      0.9332286  0.8985820
  tree    TRUE    1      0.9375860  0.9053246
  tree    TRUE   10      0.9399845  0.9088007
  tree    TRUE   20      0.9392443  0.9076915

Accuracy was used to select the optimal model using the
 largest value.
The final values used for the model were trials = 10, model =
 rules and winnow = TRUE.

结果中包含候选模型的评估列表,可以发现共建立并测试了12个模型,基于3个C5.0调整参数的组合:model, trials和winnow。每个候选模型都给出了模型精度和Kappa统计量,最下方还展示了最佳后选模型所对应的参数值。
Kappa用来统计衡量模型的稳定性
很差的一致性: <0.2
尚可的一致性: 0.2~0.4
中等的一致性: 0.4~0.6
不错的一致性: 0.6~0.8
很好的饿一致性:0.8~1

本例子我们选择的模型为C5.0,但是我们对调节哪些参数和选择的标准都没有进行设置,下面我们来看一下如何定制的调整参数。

下面介绍一下trainControl函数
trainControl()函数用来创建一系列的配置选项,这些选项考虑到了诸如重抽样策略以及用于选择最佳模型的度量这些模型评价标准的管理。以上我们专注于两个主要参数:method和selectionFunction.
以上我们使用的是五折交叉验证的重抽样方法;
selectionFuncton参数可以设定一函数用来在各个候选者中选择特定的模型,共三个函数:
best函数简单地选择具有最好的某特定度量值的候选者,默认选项
oneSE函数选择最好性能标准差之内的最简单的候选者
Tolerance选择某个用户指定比例之内的最简单的候选者

trainControl(method = "boot", number = ifelse(grepl("cv", method), 10, 25),
  repeats = ifelse(grepl("[d_]cv$", method), 1, NA), p = 0.75,
  search = "grid", initialWindow = NULL, horizon = 1,
  fixedWindow = TRUE, skip = 0, verboseIter = FALSE, returnData = TRUE,
  returnResamp = "final",.....)

参数介绍:
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 folds的数量或重抽样的迭代次数
repeats 仅作用于k折交叉验证:代表要计算的完整折叠集的数量
p 仅作用于分组交叉验证:代表训练集的百分比
search Either “grid” or “random”,表示如何确定调整参数网格

总结:在train函数中定制调整参数的参数是trControl ,trGrid两个参数,一个参数可以设置重抽样的方法,一个参数用来设置需要调整哪些参数及调整的范围。使用trControl参数可以通过trainControl函数进行设置trControl参数,使用trGrid参数可以使用expand.grid函数进行设置trGrid参数

例子

#定制调整参数
> #trainControl这个函数是为了设置train函数重采样的方式,例如这里就是使用五折交叉验证的方法
> trControl <- trainControl(method = 'cv',number = 5,selectionFunction = 'oneSE')
> #expand.grid是用来设置需要调整的参数及调整的范围,结果用在train函数中
> grid <- expand.grid(.model='tree',
+                     .trials = c(1,3,5),
+                     .winnow='FALSE')
> set.seed(1234)
> 
> m_C502 <- train(Species~., data=iris, method="C5.0",
+                 trControl=trControl,
+                 tuneGrid=grid)
Warning message:
In Ops.factor(x$winnow) : ‘!’ not meaningful for factors
> m_C502
C5.0 

150 samples
  4 predictor
  3 classes: 'setosa', 'versicolor', 'virginica' 

No pre-processing
Resampling: Cross-Validated (5 fold) 
Summary of sample sizes: 120, 120, 120, 120, 120 
Resampling results across tuning parameters:

  trials  Accuracy   Kappa
  1       0.9266667  0.89 
  3       0.9333333  0.90 
  5       0.9333333  0.90 

Tuning parameter 'model' was held constant at a value of tree
Tuning parameter 'winnow' was held constant at a value of FALSE
Accuracy was used to select the optimal model using  the one SE rule.
The final values used for the model were trials = 1, model = tree and winnow = FALSE.
> 

你可能感兴趣的:(R语言)