caret: Model Training and Tuning - Basic Syntaxの和訳

訳注
http://topepo.github.io/caret/training.html の和訳です
---
# Model Training and Parameter Tuning
caret パッケージにはモデル構築と評価のいくつかの関数があります。

train 関数は次の用途に使います

* リサンプリングをしての、パフォーマンスに対するモデルのパラメータチューニングの評価
* パラメータを通じての「最適」なモデルの選定
* トレーニングセットに対するモデルパフォーマンスの評価

最初に、特徴的なモデルを見てみましょう。現在、caret には216のモデルがあります；詳細については train Model List あるいは train Models By Tag を参照のこと。そこでは、最適化に関するチューニングパラメータのリストがあります。ユーザ定義モデルも作成可能です。

モデルチューニングの最初のステップは（アルゴリズムの1行目）評価用のパラメータセットを選択することです。例えば、部分最小二乗法(PLS)モデルの場合、PLS コンポーネントの数を指定します。

1. Define sets of model parameter values to evaluate
2. **for** *each parameter set* **do**
3. 　**for** *each resampling iteration* **do**
4. 　　Hold-out specific samples
5. 　　[Optional] Pre-process the data
6. 　　Fit the model on the remainder
7. 　　Predict the hold-out samples
8. 　**end**
9. 　Calculate the average performance across hold-out predictions
10. **end**
11. Determine the optimal parameter sets
12. Fit the final model to all the training data using the optimal parameter set

モデルとチューニングパラメータ値を定義したら、リサンプリングのタイプを指定します。ここでは、k-fold クロスバリデーション（1回あるいは繰り返し）、leave-one-out クロスバリデーションとブートストラップ（簡単な評価あるいは632のルール）によるリサンプリング法が選べます。リサンプリングの後は、パフォーマンス計測を行い、パラメータ値を選びます。デフォルトでは、最適値をチューニングパラメータとして自動的に選びますが、違うアルゴリズムも使用できます（詳細は後述）。

## 例
mlbench パッケージの Sonar データを使います。次のようにデータを読み込みます：

```r
library(mlbench)
data(Sonar)
str(Sonar[, 1:10])

'data.frame':	208 obs. of  10 variables:
 $ V1 : num  0.02 0.0453 0.0262 0.01 0.0762 0.0286 0.0317 0.0519 0.0223 0.0164 ...
 $ V2 : num  0.0371 0.0523 0.0582 0.0171 0.0666 0.0453 0.0956 0.0548 0.0375 0.0173 ...
 $ V3 : num  0.0428 0.0843 0.1099 0.0623 0.0481 ...
 $ V4 : num  0.0207 0.0689 0.1083 0.0205 0.0394 ...
 $ V5 : num  0.0954 0.1183 0.0974 0.0205 0.059 ...
 $ V6 : num  0.0986 0.2583 0.228 0.0368 0.0649 ...
 $ V7 : num  0.154 0.216 0.243 0.11 0.121 ...
 $ V8 : num  0.16 0.348 0.377 0.128 0.247 ...
 $ V9 : num  0.3109 0.3337 0.5598 0.0598 0.3564 ...
 $ V10: num  0.211 0.287 0.619 0.126 0.446 ...
```
createDataPartition 関数でデータをランダムにトレーニングセットとテストセットに分割します（訳注：set.seed(998) は乱数の種を固定して、以下の実行例の結果を固定するため。乱数なので実行するたびに結果が異なることを避けるためです。）：

```r
library(caret)
set.seed(998)
inTraining <- createDataPartition(Sonar$Class, p = .75, list = FALSE)
training <- Sonar[ inTraining,]
testing  <- Sonar[-inTraining,]
```
このページや他のページでこのデータを用います。

# パラメータチューニングの基礎
デフォルトでは、上のアルゴリズムの3行目にて、簡単なブートストラップリサンプリングを行います。他の方法も使用可能です、繰り返しK-foldクロスバリデーション、leave-one-out等。trainControl 関数はリサンプリングのタイプを指定します：

```r
fitControl <- trainControl(## 10-fold CV
                           method = "repeatedcv",
                           number = 10,
                           ## repeated ten times
                           repeats = 10)
```
trainControl に関する詳細は以下の節にあります。

最初の2つの属性は train 関数に予測とアウトカムのデータオブジェクトを渡すものです。3つ目の属性の method はモデル（train Model List あるいは train Models By Tag 参照のこと）のタイプを指定します。例では、gbm パッケージのブースティング木モデルを使用します。繰り返しクロスバリデーションを用いるモデルの基本的な書式は以下です：


