在之前的博客中我们详细介绍过了
数据的拆分策略、各种数据处理的方法、各种交叉验证的方法
,并且以示例介绍了R函数createDataPartition、trainControl
。
下面我们来介绍模型的训练以及调参。以下图片是caret
包模型调优的策略。
我们该如何理解上面的图片?下面我们举一个例子来说明。
我们使用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
,我们指定的调优参数k
为2、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
都是在十次结果的基础上取的平均值(十折交叉验证)!
当然对于调优参数很多的,它会按照全排列形成一系列的组合!
在这里我们使用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