R语言机器学习之caret包详解(二:模型的训练以及调参)

R语言机器学习之caret包详解(二:模型的训练以及调参)

  • 前言
  • caret包模型调优的策略、示例、以及一些小tips

前言

在之前的博客中我们详细介绍过了数据的拆分策略、各种数据处理的方法、各种交叉验证的方法,并且以示例介绍了R函数createDataPartition、trainControl

caret包模型调优的策略、示例、以及一些小tips

下面我们来介绍模型的训练以及调参。以下图片是caret包模型调优的策略。

R语言机器学习之caret包详解(二:模型的训练以及调参)_第1张图片
我们该如何理解上面的图片?下面我们举一个例子来说明。
我们使用caret包来对k近邻方法进行调参,数据选用的鸢尾花数据集!

> data(iris)
> TrainData <- iris[,1:4]
> TrainClasses <- iris[,5]
> 
> knnFit1 <- train(TrainData, TrainClasses,
+                  method = "knn",
+                  preProcess = c("center", "scale"),
+                  tuneGrid = expand.grid(k = c(2,5,8)),
+                  trControl = trainControl(method = "cv"))
> 

对于我所选择的method = “knn”其调优参数只有k,我们指定的调优参数k2、5、8,针对每类调优参数train函数会在训练集的基础上进行十折交叉验证(默认情况下)。以下是各类调优参数在十折交叉验证下的结果!

> results
  k  Accuracy Kappa AccuracySD    KappaSD
1 2 0.9400000  0.91 0.07336700 0.11005049
2 5 0.9400000  0.91 0.05837300 0.08755950
3 8 0.9466667  0.92 0.05258738 0.07888106

results:其中的Accuracy Kappa都是在十次结果的基础上取的平均值(十折交叉验证)!
当然对于调优参数很多的,它会按照全排列形成一系列的组合!
R语言机器学习之caret包详解(二:模型的训练以及调参)_第2张图片
在这里我们使用kknn包实现k近邻算法。

> knnFit2 <- train(TrainData, TrainClasses,
+                  method = "kknn",
+                  preProcess = c("center", "scale"),
+                  tuneGrid = expand.grid(kmax = c(2, 5, 8), distance = c(1,2),
+                                          kernel = 'optimal'),
+                  trControl = trainControl(method = "cv"))

> results
  kmax distance  kernel  Accuracy Kappa AccuracySD    KappaSD
1    2        1 optimal 0.9333333  0.90 0.07027284 0.10540926
2    2        2 optimal 0.9466667  0.92 0.05258738 0.07888106
3    5        1 optimal 0.9533333  0.93 0.05488484 0.08232726
4    5        2 optimal 0.9466667  0.92 0.05258738 0.07888106
5    8        1 optimal 0.9533333  0.93 0.05488484 0.08232726
6    8        2 optimal 0.9466667  0.92 0.05258738 0.07888106

一些小的tips

tips:函数set.seed用在train函数之前有一些作用:它可以保证我们使用相同的数据进行交叉验证(保证两个模型使用相同的重抽样信息),从而更好的决定调优参数,我举例来说明!

fitControl <- trainControl(## 10-fold CV
                           method = "repeatedcv",
                           number = 10,
                           ## repeated ten times
                           repeats = 10)
set.seed(825)
gbmFit1 <- train(Class ~ ., data = training, 
                 method = "gbm", 
                 trControl = fitControl,
                 ## This last option is actually one
                 ## for gbm() that passes through
                 verbose = FALSE)

gbmGrid <-  expand.grid(interaction.depth = c(1, 5, 9), 
                        n.trees = (1:30)*50, 
                        shrinkage = 0.1,
                        n.minobsinnode = 20)


set.seed(825)

gbmFit2 <- train(Class ~ ., data = training,
                 method = 'gbm',
                 trControl = fitControl,
                 tuneGrid = gbmGrid,
                 verbose = FALSE)



index1 = gbmFit1$control$index
index2 = gbmFit2$control$index
> identical(index1, index2)
[1] TRUE

由于set.seed函数的设置,以上代码gbmFit1、gbmFit2中交叉验证重抽样的信息相同!

一些小tips

metric:回归问题中通常使用RMSE R方 MAE作为衡量模型效果的指标;分类问题中通常使用Accuracy Kappa作为衡量模型效果的指标。如果在某些问题下,以上指标不能满足caret也提供了许多函数defaultSummary,这里不一一介绍!

一些小tips

caret包主要是进行机器学习方法调参,那么可不可以直接使用某些参数拟合模型,直接跳过调参?答案当然是可以的!请看以下代码!

> fitControl = trainControl(method = 'none', classProbs = TRUE)
> set.seed(123)
> gbmFit4 = train(Class ~ ., data = training, 
+                 method = 'gbm',
+                 trControl = fitControl,
+                 verbose = FALSE,
+                 tuneGrid = data.frame(
+                         interaction.depth = 4,
+                         n.trees = 100,
+                         shrinkage = .1,
+                         n.minobsinnode = 20),
+                 metric = 'ROC')
> gbmFit4
Stochastic Gradient Boosting 

157 samples
 60 predictor
  2 classes: 'M', 'R' 

No pre-processing
Resampling: None 

你可能感兴趣的:(R语言,机器学习,r语言,机器学习,caret包)