```r
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)

gbmFit1
Stochastic Gradient Boosting 

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

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 142, 142, 140, 142, 142, 141, ... 
Resampling results across tuning parameters:

  interaction.depth  n.trees  Accuracy   Kappa      Accuracy SD  Kappa SD 
  1                   50      0.7705490  0.5350650  0.10073946   0.2037707
  1                  100      0.7944632  0.5835422  0.09419873   0.1914364
  1                  150      0.8011593  0.5964959  0.09019200   0.1851888
  2                   50      0.8015147  0.5978660  0.09962239   0.2017663
  2                  100      0.8088333  0.6119527  0.09563838   0.1946951
  2                  150      0.8189363  0.6319720  0.08708353   0.1784560
  3                   50      0.7953015  0.5855569  0.09652109   0.1969998
  3                  100      0.8143113  0.6232661  0.08878854   0.1824782
  3                  150      0.8217377  0.6373545  0.09037965   0.1866666

Tuning parameter 'shrinkage' was held constant at a value of 0.1
Tuning parameter 'n.minobsinnode' was held constant at a value of 10
Accuracy was used to select the optimal model using  the largest value.
The final values used for the model were n.trees = 150, interaction.depth = 3, shrinkage = 0.1 and n.minobsinnode = 10. 
```
勾配ブースティング(GBM)モデルでは、主に3つのチューニングパラメータがあります（訳注：4つある）：

* イテレーションの数、すなわち、木（gbm 関数の n.trees）
* 木の複雑さ、 interaction.depth
* 学習率：アルゴリズムの収束の程度、shrinkage
* 分割するノードにおけるトレーニングセットサンプルの最小値（n.minobsinnode）

このモデルをテストするデフォルト値は最初の2つの列です（shrinkage と n.minobsinnode は示されていない、なぜならこれらチューニングパラメータは1つの値を用いるというグリッドセットとしているからです）（訳注：beause という語があったが because とみなした）。 "Accuracy"列はクロスバリデーションのイテレーションを通じての一致率を示します。標準偏差の一致はクロスバリデーションの結果から計算します。"Kappa"は、リサンプリング結果の平均コーエンΚ係数（非ウエイト）を示します。train は特定のモデル（train Model List か train Models By Tag 参照）に関して働きます。これらのモデルでは、train はチューニングパラメータのグリッドを自動的に作成します。デフォルトでは、p をチューニングパラメータの数とすると、グリッドサイズは p^3 となります。他の例では、RDAモデルは2つのパラメータ（ガンマとラムダ）を持ち、両方とも[0, 1]の範囲となります。デフォルトのトレーニンググリッドは二次元空間において9つの組み合わせとなります。

train に関する特定のモデルの動作について、ここで少し触れます。train の付加的な機能については次の節で触れます。

# 再現性について
多くのモデルではパラメータ評価の過程で乱数を用います。また、乱数を用いてリサンプリングを行います。結果を再現するために乱数を管理する方法は主に2つあります。

* 同じリサンプルを呼び出しとトレーニングの間で用いるには2つのアプローチがあります。1つ目は、 set.seed を train の前に呼び出すことです。乱数を用いる最初は、リサンプリング情報を生成することです。別の方法は、データの分割を指定するインデックスを trainControl 関数の属性に指定することです。これについては以下で議論します。
* リサンプリング内でモデルが構築されるとき、seeds は指定されます。一方、train を呼び出す前に seed を指定した場合には同じ乱数値となります。並列実行をしている場合（どのような並列化をしているかに依存します）にはこれは成り立ちません。モデルフィッティングの seed を指定するために trainControl は seeds 属性を付加的に使用します。この属性の値は整数ベクトルのリストとして与えます。trainControl のヘルプページにこのオプションの書式があります。

どのような乱数値が用いられるかはパッケージ作者に依存しています。ごく稀なケースでは乱数の seed 値が管理されていません。特にC言語で計算されている場合には。

# チューニングプロセスのカスタマイズ
チューニング／複雑度パラメータの洗濯と最終的なモデル構築のプロセスのカスタマイズにはいくつかの方法があります。

## 前処理オプション
言及済みのことですが、train ではモデルフィッティングに先立って多様な前処理が可能です。preProcess 関数は自動的に用いられます。この関数では、センタリングやスケーリング、インピューテーション（詳細は下記）、主成分分析あるいは独立成分分析により、spatial sign 変換を行うことが出来ます。
前処理を指定するには、train 関数に preProcess 属性を加えます。preProcess 関数と同じ属性を用いて前処理手法を指定できます。preProcess 関数への追加のオプションは trainControl 関数を経由して指定できます。
これらのステップは、predict.train, extractPrediction あるいは extractProbes （詳細は下記参照）を用いて一般化できます。前処理では、object$finalModel オブジェクトを直接に用いて予測を行うことはしません。( The pre-processing would not be applied to predictions that directly use the object$finalModel object.)
インピューテーションについては、3つの手法があります：（訳注：インピューテーションとは欠損値の推定方法）

