8

モデル調整のためのバイアス/分散間の最適なトレードオフを研究したいと思います。R にキャレットを使用しています。これにより、モデルのハイパーパラメーター (mtry、ラムダなど) に対してパフォーマンス メトリック (AUC、精度など) をプロットし、最大値を自動的に選択できます。これは通常、適切なモデルを返しますが、さらに掘り下げて別のバイアス/分散のトレードオフを選択したい場合は、パフォーマンス曲線ではなく学習曲線が必要です。

簡単にするために、私のモデルがランダム フォレストであるとしましょう。これには 1 つのハイパーパラメーター「mtry」しかありません。

トレーニング セットとテスト セットの両方の学習曲線をプロットしたいと思います。このようなもの:

学習曲線

(赤い曲線はテスト セットです)

y 軸にはエラー メトリック (誤分類された例の数など) を置きます。x 軸 'mtry' またはトレーニング セットのサイズ。

質問:

  1. サイズの異なるトレーニング セット フォールドに基づいてモデルを反復的にトレーニングするキャレット機能はありますか? 手作業でコーディングする必要がある場合、どのようにすればよいですか?

  2. ハイパーパラメータを x 軸に配置したい場合は、最終モデル (CV の後に最大のパフォーマンスを持つモデル) だけでなく、caret::train によってトレーニングされたすべてのモデルが必要です。これらの「廃棄された」モデルは、トレーニング後も利用できますか?

4

3 に答える 3

4

パッケージをR使用してモデルをトレーニングしながら、学習曲線をプロットするというこの問題にどのように取り組んだかについての私のコードを次に示します。説明のために R でCaretを使用します。Motor Trend Car Road Testsまず、データセットをランダム化し、mtcarsトレーニング セットとテスト セットに分割します。トレーニング用に 21 レコード、テスト セット用に 13 レコード。応答機能はmpgこの例にあります。

# set seed for reproducibility
set.seed(7)

# randomize mtcars
mtcars <- mtcars[sample(nrow(mtcars)),]

# split iris data into training and test sets
mtcarsIndex <- createDataPartition(mtcars$mpg, p = .625, list = F)
mtcarsTrain <- mtcars[mtcarsIndex,]
mtcarsTest <- mtcars[-mtcarsIndex,]

# create empty data frame 
learnCurve <- data.frame(m = integer(21),
                     trainRMSE = integer(21),
                     cvRMSE = integer(21))

# test data response feature
testY <- mtcarsTest$mpg

# Run algorithms using 10-fold cross validation with 3 repeats
trainControl <- trainControl(method="repeatedcv", number=10, repeats=3)
metric <- "RMSE"

# loop over training examples
for (i in 3:21) {
    learnCurve$m[i] <- i
    
    # train learning algorithm with size i
    fit.lm <- train(mpg~., data=mtcarsTrain[1:i,], method="lm", metric=metric,
             preProc=c("center", "scale"), trControl=trainControl)        
    learnCurve$trainRMSE[i] <- fit.lm$results$RMSE
    
    # use trained parameters to predict on test data
    prediction <- predict(fit.lm, newdata = mtcarsTest[,-1])
    rmse <- postResample(prediction, testY)
    learnCurve$cvRMSE[i] <- rmse[1]
}

pdf("LinearRegressionLearningCurve.pdf", width = 7, height = 7, pointsize=12)

# plot learning curves of training set size vs. error measure
# for training set and test set
plot(log(learnCurve$trainRMSE),type = "o",col = "red", xlab = "Training set size",
          ylab = "Error (RMSE)", main = "Linear Model Learning Curve")
lines(log(learnCurve$cvRMSE), type = "o", col = "blue")
legend('topright', c("Train error", "Test error"), lty = c(1,1), lwd = c(2.5, 2.5),
       col = c("red", "blue"))

dev.off()

出力プロットは次のとおりです。
ここに画像の説明を入力

于 2016-11-30T09:52:14.420 に答える
4
  1. trainControl()を使用して関数とパラメーター (例: mtry) を設定すると、Caret は多くの cv モデルを繰り返しテストします tuneGrid()。これらは両方とも、制御オプションとしてtrain() 関数に渡されます。tuneGrid パラメータ (mtry、ntree など) の詳細は、モデル タイプごとに異なります。

  2. はい、最終的なtrainFitモデルには、CV のすべてのフォールドのエラー率 (指定した方法) が含まれます。

したがって、たとえば、10 倍の CV に 10 の値の mtry を持つグリッドを掛けると指定できます。これは 100 回の反復になります。お茶を飲みに行ったり、ランチを食べに行きたいと思うかもしれません。

これが複雑に聞こえる場合は...ここに非常に良い例があります.caretは、最もよく文書化されたパッケージの1つです。

于 2013-12-04T09:51:14.383 に答える