* k近傍法は、トレーニングセットにおいて、k個の近接するサンプルを見つけて欠損値を埋めます。トレーニングセットにおけるkの平均は、オリジナルデータに適用されます。トレーニングセットの距離を計算したとき、トレーニングセットに欠損値がなければ欠損値なしとみなされます。
* 他の手法では、bagged tree model がトレーニングセットを用いた予測として用いられます。これは正確なモデルであり、欠損値を扱うことが出来ます。インピューテーションが必要なサンプルで予測をするとき、bagged tree により予測因子を用いた予測をし、新たな値を出します。このモデルでは計算コストが重要となります。
* トレーニングセットの値の中央値を欠損値の推定として用いることも出来ます。

もしトレーニングセットに欠損値があれば、PCAとICAモデルのみが完全なサンプルを扱えます。


## Alternate グリッドのチューニング
グリッドのチューニングパラメータはユーザにより指定出来ます。tuneGrid 属性は、各チューニングパラメータの列を持つデータフレームを持ちます。カラム名は fitting 関数の属性と同じです。前述の RDAの例では、カラム名は gamma と lambda でした。train 関数は指定したパラメータの組み合わせでモデルをチューニングします。
ブースティング木モデルでは、学習率を調整し n.trees の3つの値を評価することができます：

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

nrow(gbmGrid)

set.seed(825)
gbmFit2 <- train(Class ~ ., data = training,
                 method = "gbm",
                 trControl = fitControl,
                 verbose = FALSE,
                 ## Now specify the exact models 
                 ## to evaluate:
                 tuneGrid = gbmGrid)
gbmFit2

Stochastic Gradient Boosting 

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

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 142, 142, 140, 142, 142, 141, ... 
Resampling results across tuning parameters:

  interaction.depth  n.trees  Accuracy  Kappa  Accuracy SD  Kappa SD
  1                    50     0.76      0.51   0.103        0.21    
  1                   100     0.78      0.55   0.093        0.19    
  1                   150     0.79      0.58   0.096        0.19    
  1                   200     0.80      0.60   0.094        0.19    
  1                   250     0.80      0.60   0.093        0.19    
  1                   300     0.81      0.61   0.090        0.18    
  :                   :        :         :      :            :
  9                  1250     0.82      0.64   0.083        0.17    
  9                  1300     0.83      0.64   0.087        0.18    
  9                  1350     0.83      0.64   0.085        0.17    
  9                  1400     0.82      0.64   0.084        0.17    
  9                  1450     0.82      0.64   0.088        0.18    
  9                  1500     0.83      0.65   0.087        0.18    

Tuning parameter 'shrinkage' was held constant at a value of 0.1
Tuning parameter 'n.minobsinnode' was held constant at a value of 20
Accuracy was used to select the optimal model using  the largest value.
The final values used for the model were n.trees = 1150, interaction.depth = 5, shrinkage = 0.1 and n.minobsinnode = 20. 
```

トレーニングセットに欠損値があるとき、PCAとICAモデルのみがサンプルを完全に使えます。

可能なチューニングパラメータの組み合わせのランダムな抽出を行う他のオプションとして、すなわち「ランダム検索」[pdf]があります。この関数については以下に記述があります。(http://topepo.github.io/caret/www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf)
ランダム検索を使うときは、 search = "random" オプションを trainControl 内で指定します。この場合、tuneLength パラメータは評価可能な組み合わせの合計の数を定義します。

## リサンプリングプロフィールのプロット
plot 関数はパフォーマンスの評価とチューニングパラメータの関係のテストにも使えます。例えば、関数の単純な例としてパフォーマンス計測の結果を示します：

```r
trellis.par.set(caretTheme())
plot(gbmFit2)
```
（図略）

他のパフォーマンス計量も metric オプションで示せます：

```r
trellis.par.set(caretTheme())
plot(gbmFit2, metric = "Kappa")
```
（図略）

他の形式の図も可能です。より詳細は ?plot.train にて。以下の例ではヒートマップを示します：

```r
trellis.par.set(caretTheme())
plot(gbmFit2, metric = "Kappa", plotType = "level",
     scales = list(x = list(rot = 90)))
```
（図略）

ggplot メソッドも使えます：

```r
ggplot(gbmFit2)
```

リサンプル評価の詳細な表現をする plot 関数の機能があります。より詳細は ?xyplot.train を参照のこと。

これらのプロットから、チューニングパラメータの違いがわかります。すべてのプロセスを最初から再現することなしに、最終的な値を変えることが出来、 update.train にて最終的なモデルにフィットし直すことが出来ます。?update.train 参照のこと。

## trainControl 関数
trainControl 関数は、モデルを構築するためのパラメータを生成します：

* method: リサンプリング法："boot", "cv", "LOOCV", "LGOCV", "repeatedcv", "timeslice", "none", "oob"。out-of-bag の推定である最後の値は、ランダムフォレスト、バギング木、bagged earth、 bagged flexible 判別分析、conditional tree forest モデルでのみ用いられる。GBM モデルは含まれない（gbm パッケージの作者は、ブースティング木についてOOB エラーの推定によるチューニングパラメータの選択が適切でないと言及している）。また、leave-one-out クロスバリデーション（訳注 LOOCV）についてはリサンプリングのパフォーマンス計測について不確実性がありません。(Also, for leave-one-out cross-validation, no uncertainty estimates are given for the resampled performance measures.)
* number and repeats: number は K-fold クロスバリデーションの回数あるいは、ブートストラップまたは leave-group-out クロスバリデーション（訳注 LGOCV）のリサンプリングイテレーション数を示します。repeats は repeated K-fold クロスバリデーションのみに適用されます。method = "repeatedcv", number = 10, repeats = 3 であれば、10-fold クロスバリデーションを3回行います。
* verboseIter: トレーニングのログを出力するかどうかの論理値です（訳注：TRUE or FALSE）。
* returnData: trainingData にデータを保存するかどうかの論理値です。
* p: leave-group out クロスバリデーション向け：
* For leave-group out cross-validation: トレーニング率
* method = "timeslice" のとき trainControl は initialWindow、horizon、 と fixedWindow オプションを持ち、系列データにクロスバリデーションをどう適用するかを決定します。
* classProbs: リサンプルにより、クラス確率を出力するかどうかの論理値です。
* index と indexOut: 各リサンプリングイテレーションについての要素のリスト。各リスト要素は　イテレーションでトレーニングしてサンプルの行となります。(Each list element is the sample rows used for training at that iteration or should be held-out.) 値の指定がなければ、train が生成します。
* summaryFunction: パフォーマンスの要約を計算する関数です。
* selectionFunction: 付加的なチューニングパラメータを選択する関数です。 and examples.
* PCAthresh, ICAcomp と k: （もし使われた場合）preProcess 関数にすべてのオプションが渡されます。
* returnResamp: "all", "final", "none" という値があります。これはリサンプリングのパフォーマンス計測をどのように保存するかを指定します。
* allowParallel: train が（可能ならば）並列実行するかを決定する論理値です。
ここで議論されてないオプションがまだあります。

## 他のパフォーマンス計量値
最適な設定を決めるための計量値をユーザが変更できます。デフォルトでは、RMSE と R^2 が回帰に用いられ、正確度とΚ（カッパ）が判別に用いられます。また、デフォルトでは、RMSE と正確度をそれぞれ回帰と判別に用います。train 関数の計量の属性により、ユーザが最適な結果を選択できるようになります。例えば、1つのクラスのサンプルが少ない時に、metric = "Kaapa" を用いることにより最終的なモデルの質を改善することが出来ます。

もしこれらのパラメータで満足できなければ、ユーザ独自のパフォーマンス計量を計算することが出来ます。trainControl 関数には、パフォーマンスを計算する関数である summaryFunction があります。この関数には以下の属性があります：

*data は 観測値と予測値（回帰では数値、判別では文字値）を示す obs と pred という名の列を持つデータフレームあるいはマトリックスを参照します。現在は、クラス確率には対応していません。チューニングパラメータの1つの組み合わせについてのheld-out 予測（そして関連して参照する値）のデータの値です。tarainControl オブジェクトの classProbs 属性が TRUE の場合は、クラス確率の列が加わります。クラスレベルと同じ名前の列名となります。また、train で wetihts が指定されていれば weights という列も加わります。
* lev は文字値であり、トレーニングデータから得られるアウトカムの factor レベルです。回帰では NULL となります。
* model は文字値（すなわち、 train の method 属性の値）です。

関数の出力は数値の要約計量の vector であり、ヌル出ない名前があります。デフォルトでは train 予測されたクラスの判別モデルを出力します。オプションとして、クラス確率をパフォーマンス評価に用います。リサンプリングプロセスにてクラス確率の予測を得るには、trainContorl の classProbs 属性を TRUE にする必要があります。 各リサンプル（クラスごとに列があり、列名はクラス名です）から生成された確率をマージした列となります。

最後の節では、リサンプルを通しての平均であるパフォーマンススコアを計算する関数を見てみましょう。別の組み込み済み関数である、twoClassSummary は感度と特異度とROC曲線の下部面積を計算します：

```r
head(twoClassSummary)
                                                                           
1 function (data, lev = NULL, model = NULL)                                
2 {                                                                        
3     if (length(levels(data$obs)) > 2)                                    
4         stop(paste("Your outcome has", length(levels(data$obs)),         
5             "levels. The twoClassSummary() function isn't appropriate."))
6     requireNamespaceQuietStop("pROC")                                    
```

この基準を使ってブースティング木を再構築するとき、次のコードを用いてチューニングパラメータとROC曲線の下部面積の関係を見ることが出来ます：

```r
fitControl <- trainControl(method = "repeatedcv",
                           number = 10,
                           repeats = 10,
                           ## Estimate class probabilities
                           classProbs = TRUE,
                           ## Evaluate performance using 
                           ## the following function
                           summaryFunction = twoClassSummary)

set.seed(825)
gbmFit3 <- train(Class ~ ., data = training,
                 method = "gbm",
                 trControl = fitControl,
                 verbose = FALSE,
                 tuneGrid = gbmGrid,
                 ## Specify which metric to optimize
                 metric = "ROC")
gbmFit3

Stochastic Gradient Boosting 

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

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 142, 142, 140, 142, 142, 141, ... 
Resampling results across tuning parameters:

  interaction.depth  n.trees  ROC   Sens  Spec  ROC SD  Sens SD  Spec SD
  1                    50     0.86  0.80  0.70  0.096   0.15     0.16   
  1                   100     0.88  0.82  0.73  0.087   0.14     0.15   
  1                   150     0.88  0.83  0.75  0.092   0.13     0.16   
  1                   200     0.88  0.84  0.76  0.093   0.13     0.16   
  1                   250     0.88  0.83  0.77  0.086   0.13     0.16   
  1                   300     0.88  0.84  0.77  0.082   0.13     0.16   
  :                   :        :     :      :     :       :        :
  9                  1250     0.89  0.88  0.76  0.073   0.11     0.15   
  9                  1300     0.89  0.87  0.77  0.072   0.11     0.15   
  9                  1350     0.89  0.87  0.77  0.071   0.11     0.15   
  9                  1400     0.89  0.87  0.77  0.071   0.11     0.15   
  9                  1450     0.89  0.87  0.76  0.070   0.12     0.15   
  9                  1500     0.89  0.88  0.77  0.071   0.11     0.15   

Tuning parameter 'shrinkage' was held constant at a value of 0.1
Tuning parameter 'n.minobsinnode' was held constant at a value of 20
ROC was used to select the optimal model using  the largest value.
The final values used for the model were n.trees = 1150, interaction.depth = 5, shrinkage = 0.1 and n.minobsinnode = 20. 
```

このケースでは、付加的なチューニングパラメータによるROC曲線の下部面積の平均は、100リサンプルについて0.896でした。
In this case, the average area under the ROC curve associated with the optimal tuning parameters was 0.896 across the 100 resamples.

## 最終的なモデルの選択
チューニングプロセスをカスタマイズする別の手法は、与えられたパフォーマンス数により、「最適」なパラメータ値を選択するアルゴリズムを修正することです。デフォルトでは、train 関数は最大のパフォーマンス数（回帰モデルでは平均二乗誤差が最小）となるようにモデルを選択します。モデル選択の他の方法を使用可能です。Breiman ら（1984）は単一木モデルについての「one standard error rule」を提案しました。このケースでは、最適なパフォーマンス値のモデルがリサンプリングにより同定されかつ、パフォーマンスの標準誤差を推定出来ます。（明示的に）最高のモデルの標準誤差を持つ単純なモデルが最終的なモデルとなります。このような単純な木が意味をなすのは、このようなモデルがオーバーフィットから始まり、トレーニングデータにより特異的になるからです。

train では最終的なモデル選択についての別のルールを指定することもできます。selectionFunction 属性により、最終的なモデル決定をアルゴリズム的に行うことが出来ます。パッケージには3つの関数があり：best は最大／最小値を選択し、oneSE は Breiman ら（1984）の手法を踏襲して最適値の許容誤差のパーセントについての複雑さが一番ないモデルを選択します。より詳細は ?best を参照のこと。 

ユーザ定義関数も可能であり、属性は以下のようになります：

* x チューニングパラメータと関連するパフォーマンス計量値を含むデータフレームです。各行が異なるチューニングパラメータの組み合わせの値となります。
* metric （train の計量属性から直接呼びだされた）最適化されたパフォーマンス計量を示す文字列。
* maximize は（train から直接呼び出された）パフォーマンス計量の最大値でよりよい値を示すかどうかの論理値です。

この関数は x で選択された行が示す1つの整数値を出力します。

例として、正確度に基いてブースティング木モデルを選択した以前のものでは： n.trees = 1150, iteraction.depth = 5, shrinkage = 0.1, n.minobsinnode = 20 でした。しかし、このプロットのスケールは狭く、正確度は0.86から0.896となっています。より複雑度の低いモデル（例えば、より少ないか浅い木）でも許容できる正確度が出るでしょう。

tolence 関数は、(x - x_best) / x_best * 100 に基づくより複雑度の少ないモデルを見つけます。これはパーセントとなります。例えば、2% のパフォーマンスロスに基づくパラメータ値選択では：

```r
whichTwoPct <- tolerance(gbmFit3$results, metric = "ROC",
                         tol = 2, maximize = TRUE)
cat("best model within 2 pct of best:\n")
best model within 2 pct of best:
gbmFit3$results[whichTwoPct,1:6]
   shrinkage interaction.depth n.minobsinnode n.trees       ROC      Sens
31       0.1                 5             20      50 0.8825918 0.8318056
```

0.883のROC曲線の下部面積であるより複雑度の少ないモデルを示しています（「最適選択」での0.896と比べてみましょう）。

これらの関数のメインの話題は、単純から複雑までのモデルの並びに関するものです。いくつかのケースでは、これは容易（例 単純な木、部分最小二乗）ですが、このモデルの場合は、一つの課題となります。例えば、50のイテレーションと深さ8よりも複雑な100のイテレーションと深さ2の木を用いたブースティング木が存在するでしょうか？このパッケージでは並べ替を選択できます。ブースティング木のケースでは、木の深さの増加よりもイテレーションの数が増えた方が複雑度が増すとみなしており、イテレーションの数で並べてから深さで並べています。特定のモデルでのより詳細は ?best を参照のこと。

# 予測の抽出とクラス確率
言及済みの通り、train 関数から出力されるオブジェクトは、サブオブジェクトの finalModel に「最適化された」モデルを含みます。予測は通常これらのオブジェクトによりなされます。pls あるいは gbm オブジェクトのようないくつかのケースでは、追加のパラメータが最適化に必要です。この場合、新しいサンプルで予測するために、 train オブジェクトはパラメータの最適値を使用します。例えば、predict.gbm を用いて予測する場合、ユーザは木の数（デフォルト値はありません）を指定する必要があります。また、二値判別では、この関数の予測ではクラスの1つの確率を得て、判別の factor ベクトルに置換するために別のステップを必要とします。predict.train は自動的にこれらを行います（そして別のモデルでも）。

また、Rでの予測モデルにはとても少ない標準的な文法しかありません。例えば、クラス確率を得るためには、多くの predict メソッドではクラス判別あるいは確率を指定するだけです。異なるパッケジでは、"prob", "posterior", "response", "probability", "raw"のような異なる値を用います。別の場合は完全に異なる文法となります。

predict.train では、"class"と"prob"に共通化されています（以下のコードでは各モデルが適切な選択をしています）。例えば：

```r
predict(gbmFit3, newdata = head(testing))

[1] R R R R M M
Levels: M R

predict(gbmFit3, newdata = head(testing), type = "prob")

             M            R
1 1.982479e-05 9.999802e-01
2 8.774626e-07 9.999991e-01
3 1.789676e-11 1.000000e+00
4 6.024225e-04 9.993976e-01
5 9.999999e-01 1.179912e-07
6 9.995127e-01 4.872602e-04
```

# リサンプリング分布の探索と比較
## Within-Model
特定のモデルについてのチューニングパラメータとリサンプリング結果間の関係の探索には lattice 関数が使われます：

* xyplot と stripplot は（数値）チューニングパラメータに対するリサンプリング統計量をプロットします。
* histogram と densityplot はチューニングパラメータの分布を見るために使います。

例えば、以下の文では密度プロットを作成します：（訳注：原文に作図のスクリプトがないです）

（図略）

もし、複数のチューニングパラメータのリサンプリング結果のプロットをしたいのならば、resamples = "all" オプションを control オブジェクトに指定します。

## モデル間 Between-Models
リサンプリング分布による（train、sbf あるいは rfe により生成される）モデル間の違いを特徴づける関数も caret パッケージにはあります。これらの関数は Hothorn ら（2005）と Eugster ら（2008）の研究に基づくものです。

まず最初に、サポートベクターマシンモデルを Sonar データにフィッティングさせます。preProc 属性を用いてデータの正規化を行います。ブースティング木モデルを使うための乱数のシード値を同じになるよう設定します。これによりリサンプリングセットが同じになり、モデル間でのリサンプリングプロファイルの比較が容易になります。

```r
set.seed(825)
svmFit <- train(Class ~ ., data = training,
                 method = "svmRadial",
                 trControl = fitControl,
                 preProc = c("center", "scale"),
                 tuneLength = 8,
                 metric = "ROC")
svmFit

Support Vector Machines with Radial Basis Function Kernel 

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

Pre-processing: centered (60), scaled (60) 
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 142, 142, 140, 142, 142, 141, ... 
Resampling results across tuning parameters:

  C      ROC        Sens       Spec       ROC SD      Sens SD    Spec SD  
   0.25  0.8672371  0.7448611  0.7485714  0.08273960  0.1364068  0.1711608
   0.50  0.9030134  0.8334722  0.7766071  0.06511576  0.1457414  0.1441030
   1.00  0.9221577  0.8709722  0.7785714  0.06134606  0.1172593  0.1523708
   2.00  0.9318601  0.8890278  0.7692857  0.05793951  0.1141643  0.1521948
   4.00  0.9373735  0.8837500  0.8096429  0.05623538  0.1083167  0.1518036
   8.00  0.9442411  0.9026389  0.8151786  0.05584599  0.1038692  0.1567138
  16.00  0.9445164  0.9090278  0.8155357  0.05676892  0.0992626  0.1525199
  32.00  0.9445164  0.9111111  0.8142857  0.05676892  0.1004068  0.1556129

Tuning parameter 'sigma' was held constant at a value of 0.0115025
ROC was used to select the optimal model using  the largest value.
The final values used for the model were sigma = 0.0115025 and C = 16. 
```
また、正規判別分析にフィッティングさせます。

```r
set.seed(825)
rdaFit <- train(Class ~ ., data = training,
                 method = "rda",
                 trControl = fitControl,
                 tuneLength = 4,
                 metric = "ROC")
rdaFit

Regularized Discriminant Analysis 

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

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 10 times) 
Summary of sample sizes: 142, 142, 140, 142, 142, 141, ... 
Resampling results across tuning parameters:

  gamma      lambda     ROC        Sens       Spec       ROC SD      Sens SD    Spec SD  
  0.0000000  0.0000000  0.8492894  0.8215278  0.7705357  0.11348240  0.1539451  0.1748415
  0.0000000  0.3333333  0.8472148  0.8215278  0.7683929  0.11283235  0.1570403  0.1673312
  0.0000000  0.6666667  0.8385355  0.8190278  0.7512500  0.12045473  0.1605142  0.1754646
  0.0000000  1.0000000  0.8536744  0.8398611  0.7741071  0.11492188  0.1408179  0.1611321
  0.3333333  0.0000000  0.9073760  0.9008333  0.7642857  0.07117484  0.1166216  0.1476688
  0.3333333  0.3333333  0.9054142  0.8984722  0.7628571  0.07421057  0.1205595  0.1464660
  0.3333333  0.6666667  0.9060813  0.8925000  0.7644643  0.07283076  0.1201860  0.1429630
  0.3333333  1.0000000  0.9037004  0.9041667  0.7646429  0.08614906  0.1124100  0.1491529
  0.6666667  0.0000000  0.8836210  0.8805556  0.7242857  0.08504414  0.1086103  0.1574304
  0.6666667  0.3333333  0.8872024  0.8775000  0.7296429  0.08830682  0.1047636  0.1578737
  0.6666667  0.6666667  0.8844048  0.8693056  0.7258929  0.08999459  0.1174386  0.1571448
  0.6666667  1.0000000  0.8850025  0.8738889  0.7357143  0.08958058  0.1104724  0.1591939
  1.0000000  0.0000000  0.7258631  0.6601389  0.6464286  0.13223843  0.1750093  0.2033336
  1.0000000  0.3333333  0.7284226  0.6604167  0.6462500  0.12614738  0.1729815  0.2031386
  1.0000000  0.6666667  0.7274950  0.6613889  0.6430357  0.12820321  0.1721392  0.2097047
  1.0000000  1.0000000  0.7233309  0.6593056  0.6491071  0.13280992  0.1723843  0.1996953

ROC was used to select the optimal model using  the largest value.
The final values used for the model were gamma = 0.3333333 and lambda = 0. 
```

これらのモデルを与えられたとき、モデルのパフォーマンスの違いの統計量を得られるでしょうか？そのためには、resamples を用いてリサンプリング結果をまず集めます。

```r
resamps <- resamples(list(GBM = gbmFit3,
                          SVM = svmFit,
                          RDA = rdaFit))
resamps

Call:
resamples.default(x = list(GBM = gbmFit3, SVM = svmFit, RDA = rdaFit))

Models: GBM, SVM, RDA 
Number of resamples: 100 
Performance metrics: ROC, Sens, Spec 
Time estimates for: everything, final model fit 

summary(resamps)

Call:
summary.resamples(object = resamps)

Models: GBM, SVM, RDA 
Number of resamples: 100 

ROC 
      Min. 1st Qu. Median   Mean 3rd Qu. Max. NA's
GBM 0.5714  0.8464 0.9085 0.8963  0.9526    1    0
SVM 0.6786  0.9107 0.9557 0.9445  0.9844    1    0
RDA 0.6508  0.8571 0.9206 0.9074  0.9653    1    0

Sens 
     Min. 1st Qu. Median   Mean 3rd Qu. Max. NA's
GBM 0.625  0.8507 0.8750 0.8821       1    1    0
SVM 0.500  0.8750 0.8889 0.9090       1    1    0
RDA 0.500  0.8750 0.8889 0.9008       1    1    0

Spec 
      Min. 1st Qu. Median   Mean 3rd Qu. Max. NA's
GBM 0.4286  0.7143 0.7500 0.7664  0.8571    1    0
SVM 0.2857  0.7143 0.8571 0.8155  0.9062    1    0
RDA 0.2857  0.7143 0.7500 0.7643  0.8571    1    0
```

ここでは、control オブジェクトに resamples = "final" オプションが指定されていることに注意のこと。

リサンプリング分布の可視化のためにいくつかの lattice プロットがあります：density plots, box-whisker plots, scatterplot matrices と要約計量の scatterplots です。例えば：

```r
trellis.par.set(theme1)
bwplot(resamps, layout = c(3, 1))
```
（図略）

```r
trellis.par.set(caretTheme())
dotplot(resamps, metric = "ROC")
```
（図略）

```r
trellis.par.set(theme1)
xyplot(resamps, what = "BlandAltman")
```
（図略）

```r
splom(resamps)
```
（図略）

他の可視化、 densityplot.resamples と parallel.resamples も使用可能です。トレーニングデータの同じバージョンをモデルにフィットさせたので、モデル間の違いに意味があります。こうすると、within-resample 相関がある場合にはそれを減らします。差異を計算し、モデル間に差がないという帰無仮説を単純なt検定で評価します。

```r
difValues <- diff(resamps)
difValues

Call:
diff.resamples(x = resamps)

Models: GBM, SVM, RDA 
Metrics: ROC, Sens, Spec 
Number of differences: 3 
p-value adjustment: bonferroni 

summary(difValues)
Call:
summary.diff.resamples(object = difValues)

p-value adjustment: bonferroni 
Upper diagonal: estimates of the difference
Lower diagonal: p-value for H0: difference = 0

ROC 
    GBM       SVM       RDA     
GBM           -0.04818  -0.01104
SVM 4.692e-12            0.03714
RDA 0.4831    2.714e-07         

Sens 
    GBM    SVM       RDA      
GBM        -0.026944 -0.018750
SVM 0.0280            0.008194
RDA 0.5805 1.0000             

Spec 
    GBM      SVM       RDA      
GBM          -0.049107  0.002143
SVM 0.001523            0.051250
RDA 1.000000 0.011419           
trellis.par.set(theme1)
bwplot(difValues, layout = c(3, 1))
```
（図略）

```r
trellis.par.set(caretTheme())
dotplot(difValues)
```
（図略）

# パラメータチューニングなしでのモデルフィッティング

モデルのチューニング値が既知の場合は、リサンプリングやパラメータチューニングなしにトレーニングセットすべてに対して train はモデルフィッティングを行います。trainControl のオプション method = "none" を指定します。例えば：

```r
fitControl <- trainControl(method = "none", classProbs = TRUE)

set.seed(825)
gbmFit4 <- train(Class ~ ., data = training,
                 method = "gbm",
                 trControl = fitControl,
                 verbose = FALSE,
                 ## Only a single model can be passed to the
                 ## function when no resampling is used:
                 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 
```

plot.train, resamples, confusionMatrix.train といくつかの他の関数ではこの機能はありませんが、predict.train と他のものでは：

```r
predict(gbmFit4, newdata = head(testing))

[1] R R R R M M
Levels: M R

predict(gbmFit4, newdata = head(testing), type = "prob")
           M          R
1 0.07043641 0.92956359
2 0.02921858 0.97078142
3 0.01156062 0.98843938
4 0.36436834 0.63563166
5 0.92596513 0.07403487
6 0.82897570 0.17102430
```